Réduction du ballonnement des tables et des index avec l'extension pg_repack - Amazon Relational Database Service

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Réduction du ballonnement des tables et des index avec l'extension pg_repack

Vous pouvez utiliser l'pg_repackextension pour supprimer la surcharge des tables et des index comme alternative à. VACUUM FULL Cette extension est prise en charge sur RDS les SQL versions 9.6.3 et supérieures de Postgre. Pour plus d'informations sur l'pg_repackextension et le réemballage complet de la table, consultez la documentation du GitHub projet.

Contrairement à celaVACUUM FULL, l'pg_repackextension ne nécessite un lock exclusif (AccessExclusiveLock) que pendant une courte période lors de l'opération de reconstruction de la table dans les cas suivants :

  • Création initiale de la table de journal — Une table de journal est créée pour enregistrer les modifications survenues lors de la copie initiale des données, comme indiqué dans l'exemple suivant :

    postgres=>\dt+ repack.log_* List of relations -[ RECORD 1 ]-+---------- Schema | repack Name | log_16490 Type | table Owner | postgres Persistence | permanent Access method | heap Size | 65 MB Description |
  • swap-and-dropPhase finale.

Pour le reste de l'opération de reconstruction, il suffit de ACCESS SHARE verrouiller la table d'origine pour copier des lignes de celle-ci vers la nouvelle table. Cela permet aux DELETE opérations INSERTUPDATE, et de se dérouler comme d'habitude.

Recommandations

Les recommandations suivantes s'appliquent lorsque vous supprimez le bloat des tables et des index à l'aide de l'pg_repackextension :

  • Effectuez le reconditionnement en dehors des heures ouvrables ou pendant une période de maintenance afin de minimiser son impact sur les performances des autres activités de base de données.

  • Surveillez de près les sessions bloquantes pendant l'activité de reconstruction et assurez-vous qu'aucune activité sur la table d'origine ne risque de bloquerpg_repack, en particulier pendant la swap-and-drop phase finale lorsqu'un verrouillage exclusif de la table d'origine est nécessaire. Pour plus d'informations, consultez la section Identification de ce qui bloque une requête.

    Lorsque vous voyez une session bloquante, vous pouvez y mettre fin à l'aide de la commande suivante après mûre réflexion. Cela permet de continuer pg_repack à terminer la reconstruction :

    SELECT pg_terminate_backend(pid);
  • Lors de l'application des modifications accumulées à partir de la table des pg_repack's journaux sur des systèmes présentant un taux de transactions très élevé, le processus d'application risque de ne pas être en mesure de suivre le rythme des modifications. Dans de tels cas, pg_repack il ne serait pas en mesure de terminer le processus de candidature. Pour de plus amples informations, veuillez consulter Surveillance de la nouvelle table lors du reconditionnement. Si les index sont très volumineux, une autre solution consiste à effectuer un reconditionnement des index uniquement. Cela permet également aux cycles VACUUM de nettoyage des index de se terminer plus rapidement.

    Vous pouvez ignorer la phase de nettoyage de l'index à l'aide VACUUM du manuel depuis Postgre SQL version 12, et elle est automatiquement ignorée lors de l'aspiration automatique d'urgence depuis Postgre version 14. SQL Cela permet de VACUUM terminer plus rapidement sans supprimer le gonflement de l'index et n'est destiné qu'aux situations d'urgence telles que la prévention de l'VACUUMencapsulation. Pour plus d'informations, consultez la section Éviter le gonflement des index dans le guide de l'utilisateur Amazon Aurora.

Prérequis

  • La table doit avoir PRIMARY KEY ou non une UNIQUE contrainte nulle.

  • La version de l'extension doit être la même pour le client et le serveur.

  • Assurez-vous que la taille de l'RDSinstance est FreeStorageSpace supérieure à la taille totale de la table sans le gonflement. Par exemple, considérez que la taille totale de la table, index TOAST et index inclus, est de 2 To, et que le volume total de la table est de 1 To. La valeur requise FreeStorageSpace doit être supérieure à la valeur renvoyée par le calcul suivant :

    2TB (Table size) - 1TB (Table bloat) = 1TB

    Vous pouvez utiliser la requête suivante pour vérifier la taille totale de la table et l'utiliser pgstattuple pour en déduire le gonflement. Pour plus d'informations, consultez la section Diagnostic du gonflement des tables et des index dans le guide de l'utilisateur Amazon Aurora

    SELECT pg_size_pretty(pg_total_relation_size('table_name')) AS total_table_size;

    Cet espace est récupéré une fois l'activité terminée.

  • Assurez-vous que l'RDSinstance dispose d'une capacité de calcul et d'E/S suffisante pour gérer l'opération de reconditionnement. Vous pouvez envisager d'augmenter la classe d'instance pour un équilibre optimal des performances.

