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 restart
lub /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.
źródło
Co ciekawe, rozwiązałem to w odwrotny sposób niż Paweł.
Dodałem:
hot_standby = on
lub raczej zmieniono
#hot_standby = off
na powyższe. (To było za pomocą 9.5)źródło
Mam to w dziennikach:
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:
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.
źródło