Błąd Hot Backup PostgreSQL 9.1: system bazy danych uruchamia się

16

Przez jakiś czas pracowałem nad gorącą kopią zapasową Postgres 9.1 i napotkałem spójny problem. Po ponownym uruchomieniu Postgres na serwerze podrzędnym plik dziennika pgstartup i dzienny plik dziennika w katalogu pg_log odczytują bez błędów. Jednak gdy próbuję wejść do bazy danych za pomocą polecenia psql, pojawia się błąd:

FATAL: system bazy danych uruchamia się.

Plik recovery.conf również nie przechodzi w tryb recovery.done. Dokładnie zbadałem ten błąd i konsekwentnie znajduję tę samą odpowiedź: baza danych nie została całkowicie zamknięta przed próbą ponownego uruchomienia Postgres. Jedynym sposobem, w jaki zrestartowałem Postgres, są polecenia service postgresql-9.1 restartlub /etc/init.d/postgresql-9.1 restart. Po otrzymaniu tego błędu zabijam wszystkie procesy i ponownie próbuję zrestartować bazę danych i nadal otrzymuję ten sam błąd. Brakuje mi gdzie mogę się udać i jak rozwiązać ten problem. Poniżej znajduje się dokładny proces, który wykonałem, aby zakończyć tworzenie kopii zapasowej na gorąco.

Konfiguracje serwera głównego:

pg_hba.conf, dodał wiersz:

replikacja hosta postgres Zaufanie do adresu IPAddressOfSlaveServer

postgresql.conf:

wal_level = hot_standby
max_wal_senders = 5
listen_address = '*'
port = 5432
max_wal_senders = 5
wal_keep_segments = 32

Konfiguracje serwera slave:

postgresql.conf:

hot_standby = wł

recovery.conf:

tryb czuwania = włączony
primary_conninfo = host = IPAddressOfMasterServer
port = 5432
użytkownik = postgres
restore_command = 'cp /var/lib/pgsql/9.1/data/pg_xlog/%f "% p"'

Po skonfigurowaniu obu serwerów

Przechodzę do użytkownika postgres na serwerze głównym i uruchamiam polecenia:

psql -c "Wybierz pg_start_backup ('label', true);";
rsync -a -v -e ssh /var/lib/pgsql/9.1/data slave: /var/lib/pgsql/9.1/data \
        --Exclude postmaster.pid
pgsql -c "wybierz pg_stop_backup ();";

Po zsynchronizowaniu bazy danych z serwerem slave

Ponownie uruchamiam serwer slave i uruchamianie nie kończy się niepowodzeniem. Plik pgstartup.log brzmi:

Sukces. Możesz teraz uruchomić serwer bazy danych, używając:

    /usr/pgsql-9.1/bin/postgres -D /var/lib/pgsql/9.1/data
lub
    /usr/pgsql/9.1/bin/pg_ctl -D /var/lib/pgsql/9.1/data -l start pliku dziennika

plik dziennika bieżącego dnia, postgresql-Thu.log, brzmi:

Log: zamykanie
Dziennik: system bazy danych jest zamknięty
Dziennik: system bazy danych został zamknięty podczas odzyskiwania w dniu 2012-4-10
Rejestr: przejście w tryb gotowości
Dziennik: przywrócono plik dziennika „logFileName” z archiwum
Dziennik: spójny stan odzyskiwania osiągnięty przy 0 / BF0000B0
Dziennik: ponawianie rozpoczyna się od 0 / BF000020
Dziennik: przywrócono plik dziennika „logFileName” z archiwum
Log: nieoczekiwany pageaddr 0/85000000 w pliku dziennika 0, segment 192, przesunięcie 0
Log: nieoczekiwany pageaddr 0/85000000 w pliku dziennika 0, segment 192, przesunięcie 0
Dziennik: replikacja strumieniowa pomyślnie połączona z podstawową

Badałem nieoczekiwany pageaddr iz archiwów postgres, rozumiem, że jest to całkiem normalne i jeden z oczekiwanych sposobów wykrywania końca WAL.

Wszelkie porady będą mile widziane.

Ola Ström
źródło

Odpowiedzi:

11

Komunikat „System bazy danych uruchamia się”. nie oznacza błędu. Powodem jest na poziomie FATAL, dlatego zawsze trafi on do dziennika, niezależnie od ustawienia log_min_messages:

http://www.postgresql.org/docs/9.1/interactive/runtime-config-logging.html#RUNTIME-CONFIG-LOGGING-WHEN

Czy po rsync naprawdę uruchomiłeś to, co pokazujesz ?:

pgsql -c "wybierz pg_stop_backup ();";

