Tous les produits
Search
Centre de documentation

ApsaraDB RDS:Use the pg_repack extension to clear tablespaces

Dernière mise à jour :Aug 19, 2026

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.

Remarque

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 :

  1. Créez une table de journalisation pour capturer les modifications apportées à la table d'origine pendant la réorganisation

  2. Ajoutez des déclencheurs à la table d'origine pour inscrire chaque INSERT, UPDATE et DELETE dans la table de journalisation

  3. Copiez toutes les lignes dans une nouvelle table

  4. Créez les index sur la nouvelle table

  5. Appliquez les modifications accumulées dans la table de journalisation à la nouvelle table

  6. Échangez la table d'origine et la nouvelle table dans le catalogue système

  7. Supprimez la table d'origine

Remarque

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

  1. Créez simultanément de nouveaux index

  2. Échangez les index d'origine et les nouveaux index dans le catalogue système

  3. 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.

  1. Installez les dépendances de compilation :

    sudo yum install postgresql* redhat-rpm-config libpq* openssl-devel readline-devel -y
  2. Ajoutez les binaires PostgreSQL à votre chemin d'accès :

    Remarque

    Le 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
  3. 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;
Important

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 ...
Important

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