Des charges de travail UPDATE intensives provoquent un gonflement des tables : les tuples morts s'accumulent et augmentent la taille des tables, même après l'exécution de VACUUM. L'extension pg_repack permet de récupérer cet espace dans ApsaraDB RDS for PostgreSQL sans maintenir de verrou exclusif sur la table pendant toute la durée de l'opération, ce qui la rend moins perturbatrice que CLUSTER ou VACUUM FULL.
Prérequis
Avant de commencer, assurez-vous que :
L'instance exécute PostgreSQL 10 ou une version ultérieure
La version mineure du moteur est 20240229 ou ultérieure (pour PostgreSQL 17, la version 20241030 ou ultérieure est requise)
Pour mettre à jour la version mineure du moteur, consultez la rubrique Mettre à jour la version mineure du moteur d'une instance ApsaraDB RDS for PostgreSQL.
Si la version mineure du moteur est antérieure à 20240229, l'exécution de n'importe quelle fonction pg_repack renvoie l'erreur suivante : ERROR: must be superuser to use xxx function.
Limitations
Impossible de réorganiser les tables temporaires ou les index GiST
Pendant une réorganisation complète de la table, les instructions DDL sur cette table sont bloquées. pg_repack maintient un verrou ACCESS SHARE pour appliquer cette restriction
Une réorganisation complète de la table nécessite un espace de stockage disponible au moins deux fois supérieur à la taille de la table à réorganiser
Une réorganisation complète de la table est intensive en E/S. Sur une instance dotée d'un disque ESSD (Enhanced SSD) de niveau de performance 1 (PL1), la réorganisation d'une table de 100 Go peut saturer le débit d'E/S maximal de 250 Mo/s. Exécutez cette opération pendant les heures creuses
Fonctionnement
Réorganisation complète de la table
pg_repack reconstruit la table en sept étapes :
Créez une table de journalisation pour capturer les modifications apportées à la table d'origine pendant la réorganisation
Ajoutez des déclencheurs à la table d'origine pour inscrire chaque INSERT, UPDATE et DELETE dans la table de journalisation
Copiez toutes les lignes dans une nouvelle table
Créez les index sur la nouvelle table
Appliquez les modifications accumulées dans la table de journalisation à la nouvelle table
Échangez la table d'origine et la nouvelle table dans le catalogue système
Supprimez la table d'origine
pg_repack maintient un verrou ACCESS EXCLUSIVE aux étapes 1, 2, 6 et 7. Pour toutes les autres étapes, il ne maintient qu'un verrou ACCESS SHARE, ce qui permet aux opérations INSERT, UPDATE et DELETE sur la table d'origine de se poursuivre sans interruption.
Réorganisation des index uniquement
Créez simultanément de nouveaux index
Échangez les index d'origine et les nouveaux index dans le catalogue système
Supprimez les index d'origine
Activer ou désactiver pg_repack
Exécutez ces instructions avec le compte privilégié.
-- Enable
CREATE EXTENSION pg_repack;
-- Disable
DROP EXTENSION pg_repack;
Installer l'utilitaire client pg_repack
Le client en ligne de commande pg_repack s'exécute sur votre instance Elastic Compute Service (ECS) et se connecte à distance à l'instance RDS. Les étapes suivantes s'appliquent aux instances ECS exécutant Alibaba Cloud Linux 3.2104 ou une version ultérieure.
-
Installez les dépendances de compilation :
sudo yum install postgresql* redhat-rpm-config libpq* openssl-devel readline-devel -y -
Ajoutez les binaires PostgreSQL à votre chemin d'accès :
RemarqueLe chemin d'accès et la version PostgreSQL indiqués dans la commande ci-dessus sont donnés à titre d'exemple. Remplacez-les par les valeurs correspondant à votre environnement.
export PATH=$PATH:/usr/lib64/pgsql/postgresql-12/bin -
Téléchargez, compilez et installez le client :
wget https://github.com/reorg/pg_repack/archive/refs/tags/ver_1.4.6.tar.gz tar zxvf ver_1.4.6.tar.gz cd pg_repack-ver_1.4.6 make && make install
Réorganiser une table
Vérifier l'espace de stockage disponible
Une réorganisation complète de la table nécessite un espace de stockage disponible au moins deux fois supérieur à la taille de la table. Avant la réorganisation, vérifiez que vous disposez d'un espace libre suffisant.
Exécutez les requêtes suivantes pour vérifier la taille de la table et estimer l'espace de stockage requis :
-- Check total table size (including TOAST and indexes)
SELECT pg_size_pretty(pg_total_relation_size('schema1.table1')) AS total_size;
-- Check heap size only
SELECT pg_size_pretty(pg_relation_size('schema1.table1')) AS heap_size;
Provisionnez au moins deux fois la taille totale actuelle de la table en tant qu'espace de stockage libre avant de démarrer une réorganisation complète de la table.
Test à blanc (recommandé)
Exécutez la commande avec l'option --dry-run pour vérifier l'opération sans apporter de modifications :
pg_repack --dry-run --no-superuser-check --echo --no-order \
-h <endpoint> -p <port> -d <database> -U <user> \
--table schema1.table1
Réorganisation complète de la table
pg_repack --no-superuser-check --echo --no-order \
-h <endpoint> -p <port> -d <database> -U <user> \
--table schema1.table1
Remplacez les espaces réservés par les valeurs réelles :
| Espace réservé | Description | Exemple |
|---|---|---|
<endpoint> |
Endpoint de l'instance RDS | rm-xxx.pg.rds.aliyuncs.com |
<port> |
Numéro de port | 5432 |
<database> |
Nom de la base de données | mydb |
<user> |
Nom d'utilisateur de la base de données | myuser |
Vérifier le résultat
Vérifiez la taille de la table avant et après la réorganisation pour confirmer que l'espace a bien été récupéré.
Avant la réorganisation :
SELECT pg_size_pretty(pg_relation_size('schema1.table1'));
Après la réorganisation, exécutez la même requête. Une réorganisation réussie affiche une valeur plus faible.
Dépannage
Erreur : pg_repack failed with error: You must be a superuser to use pg_repack
Ajoutez l'option -k (ou --no-superuser-check) pour ignorer la vérification des droits superutilisateur :
pg_repack -k --no-superuser-check ...
Lorsque vous réorganisez une table entière, vous ne pouvez pas utiliser cette méthode pour obtenir des autorisations.
Référence
Réorganiser les tables dans les bases de données PostgreSQL avec un minimum de verrous — Documentation officielle de pg_repack