Ponieważ, o ile wiem, nie ma pgsqlpliku wykonywalnego, który spowodowałby, że kopia zapasowa nie została ukończona, a urządzenie podrzędne nie wyjdzie z trybu odzyskiwania. Z drugiej strony, może naprawdę uciekłeś psql, bo inaczej nie widzę, jak niewolnik zarejestrowałby takie komunikaty o sukcesie jak:

Dziennik: spójny stan odzyskiwania osiągnięty przy 0 / BF0000B0

i:

Dziennik: replikacja strumieniowa pomyślnie połączona z podstawową

Czy próbowałeś w tym momencie połączyć się z niewolnikiem? Co się stało?

Komunikat „Sukces. Możesz teraz zacząć ...”, o którym wspominasz, jest generowany przez initdb, którego nie należy uruchamiać w ramach konfigurowania urządzenia podrzędnego; więc myślę, że możesz się co do tego pomylić. Niepokoją mnie również te pozornie sprzeczne stwierdzenia:

Jedynym sposobem, w jaki zrestartowałem Postgres, jest skorzystanie z usługi restartu postgresql-9.1 lub /etc/init.d/postgresql-9.1 restart. Po otrzymaniu tego błędu zabijam wszystkie procesy i ponownie próbuję zrestartować bazę danych ...

Czy próbowałeś zatrzymać usługę za pomocą skryptu usługi? Co się stało? Może to pomóc w zrozumieniu dzienników, jeśli poprzedzasz wiersze dodatkowymi informacjami. Używamy:

log_line_prefix = '[%m] %p %q<%u %d %r> '

recovery.confSkrypt wygląda dziwnie. Czy kopiujesz z katalogu pg_xlog urządzenia nadrzędnego, aktywnego katalogu pg_xlog urządzenia podrzędnego lub katalogu archiwum?

kgrittn
źródło
8

Miałem z tym również pewne problemy, z wyjątkiem tego, że miałem 9,3, a nie 9,1. W każdym razie poprawka okazała się dość trywialna:

postgresql.confPlik był kopiowany z master do slave, a ja pozostawiając niemodyfikowana na slave. Myślałem, że wszystko, co musisz zrobić, to dodać recovery.confplik i wszystko zadziała (dobrze, ale nie mogłem zalogować się do zreplikowanego serwera podrzędnego, ale był on replikowany).

Zredagowałem postgresql.confplik slave i:

  • skomentował archive_mode=on
  • skomentował archivepolecenie; i
  • skomentował hot_standby=on

To wystarczyło: udało mi się sprawić, że baza danych będzie serwerem tylko do odczytu, gotowym do przyjmowania zapytań tylko do odczytu.

Istnieje skrypt o nazwie pg_basebackup, który utworzy katalog bootstrap dla urządzenia slave. To jest katalog danych z bazą danych. Musisz zmodyfikować postgresql.confplik, zanim będzie można go używać jako slave zgodnie z opisem, co jest dość proste jak na pg_basebackupskrypt postu .

Greg
źródło
1
Kiedy piszesz „skomentowałeś hot_standby = on” Zakładam, że masz na myśli „wcześniej usunąłeś znak -comment, aby faktycznie włączyć hot_standby” :) Jeśli nie w hot_standby, db zawsze będzie „startował” z założenia (jest ciepły tryb gotowości, gotowy do przełączenia awaryjnego, ale bez wysyłania zapytań). Zauważ, że jeśli wykonałeś zrzut bazy zapasowej bez wal_level = hot_standby na master, a następnie włączyłeś hot_stanby na slave, będziesz musiał ponownie zrzucić i ponownie zainicjować db slave, aby hot_standby zaczął działać. W przeciwnym razie wystąpią poważne błędy.
Frederik Struck-Schøning
hot_standby = włączony jest wymagany, musi tam być
Abhilash Mishra
7

Co ciekawe, rozwiązałem to w odwrotny sposób niż Paweł.

Dodałem:

hot_standby = on

lub raczej zmieniono #hot_standby = offna powyższe. (To było za pomocą 9.5)

użytkownik41734
źródło
1

Mam to w dziennikach:

MSK FATAL:  the database system is starting up

Aby naprawić nieskończony start serwera, wykonaj następujące czynności: Zatrzymaj usługę (jeśli istnieje), zabij proces „postgres” (zwykle istnieje). Uruchom to w konsoli:

pg_resetxlog.exe -D ../Data -f

Ten problem występuje, ponieważ katalog xLog zawiera dane, które nie zostaną zapisane przed zamknięciem usługi. A następnie przy uruchomieniu usługi próbuje naprawić te dane. Czasami zawiesza uruchamianie i nigdy się nie kończy. Polecenie na górze wyczyść te nieosiągnięte dane, które stosują usługę, aby rozpocząć tylko od ustalonych danych. Być może niektóre części nie naprawionych danych zostaną utracone, ale serwer bazy danych będzie działał normalnie i będą dostępne dla aplikacji.

Andrew Zolotarev
źródło