PostgreSQL: espacio en disco no liberado después de TRUNCATE

12

Tengo TRUNCATEuna tabla enorme (~ 120Gb) llamada files:

TRUNCATE files;
VACUUM FULL files;

El tamaño de la tabla es 0, pero no se liberó espacio en disco. ¿Alguna idea de cómo recuperar mi espacio en disco perdido?

ACTUALIZACIÓN: El espacio en disco se liberó después de ~ 12 horas, sin ninguna acción de mi parte. Yo uso el servidor Ubuntu 8.04.

Adam Matan
fuente
Estaba a punto de sugerir "¡aspíralo!", Pero teniendo en cuenta que acabas de hacerlo, te aconsejaría llevar esto a cualquiera de los pg-hackers o pg-performance lists (y volver a enlazar al hilo o responder una vez que hayas obtenido) uno).
Denis de Bernardy
¿Este enlace ( postgresql.1045698.n5.nabble.com/… ) le da algún consejo? Quizás todavía haya algo accediendo a la mesa o similar.
DrColossos
@DrColossos: leí un comentario en la fuente (un comentario que no puedo encontrar en este momento) que decía que PostgreSQL notificó a todas las conexiones que estaba a punto de producirse un truncamiento, y bloqueó los recursos necesarios. (Hay varias, incluida la tabla en sí, los índices, las secuencias y las tablas de tostadas). Estoy bastante seguro de que encontré el comentario anteriormente al rastrear ExecuteTruncate (), pero no estoy 100% positivo al respecto.
Mike Sherrill 'Cat Recall'

Respuestas:

12

Según los comentarios en la fuente , truncatecrea un nuevo archivo de almacenamiento vacío y elimina el archivo de almacenamiento anterior en el momento de la confirmación. (Los documentos sugieren que "archivo de almacenamiento" es solo un archivo en lo que respecta al sistema operativo, pero podría estar malinterpretando la terminología).

Cree un nuevo archivo de almacenamiento vacío para la relación y asígnelo como el valor de relfilenode. El antiguo archivo de almacenamiento está programado para su eliminación en la confirmación.

Como parece estar eliminando un archivo, puedo imaginar algunos casos en los que el sistema operativo subyacente podría no liberar ese espacio de inmediato. Me imagino que, en algunos casos, el archivo de almacenamiento podría terminar en la Papelera de reciclaje en Windows, por ejemplo. Pero en mi caso, truncar una tabla en PostgreSQL 9. algo aumentó inmediatamente el espacio libre en Windows.

El truncamiento también se registra en el registro WAL. No sé cuánto efecto podría tener eso.

Mike Sherrill 'Retiro del gato'
fuente
2
Es concebible que otro proceso de fondo todavía tenga un descriptor de archivo abierto. Si esto sucede nuevamente, trataría de terminar todos los demás procesos de back-end, solo para ver si hace la diferencia.
Peter Eisentraut
Estoy bastante seguro de que leí que ExecuteTruncate () debe asegurarse de que eso no pueda suceder. Todo es parte del bloqueo de los recursos necesarios para eventualmente eliminar el antiguo archivo de almacenamiento. Pero no sé dónde encontré eso en la fuente. Solo estoy navegando en línea; Es fácil perderse de esa manera.
Mike Sherrill 'Cat Recall'