Szuka rekordu punktu kontrolnego w dzienniku transakcji, który prawdopodobnie nie istnieje lub jest uszkodzony. Możesz to sprawdzić, uruchamiając:
# Postgres >= 10
pg_resetwal DATADIR
# Postgres < 10
pg_resetxlog DATADIR
Jeśli dziennik transakcji jest uszkodzony, zobaczysz komunikat taki jak:
Serwer bazy danych nie został poprawnie zamknięty. Zresetowanie dziennika transakcji może spowodować utratę danych. Jeśli mimo to chcesz kontynuować, użyj -f
aby wymusić resetowanie.
Następnie możesz postępować zgodnie z instrukcjami i uruchomić z -f
aby wymusić aktualizację:
# Postgres >= 10
pg_resetwal -f DATADIR
# Postgres < 10
pg_resetxlog -f DATADIR
To powinno zresetować dziennik transakcji, jednak może pozostawić bazę danych w nieokreślonym stanie, jak wyjaśniono w dokumentacji PostgreSQL na pg_resetwal
:
Jeśli pg_resetwal
skarży się, że nie może określić prawidłowych danych dla pg_control
, możesz wymusić kontynuację mimo to, określając -f
(wymuszenie) opcja. W takim przypadku brakujące dane zostaną zastąpione wartościami prawdopodobnymi. Można oczekiwać, że większość pól będzie pasować, ale pomoc ręczna może być potrzebna dla następnego OID, następnego identyfikatora transakcji i epoki, następnego identyfikatora i przesunięcia wielu transakcji oraz pól lokalizacji początkowej WAL. Pola te można ustawić za pomocą opcji omówionych poniżej. Jeśli nie jesteś w stanie określić poprawnych wartości dla wszystkich tych pól, -f
nadal może być używany, ale odzyskana baza danych musi być traktowana z jeszcze większą podejrzliwością niż zwykle:konieczne jest natychmiastowe zrzuty i ponowne załadowanie. Nie wykonuj żadnych operacji modyfikacji danych w bazie danych przed wykonaniem zrzutu, ponieważ każde takie działanie może pogorszyć uszkodzenie.