Come recuperare spazio su disco su PostgreSQL?


25

Ho un'installazione locale del database 9.1 con poche tabelle che avevano cca. 300 milioni di record e il database è cresciuto fino a circa 20 GB. Successivamente ho dato il delete fromcomando di eliminare tutti i record da esso (avrei dovuto usarlo truncate, ma non lo sapevo). Quindi ho fatto il pieno vuoto sul mio db per recuperare spazio su disco, ma non mi è stato di aiuto. Il mio problema sembra identico a questo , ma non è stata fornita alcuna soluzione. Ho già controllato questo thread e la documentazione sul "recupero dello spazio su disco" , ma non riesco ancora a trovare una soluzione. Uso questo codice per ottenere la dimensione di tutte le tabelle

 SELECT nspname || '.' || relname AS "relation",
 pg_size_pretty(pg_total_relation_size(C.oid)) AS "total_size"
 FROM pg_class C
 LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
 WHERE nspname NOT IN ('pg_catalog', 'information_schema')
 AND C.relkind <> 'i'
 AND nspname !~ '^pg_toast'
 ORDER BY pg_total_relation_size(C.oid) DESC
 LIMIT 15;

Per un totale di meno di 1 GB, tuttavia

SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) AS size FROM pg_database 

mostra ancora circa 20 GB. Qualche consiglio molto apprezzato.


Bene, la tua query sulle dimensioni esclude: indici, tabelle in pg_cataloge tabelle in information_schema. Quindi prova a vedere se è uno di quelli rimuovendo quelle restrizioni nella WHEREclausola. Mostra la versione esatta di PostgreSQL ( SELECT version()) e cosa stai facendo esattamente per "svuotare l'intero database", ovvero il comando esatto. Se possibile, esegui VACUUM FULL VERBOSE;(senza argomenti) e incolla l'output da qualche parte, quindi collega ad esso qui.
Craig Ringer,

Prova a eliminare il database. Potresti anche provare a scaricare il database e ripristinarlo eliminerebbe la spazzatura.
jb.

1
@jb Funzionerebbe, ma non dovrebbe essere necessario. Meglio imparare qual è il problema.
Craig Ringer,

Risposte:


22

Anche se non lo hai dichiarato, presumo dai tuoi riferimenti ai documenti che hai seguito che hai eseguito un VUOTO COMPLETO sul database e / o sulle tabelle interessate. Inoltre non hai specificato quale versione di postgresql stai usando - suppongo che sia> 9.0 (VACUUM FULL si è comportato diversamente prima di questo).

VACUUM FULL riscriverà le tabelle interessate in nuovi file, quindi eliminerà i vecchi file. Tuttavia, se un processo ha ancora il vecchio file aperto, il sistema operativo non eliminerà effettivamente il file, fino a quando l'ultimo processo non lo ha chiuso.

Se possibile, il riavvio del database garantirebbe la chiusura di tutti i file aperti.

Se ciò non è pratico, potresti essere in grado di verificare se questo è il tuo problema e scoprire quale processo ha i file aperti.

Se si utilizza Linux (o la maggior parte degli altri sistemi simili a Unix) è possibile utilizzare il comando 'lsof' per ottenere un elenco di tutti i file aperti in tutti i processi. I file aperti ma che sono stati successivamente eliminati avranno "(eliminato)" aggiunto al nome file. Quindi, puoi grep l'output di lsof, cercando i file eliminati, in questo modo:

sudo lsof -u postgres | grep 'deleted'

Se identifica i processi che hanno ancora i vecchi file aperti, è possibile utilizzare pg_terminate_backend per terminare quel processo:

SELECT pg_terminate_backend(xxx);

dove xxx è il PID del processo, presente nell'output lsof.

Se si utilizza Windows, si potrebbe applicare lo stesso principio, poiché postgres apre i file utilizzando il flag FILE_SHARE_DELETE, che consente di eliminare i file aperti in un altro processo. Il comando ' handle ' è l'equivalente approssimativo di lsof, anche se non sono sicuro che si possa dire se i file vengono eliminati o meno, quindi potrebbe essere necessario un lavoro aggiuntivo.

È un'altra domanda sul motivo per cui tali processi sarebbero appesi a vecchi handle di file. Tuttavia, nel thread che hai citato nella tua domanda, Tom Lane sembra implicare che ciò possa accadere.


Ho dovuto recuperare urgentemente lo spazio su disco, quindi ho lasciato cadere il database e ripristinato dal backup. Tuttavia, il "come" risolvere questo problema è ancora molto prezioso per i casi futuri. Il mio database è 9.1, vinci 8 64 bit, la denominazione dei file (nel caso di file aperti) si applica allo stesso modo di Linux?

@Arco OK, non mi rendevo conto che stavi usando Windows. Ho aggiunto alcune informazioni alla risposta su come questo si applica a Windows. Se ritieni che possa essere una risposta utile, considera l'upgrade in quanto rende più facile per gli altri trovarla.
Dannico
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.