web-dev-qa-db-fra.com

Récupérer l'espace disque de la colonne déposée sans temps d'arrêt

J'ai une table fortement utilisée (avec environ 5 millions de lignes) dans une base de données PostgreSQL dans laquelle je souhaite déposer une colonne et récupérer l'espace utilisé la colonne.

Les docs suggèrent de faire une réécriture de table ALTER TABLE Pour forcer l'espace en arrière, mais ce n'est pas sûr de fonctionner pendant que la table est utilisée et causerait des temps d'arrêt. Existe-t-il des options pratiques qui ne nécessitent aucun temps d'arrêt? J'ai essayé d'exécuter l'outil pgcompact, mais cela n'a rien changé.

9
viblo

ALTER TABLE .. DROP COLUMN ... marque la colonne comme supprimée dans la table du système pg_attribute . La table elle-même n'est pas manipulée autrement tant que des lignes ne sont pas réécrites d'une manière ou d'une autre. La chute elle-même est très rapide, mais elle prend une brève ACCESS EXCLUSIVE serrure. Je n'appellerais pas que "temps d'arrêt", cependant.

Récupérer réellement l'espace disque est la partie délicate. Vous pouvez utiliser l'outil communautaire pg_repack au lieu de VACUUM FULL ou CLUSTER (qui verrouille la table exclusivement). Il évite les verrous exclusifs, mais il a besoin d'espace libre sur le disque à utiliser. Plus de détails:

Ou, si les lignes de votre table sont mises à jour éventuellement, vous pouvez simplement l'attendre. Chaque version de la nouvelle ligne est écrite sans la colonne supprimée. Lorsque la version ancienne est écrasée ou supprimée par VACUUM vous regagnez l'espace.

12