PostgreSQL: espace disque non libéré après TRUNCATE


12

J'ai TRUNCATEune énorme table (~ 120 Go) appelée files:

TRUNCATE files;
VACUUM FULL files;

La taille de la table est 0, mais aucun espace disque n'a été libéré. Des idées sur la façon de récupérer mon espace disque perdu?

MISE À JOUR: L'espace disque a été libéré après environ 12 heures, sans aucune action de mon côté. J'utilise le serveur Ubuntu 8.04.


J'étais sur le point de suggérer de "passer l'aspirateur!", Mais étant donné que vous venez de le faire, je vous conseille de prendre cela sur l'un des pg-hackers ou pg-performance lists (et de créer un lien vers le fil ou de répondre une fois que vous avez un).
Denis de Bernardy

Ce lien ( postgresql.1045698.n5.nabble.com/… ) vous donne-t-il des conseils? Peut-être qu'il y a encore quelque chose accédant à la table ou similaire.
DrColossos

@DrColossos: J'ai lu un commentaire dans la source (un commentaire que je ne trouve pas en ce moment) qui disait que PostgreSQL a notifié toutes les connexions qu'une troncature était sur le point d'avoir lieu, et il a verrouillé les ressources nécessaires. (Il y en a plusieurs, y compris la table elle-même, les index, les séquences et les tables de toast.) Je suis presque sûr d'avoir trouvé le commentaire plus tôt en traçant via ExecuteTruncate (), mais je ne suis pas 100% positif à ce sujet.
Mike Sherrill 'Cat Recall'

Réponses:


12

Selon les commentaires de la source , truncatecrée un nouveau fichier de stockage vide et supprime l'ancien fichier de stockage au moment de la validation. (Les documents suggèrent que "fichier de stockage" n'est qu'un fichier en ce qui concerne le système d'exploitation, mais je peux mal comprendre la terminologie.)

Créez un nouveau fichier de stockage vide pour la relation et affectez-le comme valeur relfilenode. L'ancien fichier de stockage doit être supprimé lors de la validation.

Puisqu'il semble supprimer un fichier, je peux imaginer des cas dans lesquels le système d'exploitation sous-jacent pourrait ne pas libérer immédiatement cet espace. J'imagine que dans certains cas, le fichier de stockage peut se retrouver dans la corbeille de recyclage sous Windows, par exemple. Mais dans mon cas, tronquer une table sous PostgreSQL 9. quelque chose a immédiatement augmenté l'espace libre sous Windows.

La troncature est également enregistrée dans le journal WAL. Je ne sais pas quel effet cela pourrait avoir.


2
Il est concevable qu'un autre processus d'arrière-plan ait toujours un descripteur de fichier pour ouvrir le fichier. Si cela se reproduit, j'essayerais de mettre fin à tous les autres processus d'arrière-plan, juste pour voir si cela fait une différence.
Peter Eisentraut

Je suis presque sûr d'avoir lu que ExecuteTruncate () est censé s'assurer que cela ne peut pas se produire. Tout cela fait partie du verrouillage des ressources nécessaires pour éventuellement supprimer l'ancien fichier de stockage. Mais je ne sais pas où j'ai trouvé ça dans la source. Je suis en train de le parcourir en ligne; il est facile de se perdre de cette façon.
Mike Sherrill 'Cat Recall'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.