Pour utiliser l'pg_repackextension
  1. Installez l'pg_repackextension sur votre SQL instance de base de données RDS for Postgre en exécutant la commande suivante.

    CREATE EXTENSION pg_repack;
  2. Exécutez les commandes suivantes pour accorder un accès en écriture aux tables de journaux temporaires créées parpg_repack.

    ALTER DEFAULT PRIVILEGES IN SCHEMA repack GRANT INSERT ON TABLES TO PUBLIC; ALTER DEFAULT PRIVILEGES IN SCHEMA repack GRANT USAGE, SELECT ON SEQUENCES TO PUBLIC;
  3. Connectez-vous à la base de données à l'aide de l'utilitaire pg_repack client. Utilisez un compte qui possède les privilèges rds_superuser. Par exemple, supposons que le rôle rds_test a les privilèges rds_superuser. La syntaxe suivante s'applique pg_repack aux tables complètes, y compris tous les index de table de la postgres base de données.

    pg_repack -h db-instance-name.111122223333.aws-region.rds.amazonaws.com -U rds_test -k postgres
    Note

    Vous devez vous connecter à l'aide de l'option -k. L'option -a n'est pas prise en charge.

    La réponse du pg_repack client fournit des informations sur les tables de l'instance de base de données qui sont reconditionnées.

    INFO: repacking table "pgbench_tellers" INFO: repacking table "pgbench_accounts" INFO: repacking table "pgbench_branches"
  4. La syntaxe suivante réemballe une seule table, orders y compris les index de la base de données. postgres

    pg_repack -h db-instance-name.111122223333.aws-region.rds.amazonaws.com -U rds_test --table orders -k postgres

    La syntaxe suivante réemballe uniquement les index de la orders table dans postgres la base de données.

    pg_repack -h db-instance-name.111122223333.aws-region.rds.amazonaws.com -U rds_test --table orders --only-indexes -k postgres

Surveillance de la nouvelle table lors du reconditionnement

  • La taille de la base de données est augmentée de la taille totale de la table moins le surchargement, jusqu'à la swap-and-drop phase de reconditionnement. Vous pouvez surveiller le taux de croissance de la taille de la base de données, calculer la vitesse du reconditionnement et estimer approximativement le temps nécessaire pour terminer le transfert de données initial.

    Par exemple, considérez que la taille totale de la table est de 2 To, la taille de la base de données de 4 To et la charge totale de la table de 1 To. La valeur de taille totale de la base de données renvoyée par le calcul à la fin de l'opération de reconditionnement est la suivante :

    2TB (Table size) + 4 TB (Database size) - 1TB (Table bloat) = 5TB

    Vous pouvez estimer approximativement la vitesse de l'opération de reconditionnement en échantillonnant le taux de croissance en octets entre deux points dans le temps. Si le taux de croissance est de 1 Go par minute, l'opération initiale de création de table peut prendre environ 1 000 minutes ou 16,6 heures. Outre la création initiale de la table, vous pg_repack devez également appliquer les modifications accumulées. Le temps nécessaire dépend du taux d'application des modifications en cours et des modifications cumulées.

    Note

    Vous pouvez utiliser pgstattuple l'extension pour calculer le gonflement dans le tableau. Pour plus d'informations, consultez pgstattuple.

  • Le nombre de lignes de la table de pg_repack's journal, sous le schéma de reconditionnement, représente le volume de modifications en attente d'être appliquées à la nouvelle table après le chargement initial.

    Vous pouvez consulter la table des pg_repack's journaux pg_stat_all_tables pour surveiller les modifications appliquées à la nouvelle table. pg_stat_all_tables.n_live_tupindique le nombre d'enregistrements en attente d'être appliqués à la nouvelle table. Pour plus d'informations, consultez pg_stat_all_tables.

    postgres=>SELECT relname,n_live_tup FROM pg_stat_all_tables WHERE schemaname = 'repack' AND relname ILIKE '%log%'; -[ RECORD 1 ]--------- relname | log_16490 n_live_tup | 2000000
  • Vous pouvez utiliser l'pg_stat_statementsextension pour connaître le temps nécessaire à chaque étape de l'opération de reconditionnement. Cela est utile pour préparer l'application de la même opération de reconditionnement dans un environnement de production. Vous pouvez ajuster la LIMIT clause pour étendre davantage la sortie.

    postgres=>SELECT SUBSTR(query, 1, 100) query, round((round(total_exec_time::numeric, 6) / 1000 / 60),4) total_exec_time_in_minutes FROM pg_stat_statements WHERE query ILIKE '%repack%' ORDER BY total_exec_time DESC LIMIT 5; query | total_exec_time_in_minutes -----------------------------------------------------------------------+---------------------------- CREATE UNIQUE INDEX index_16493 ON repack.table_16490 USING btree (a) | 6.8627 INSERT INTO repack.table_16490 SELECT a FROM ONLY public.t1 | 6.4150 SELECT repack.repack_apply($1, $2, $3, $4, $5, $6) | 0.5395 SELECT repack.repack_drop($1, $2) | 0.0004 SELECT repack.repack_swap($1) | 0.0004 (5 rows)

Le reconditionnement est une out-of-place opération complète, de sorte que la table d'origine n'est pas affectée et nous ne prévoyons aucun problème inattendu nécessitant la restauration de la table d'origine. Si le reconditionnement échoue de façon inattendue, vous devez rechercher la cause de l'erreur et la résoudre.

Une fois le problème résolu, supprimez et recréez l'pg_repackextension dans la base de données où se trouve la table, puis recommencez l'pg_repackétape. En outre, la disponibilité des ressources informatiques et l'accessibilité simultanée de la table jouent un rôle crucial dans la réalisation en temps voulu de l'opération de reconditionnement.