Déterminer si les tables de votre base de données ont besoin d'une opération VACUUM - 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.

Déterminer si les tables de votre base de données ont besoin d'une opération VACUUM

Vous pouvez utiliser la requête suivante pour afficher le nombre de transactions dégelées dans une base de données. La colonne datfrozenxid de la ligne pg_database d'une base de données est une limite inférieure appliquée aux ID de transaction normaux qui apparaissent dans cette base de données. Cette colonne représente le minimum des valeurs relfrozenxid par table au sein de la base de données.

SELECT datname, age(datfrozenxid) FROM pg_database ORDER BY age(datfrozenxid) desc limit 20;

Par exemple, les résultats de l'exécution de la requête précédente pourraient être les suivants.

datname | age mydb | 1771757888 template0 | 1721757888 template1 | 1721757888 rdsadmin | 1694008527 postgres | 1693881061 (5 rows)

Lorsque l’âge d’une base de données atteint 2 milliards d’ID de transactions, un bouclage de l’ID de transaction (XID) se produit et la base de données passe en lecture seule. Vous pouvez utiliser cette requête pour produire une métrique et l'exécuter plusieurs fois par jour. Par défaut, autovacuum est défini pour conserver un âge de transactions inférieur à 200,000,000 (autovacuum_freeze_max_age).

Un exemple de politique de surveillance peut ressembler à ceci :

  • Définissez la valeur autovacuum_freeze_max_age sur 200 millions de transactions.

  • Si une table atteint les 500 millions de transactions dégelées, elle déclenche une alarme de faible gravité. Ce n'est pas une valeur déraisonnable, mais elle peut indiquer que la fonction d'autovacuum ne suit pas.

  • Si l'âge d'une table atteint 1 milliard, cela doit être considéré comme une alarme exigeant une action. En général, il est conseillé de conserver des âges plus proches de autovacuum_freeze_max_age pour des raisons de performances. Nous vous recommandons d'enquêter en appliquant les recommandations suivantes.

  • Si une table atteint les 1,5 million de transactions non vidées, elle déclenche une alarme de haute gravité. En fonction de la vitesse à laquelle votre base de données utilise les ID de transaction, cette alarme peut indiquer que le système n'a presque plus de temps pour exécuter le processus d'autovacuum. Dans ce cas, nous vous recommandons une résolution immédiate.

Si une table enfreint constamment ces seuils, vous devez continuer à modifier vos paramètres d'autovacuum. Par défaut, l'utilisation manuelle de VACUUM (pour lequel les retards basés sur les coûts sont désactivés) est plus agressive que le processus d'autovacuum par défaut, mais elle est également plus intrusive pour le système dans son ensemble.

Nous vous recommandons la procédure suivante :

  • Gardez tout cela à l'esprit et activez un mécanisme de surveillance afin de connaître l'âge de vos transactions les plus anciennes.

    Pour plus d’informations sur la création d’un processus qui vous avertisse de la présence d’un encapsuleur d’ID de transaction, consultez le billet de blog de base de données AWS Implement an early warning system for transaction ID wraparound in Amazon RDS pour PostgreSQL.

  • Pour les tables plus occupées, procédez régulièrement au gel manuel du processus de vacuum pendant une fenêtre de maintenance, en plus de compter sur la fonction d'autovacuum. Pour plus d’informations sur le gel manuel du processus vacuum, consultez Réalisation d’un gel manuel du processus vacuum.