2016-04-27 15 views
5

pg_xlog Usando Debian Wheezy, PostgreSQL 9.3Postgres non si avvia dopo l'eliminazione di file

mio database è andato giù perché la partizione in cui mantiene i file WAL ottenuto pieno. Quindi, ho eliminato tutto all'interno di ./pg_xlog/, perché non sapevo cosa fossero (sì, incredibilmente stupido da parte mia). Ora il servizio Postgres non si avvia, anche se il problema, secondo syslog:

00000: could not open tablespace directory "pg_tblspc/16386/PG_9.3_201306121": File or directory not found 
LOCAL: RelationCacheInitFileRemoveInDir, relcache.c:4895 
00000: Primary checkpoint record is invalid 
LOCAL: ReadCheckpointRecord, xlog.c:6543 
00000: Secondary checkpoint record is invalid 
LOCAL: ReadCheckpointRecord, xlog.c:6547 
PANIC: XX000: could not locate a valid checkpoint record 
LOCAL: StartupXLOG, xlog.c:5228 

io non sono del tutto sicuro se il problema è che non riesce a trovare il pg_tblspc proprio o la totale mancanza di checkpoint WAL File. Il percorso effettivo in cui sono memorizzati i database è /dados/PG_9.3_201306121. Cosa posso fare per far ripartire il servizio?

EDIT1: Ok, sono riuscito a rimettere online la cosa. Alcuni database sono corrotti. Sono riuscito a DROPDB due di loro (non riuscivo nemmeno a connettersi a loro senza costringere un riavvio del servizio). Ho provato a farlo con un altro che è stato corrotto, ma l'errore era di nuovo collegato a xlog. Ho provato a fare un ripristino pulito su di esso, ma il ripristino era incompleto. Quindi, ho creato un nuovo database e ho provato a ripristinare un backup precedente di questo database. Inoltre è venuto incompleto.

Ora non riesco a eliminare alcun database, né crearne di nuovi, ottengo sempre un errore xlog flush request not satisfied. Ho provato a eseguire pg_resetxlog, ma non sembra fare nulla. Un'altra cosa che l'errore mostra è cannot write to block 1 of pg_tblspc/16385/PG_9.3_201306121/36596452/11773, write error may be permanent.

EDIT2: Parte del problema precedente era con quel file 11773. L'ho rinominato in 11773.corrupt e ora il database mi consente di creare e rilasciare nuovamente.

+0

Nonono, non continuare ad usarlo! Eseguire il backup, chiuderlo, rinominare la vecchia directory dei dati, 'initdb' uno nuovo (o usare il wrapper del pacchetto, comunque lo si è configurato per la prima volta) e quindi ripristinare i dump nella nuova istanza di PostgreSQL. –

risposta

6

Postgres non si avvia dopo l'eliminazione di file

Um, si pg_xlog. Non farlo.

Cosa posso fare per riavviare il servizio?

Bene, hai danneggiato il tuo database. Ripristina da backup. Hai dei backup, giusto? Preferibilmente un pratico archivio PITR come da PgBarman in cui è possibile ripristinare fino a 5 minuti fa. No?

OK, innanzitutto archiviare la copia danneggiata. https://wiki.postgresql.org/wiki/Corruption

Ora. Se sei fortunato, lo pg_resetxlog ti consente di eseguire correttamente il pg_dump del database, quindi puoi spostare il datadir della vecchia installazione danneggiata a parte, initdb uno nuovo e ripristinare il database.

Se sei sfortunato, il numero pg_dump non avrà esito positivo, oppure avrai problemi di ripristino dovuti a cose come chiavi primarie duplicate. In quest'ultimo caso potrebbe essere necessario riparare la discarica a mano. Se pg_dump non riesce, l'azione appropriata dipenderà dal motivo per cui non riesce.

Quindi sì. Non eliminare pg_xlog.

Ci sono discussioni all'interno della comunità PostgreSQL sulla ridenominazione di pg_xlog in qualcosa che rende più ovvio che si tratta di un componente importante del database, e si spera che venga completato nella versione 9.7.

+0

Ok, ho i backup, ma ora alcuni database sono corrotti. Beh, questo non sarebbe un problema, ma ora non posso DROP o CREATE database, ottengo sempre un errore "xlog flush request not satisfied" – Arthur

+0

Dovrai initdb, –