Sta cercando un record di checkpoint nel registro delle transazioni che probabilmente non esiste o è danneggiato. Puoi determinare se questo è il caso eseguendo:
# Postgres >= 10
pg_resetwal DATADIR
# Postgres < 10
pg_resetxlog DATADIR
Se il registro delle transazioni è danneggiato, vedrai un messaggio del tipo:
Il server del database non è stato arrestato correttamente. La reimpostazione del registro delle transazioni potrebbe causare la perdita di dati. Se vuoi procedere comunque, usa -f
per forzare il ripristino.
Puoi quindi seguire le istruzioni ed eseguire con -f
per forzare l'aggiornamento:
# Postgres >= 10
pg_resetwal -f DATADIR
# Postgres < 10
pg_resetxlog -f DATADIR
Ciò dovrebbe ripristinare il registro delle transazioni, tuttavia potrebbe lasciare il database in uno stato indeterminato come spiegato nella documentazione di PostgreSQL su pg_resetwal
:
Se pg_resetwal
si lamenta di non poter determinare dati validi per pg_control
, puoi forzarlo a procedere comunque specificando il -f
opzione (forza). In questo caso i dati mancanti verranno sostituiti con valori plausibili. È prevedibile che la maggior parte dei campi corrisponda, ma potrebbe essere necessaria l'assistenza manuale per i campi OID successivi, ID transazione ed epoca successivi, ID multitransazione e offset successivi e WAL posizione iniziale. Questi campi possono essere impostati utilizzando le opzioni discusse di seguito. Se non sei in grado di determinare i valori corretti per tutti questi campi, -f
può ancora essere utilizzato, ma il database recuperato deve essere trattato con ancora più sospetto del solito:un dump e un ricaricamento immediati è d'obbligo. Non eseguire alcuna operazione di modifica dei dati nel database prima di eseguire il dump, poiché è probabile che tale azione peggiori la corruzione.