Den letar efter en kontrollpunktspost i transaktionsloggen som förmodligen inte finns eller är skadad. Du kan avgöra om så är fallet genom att köra:
# Postgres >= 10
pg_resetwal DATADIR
# Postgres < 10
pg_resetxlog DATADIR
Om transaktionsloggen är korrupt kommer du att se ett meddelande som:
Databasservern stängdes inte av rent. Att återställa transaktionsloggen kan göra att data går förlorade. Om du ändå vill fortsätta, använd
-f
för att tvinga fram återställning.
Du kan sedan följa instruktionerna och köra med -f
för att tvinga fram uppdateringen:
# Postgres >= 10
pg_resetwal -f DATADIR
# Postgres < 10
pg_resetxlog -f DATADIR
Det bör återställa transaktionsloggen, men det kan lämna din databas i ett obestämt tillstånd som förklaras i PostgreSQL-dokumentationen på pg_resetwal
:
Om
pg_resetwal
klagar på att den inte kan fastställa giltiga data förpg_control
, kan du tvinga den att fortsätta ändå genom att ange-f
(tvinga) alternativ. I det här fallet kommer rimliga värden att ersättas med de data som saknas. De flesta av fälten kan förväntas matcha, men manuell hjälp kan behövas för nästa OID, nästa transaktions-ID och epok, nästa multitransaktions-ID och offset, och WAL-startplatsfält. Dessa fält kan ställas in med hjälp av alternativen som diskuteras nedan. Om du inte kan fastställa korrekta värden för alla dessa fält,-f
kan fortfarande användas, men den återställda databasen måste behandlas med ännu mer misstänksamhet än vanligt:en omedelbar dumpning och laddning är absolut nödvändig. Utför inga datamodifierande operationer i databasen innan du dumpar, eftersom en sådan åtgärd sannolikt kommer att förvärra korruptionen.