Gestire lo spazio su disco pieno in postgresql


14

Ho un'applicazione web Django con backgresql 9.3.10 backend (seduto su un sistema operativo Linux). Ho riscontrato un errore completo del disco, in modo tale che anche se provo a troncare una tabella, ottengo errori del tipo:

ERROR:  could not extend file "base/30137/33186048": No space left on device
HINT:  Check free disk space.

Non riesco facilmente ad aggiungere più spazio su disco al server, né posso eliminare elementi su questa VM. Tuttavia, ci sono diversi tavoli che sono candidati al troncamento, ma sembra che ora non riesca nemmeno a troncarli.

Qualcuno può darmi consigli su cosa posso fare qui? Questo sta colpendo duramente il mio server di produzione, e sono un po 'un DBA accidentale qui, così totalmente sconcertato.


Puoi recuperare un po 'di spazio se puoi (temporaneamente) rilasciare un indice ... troncare le tabelle e poi ricrearlo
joanolo

Risposte:


9

Poiché PostgreSQL deve scrivere WAL prima di apportare modifiche alle tabelle, ha bisogno di spazio libero su disco per eliminare elementi e liberare più spazio su disco.

Se si lascia riempire il disco, non è possibile ripristinare da PostgreSQL. Anche TRUNCATEdeve ancora scrivere a WAL.

Quindi è necessario liberare spazio sul volume o espandere il volume. Se i file di log di PostgreSQL si trovano nella pg_logdirectory dei dati, è possibile rimuoverne alcuni in modo sicuro e riavviare Pg.

Evitare Non eliminare pg_xlogo pg_clog. Questi non sono registri degli errori del server, sono parti critiche del database, del registro delle transazioni e del registro di commit.


Perché TRUNCATEdeve scrivere a Wal, e come appare quella voce in WAL?
Evan Carroll

"Il troncamento non registra i dati completi, ma solo il fatto che si è verificato un troncamento. Per poterlo ripristinare, il file sottostante viene mantenuto fino al commit della transazione." [fonte] ( postgresql.org/message-id/… Quindi l'entrata di truncate nel muro è super piccola. solo byte. Se quello fosse l'intero carico di spazio necessario, probabilmente potresti ottenerlo rm -rf /tmp/*o eliminare il tuo vimrc.
Evan Carroll

@EvanCarroll rm -rf /tmp/*... che può eliminare anche le cose che potresti desiderare, come i socket delle applicazioni, ecc. Meglio essere più selettivi. Per quanto riguarda lo spazio necessario, hai ragione, è minimo - una tabella vuota da 8k + alcuni kb di voci WAL per il troncamento, l'allocazione xid, il record di commit, ecc.
Craig Ringer
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.