Той търси запис на контролна точка в регистъра на транзакциите, който вероятно не съществува или е повреден. Можете да определите дали това е така, като изпълните:
# Postgres >= 10
pg_resetwal DATADIR
# Postgres < 10
pg_resetxlog DATADIR
Ако регистърът на транзакциите е повреден, ще видите съобщение като:
Сървърът на базата данни не беше изключен чисто. Нулирането на дневника на транзакциите може да доведе до загуба на данни. Ако все пак искате да продължите, използвайте
-f
за принудително нулиране.
След това можете да следвате инструкциите и да стартирате с -f
за принудително актуализиране:
# Postgres >= 10
pg_resetwal -f DATADIR
# Postgres < 10
pg_resetxlog -f DATADIR
Това трябва да нулира регистъра на транзакциите, но може да остави вашата база данни в неопределено състояние, както е обяснено в документацията на PostgreSQL на pg_resetwal
:
Ако
pg_resetwal
оплаква, че не може да определи валидни данни заpg_control
, можете да го принудите да продължи така или иначе, като посочите-f
(силова) опция. В този случай липсващите данни ще бъдат заменени с правдоподобни стойности. Повечето от полетата могат да се очакват да съвпадат, но може да е необходима ръчна помощ за полетата за следващия OID, следващия идентификатор на транзакция и епоха, следващия идентификатор на мултитранзакция и изместване и WAL начално местоположение. Тези полета могат да бъдат зададени с помощта на опциите, разгледани по-долу. Ако не можете да определите правилните стойности за всички тези полета,-f
все още може да се използва, но възстановената база данни трябва да се третира с още по-голямо подозрение от обикновено:незабавното изхвърляне и презареждане е наложително. Не изпълнявайте никакви операции за промяна на данни в базата данни, преди да ги изхвърлите, тъй като всяко подобно действие може да влоши повредата.