PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 18 beta 2 » Administration du serveur » Configuration du serveur » Nettoyage (vacuum)

19.10. Nettoyage (vacuum) #

Ces paramètres contrôlent le comportement du VACUUM. Pour plus d'informations sur le but et les responsabilités du VACUUM, voir Section 24.1.

19.10.1. Nettoyage automatique par VACUUM #

Ces paramètres contrôlent le comportement de la fonctionnalité appelée autovacuum. Se référer à la Section 24.1.6 pour plus de détails. Notez que beaucoup de ces paramètres peuvent être surchargés au niveau de chaque table ; voir Paramètres de stockage.

autovacuum (boolean) #

Contrôle si le serveur doit démarrer le démon d'autovacuum. Celui-ci est activé par défaut. track_counts doit aussi être activé pour que ce démon soit démarré. Ce paramètre ne peut être configuré que dans le fichier postgresql.conf ou indiqué sur la ligne de commande; cependant, le processus d'autovacuum peut être désactivé au niveau de chaque table en modifiant les paramètres de stockage de la table.

Même si ce paramètre est désactivé, le système lance les processus autovacuum nécessaires pour empêcher le bouclage des identifiants de transaction. Voir Section 24.1.5 pour plus d'informations.

autovacuum_worker_slots (integer) #

Indique le nombre de slots de processus serveur à réserver pour les processus autovacuum worker. Par défaut, il y a 16 slots mais cela pourrait être moins si la configuration du noyau ne l'accepte pas (comme déterminé lors de l'initdb). Ce paramètre peut seulement être configuré au démarrage du serveur.

Lors de la modification de cette valeur, pensez à ajuster autovacuum_max_workers.

autovacuum_max_workers (integer) #

Indique le nombre maximum de processus autovacuum (autre que le lanceur d'autovacuum) qui peuvent être exécutés simultanément. La valeur par défaut est 3. Ce paramètre peut seulement être configuré dans le fichier postgresql.conf ou sur la ligne de commande du serveur.

Notez qu'une valeur de ce paramètre plus haute que la valeur de autovacuum_worker_slots n'aura pas d'effet car les autovacuum workers sont pris dans l'ensemble de slots établis par ce paramètre.

autovacuum_naptime (integer) #

Indique le délai minimum entre les tours d'activité du démon autovacuum sur une base. À chaque tour, le démon examine une base de données et lance les commandes VACUUM et ANALYZE nécessaires aux tables de cette base. Si cette valeur est indiquée sans unité, elle est comprise comme un nombre de secondes. Il vaut, par défaut, une minute (1min). Ce paramètre ne peut être configuré que dans le fichier postgresql.conf ou indiqué sur la ligne de commande.

autovacuum_vacuum_threshold (integer) #

Indique le nombre minimum de lignes mises à jour ou supprimées nécessaire pour déclencher un VACUUM sur une table. La valeur par défaut est de 50 lignes. Ce paramètre ne peut être configuré que dans le fichier postgresql.conf ou indiqué sur la ligne de commande mais il est possible de surcharger ce paramètre pour toute table en modifiant les paramètres de stockage de la table.

autovacuum_vacuum_insert_threshold (integer) #

Indique le nombre de lignes enregistrées avant de déclencher un VACUUM sur une table. La valeur par défaut est 1000 lignes. Si -1 est indiqué, autovacuum ne déclenchera pas d'opération VACUUM sur une table en se basant sur le nombre d'insertions. Ce paramètre peut seulement être configuré dans le fichier postgresql.conf et sur la ligne de commande du serveur ; mais la configuration peut être surchargée par des tables individuelles en modifiant leur paramètres de stockage.

autovacuum_analyze_threshold (integer) #

Indique le nombre minimum de lignes insérées, mises à jour ou supprimées nécessaire pour déclencher un ANALYZE sur une table. La valeur par défaut est de 50 lignes. Ce paramètre ne peut être configuré que dans le fichier postgresql.conf ou indiqué sur la ligne de commande mais il est possible de surcharger ce paramètre pour toute table en modifiant les paramètres de stockage de la table.

autovacuum_vacuum_insert_scale_factor (floating point) #

Indique une fraction des blocs non gelés dans la table à ajouter à autovacuum_vacuum_insert_threshold avant de décider de déclencher un VACUUM sur une table. La valeur par défaut est 0,2 (soit 20% des pages non gelées de la table). Ce paramètre peut seulement être configuré dans le fichier postgresql.conf et sur la ligne de commande du serveur ; mais la configuration peut être surchargée par des tables individuelles en modifiant leur paramètres de stockage.

autovacuum_vacuum_scale_factor (floating point) #

Indique la fraction de taille de la table à ajouter à autovacuum_vacuum_threshold pour décider du moment auquel déclencher un VACUUM. La valeur par défaut est 0,2 (20 % de la taille de la table). Ce paramètre ne peut être configuré que dans le fichier postgresql.conf ou indiqué sur la ligne de commande mais il est possible de surcharger ce paramètre pour toute table en modifiant les paramètres de stockage de la table.

autovacuum_analyze_scale_factor (floating point) #

Indique la fraction de taille de la table à ajouter à autovacuum_analyze_threshold pour décider du moment auquel déclencher une commande ANALYZE. La valeur par défaut est 0,1 (10 % de la taille de la table). Ce paramètre ne peut être configuré que dans le fichier postgresql.conf ou indiqué sur la ligne de commande mais il est possible de surcharger ce paramètre pour toute table en modifiant les paramètres de stockage de la table.

autovacuum_vacuum_max_threshold (integer) #

Spécifie le nombre maximum de lignes mises à jour ou supprimées nécessaires pour déclencher un VACUUM dans toute table, donc une limite sur la valeur calculée avec autovacuum_vacuum_threshold et autovacuum_vacuum_scale_factor. La valeur par défaut est de 100 millions de lignes. S'il vaut -1, autovacuum ne forcera par un nombre maximum de lignes mises à jour ou supprimées qui déclencheront une opération VACUUM. Ce paramètre peut seulement être configuré dans le fichier postgresql.conf ou sur la ligne de commande du serveur ; le paramètre peut être surchargé pour les tables individuelles en changeant leurs paramètres de stockage.

autovacuum_freeze_max_age (integer) #

Indique l'âge maximum (en transactions) que le champ pg_class.relfrozenxid d'une table peut atteindre avant qu'une opération VACUUM ne soit forcée pour empêcher la réinitialisation de l'ID de transaction sur cette table. Le système lance les processus autovacuum pour éviter ce bouclage même si l'autovacuum est désactivé.

L'opération VACUUM supprime aussi les anciens fichiers du sous-répertoire pg_xact, ce qui explique pourquoi la valeur par défaut est relativement basse (200 millions de transactions). Ce paramètre n'est lu qu'au démarrage du serveur, mais il peut être diminué pour toute table en modifiant les paramètres de stockage de la table. Pour plus d'informations, voir Section 24.1.5.

autovacuum_multixact_freeze_max_age (integer) #

Indique l'âge maximum (en multixacts) que le champ pg_class.relminmxid d'une table peut atteindre avant qu'une opération VACUUM ne soit forcé pour empêcher une réutilisation des identifiants multixact dans la table. Notez que le système lancera les processus autovacuum pour empêcher la réutilisation même si l'autovacuum est normalement désactivé.

Un VACUUM des multixacts s'occupe aussi de la suppression des anciens fichiers à partir des sous-répertoires pg_multixact/members et pg_multixact/offsets, ce qui explique pourquoi la valeur par défaut est relativement basse (400 million de multixacts). Ce paramètre est seulement configurable au démarrage du serveur mais sa valeur peut être réduite pour des tables individuelles en modifiant les paramètres de stockage de la table. Pour plus d'informations, voir Section 24.1.5.1.

autovacuum_vacuum_cost_delay (integer) #

Indique la valeur du coût de délai utilisée dans les opérations de VACUUM. Si -1 est indiqué, la valeur habituelle de vacuum_cost_delay est utilisée. Si cette valeur est spécifiée sans unité, elle est comprise comme un nombre de millisecondes. La valeur par défaut est 2 millisecondes. Ce paramètre ne peut être configuré que dans le fichier postgresql.conf ou indiqué sur la ligne de commande mais il est possible de le surcharger pour toute table en modifiant les paramètres de stockage de la table.

autovacuum_vacuum_cost_limit (integer) #

Indique la valeur de coût limite utilisée dans les opérations de VACUUM automatiques. Si -1 est indiqué (valeur par défaut), la valeur courante de vacuum_cost_limit est utilisée. La valeur est distribuée proportionnellement entre les processus autovacuum en cours d'exécution, s'il y en a plus d'un, de sorte que la somme des limites de chaque processus ne dépasse jamais la valeur de cette variable. Ce paramètre ne peut être configuré que dans le fichier postgresql.conf ou indiqué sur la ligne de commande mais il est possible de le surcharger pour toute table en modifiant les paramètres de stockage.

19.10.2. Pause du VACUUM basée sur les coûts #

Lors de l'exécution des commandes VACUUM et ANALYZE, le système maintient un compteur interne qui garde trace du coût estimé des différentes opérations d'entrées/sorties disques réalisées. Quand le coût accumulé atteint une limite (configurée par vacuum_cost_limit), le processus réalisant l'opération s'endort pour une courte période de temps, configurée par vacuum_cost_delay. Puis il réinitialise le compteur et continue l'opération.

Le but de cette fonctionnalité est de permettre aux administrateurs de réduire l'impact sur les entrées/sorties disques de ces commandes sur le reste de l'activité de l'instance. Il est de nombreuses situations où il n'est pas important que les commandes de maintenance comme VACUUM et ANALYZE finissent rapidement. Néanmoins, il est habituellement très important que ces commandes n'interfèrent pas significativement avec les capacités du serveur à réaliser d'autres opérations sur l'instance. La pause du VACUUM basée sur les coûts de celui-ci fournit un moyen pour que les administrateurs y parviennent.

Cette fonctionnalité est désactivée par défaut pour les commandes manuelles de VACUUM. Pour l'activer, configurez le paramètre vacuum_cost_delay à une valeur différente de zéro.

vacuum_cost_delay (floating point) #

La durée d'endormissement du processus une fois la limite de coût atteinte. Si cette valeur est indiquée sans unité, elle est pris pour des millisecondes. La valeur par défaut est 0, ce qui désactive la fonctionnalité. Les valeurs positives activent les VACUUM basés sur le coût.

Si la fonctionnalité est activée, les valeurs adéquates pour vacuum_cost_delay sont habituellement basses, peut-être même inférieures à la milliseconde. Bien que vacuum_cost_delay puisse être configuré à des valeurs en dessous de la milliseconde, de tels délais peuvent ne pas être mesurés précisément sur les anciennes plateformes. Dans ce cas, augmenter la consommation des ressources du VACUUM au dessus de ce qu'on va obtenir à 1 milliseconde demandera de modifier les autres paramètres de coût. Néanmoins, vous pouvez conserver vacuum_cost_delay aussi bas que ce que votre plateforme est capable de mesurer correctement ; de gros délais ne sont pas utiles.

vacuum_cost_page_hit (integer) #

Le coût estimé pour traiter un bloc trouvé dans le cache disque de PostgreSQL. Plus exactement, c'est le coût pour verrouiller le cache, rechercher dans la table de hachage et parcourir le contenu de ce bloc. La valeur par défaut est 1.

vacuum_cost_page_miss (integer) #

Le coût estimé pour traiter un bloc lu sur disque. Plus exactement, c'est le coût pour verrouiller le cache, rechercher dans la table de hachage, lire le bloc sur disque et parcourir le contenu de ce bloc. La valeur par défaut est 2.

vacuum_cost_page_dirty (integer) #

Le coût estimé pour modifier un bloc auparavant propre. Plus exactement, c'est le coût de l'entrée/sortie disque supplémentaire requise pour vider le bloc modifiée sur disque. La valeur par défaut est 20.

vacuum_cost_limit (integer) #

C'est le coût accumulé qui forcera le processus à s'endormir pendant vacuum_cost_delay. La valeur par défaut est 200.

Note

Il existe quelques opérations qui détiennent des verrous critiques et qui, de ce fait, doivent se terminer le plus rapidement possible. Les délais sur le VACUUM ne surviennent pas lors de ce type d'opérations. De ce fait, il est possible que le coût accumulé dépasse fortement la limite configurée. Pour éviter de longs délais inutiles, le délai réel est calculé ainsi : vacuum_cost_delay * accumulated_balance / vacuum_cost_limit avec un maximum de vacuum_cost_delay * 4.

19.10.3. Comportement par défaut #

vacuum_truncate (boolean) #

Active ou désactive la suppression des blocs vides en fin de table. La valeur par défaut est true. Si true, VACUUM et autovacuum supprimeront les blocs vides en fin de table pour que l'espace disque des blocs vidés soit rendu disponible au système d'exploitation. Notez que cette suppression nécessite un verrou ACCESS EXCLUSIVE sur la table. Le paramètre TRUNCATE de VACUUM, si précisé, surcharge la valeur de ce paramètre. Cette configuration peut aussi être surchargée suivant les paramètres de stockage individuels des tables.

19.10.4. Gel #

Pour maintenir la fiabilité y compris après un bouclage des identifiants de transaction, PostgreSQL marque les lignes qui sont suffisamment anciennes comme gelées. Ces lignes sont visibles à tout le monde ; les autres transactions n'ont pas besoin d'examiner leur identifiants de transaction d'insertion pour déterminer la visibilité. VACUUM est responsable du gel des lignes. Les paramètres suivants contrôlent le comportement de gel du VACUUM et doivent être configurés basés sur le taux de consommation des identifiants de transaction du système et les types d'accès aux données de la charge de travail dominante. Voir Section 24.1.5 pour plus d'informations sur le bouclage des identifiants de transactions et sur la configuration de ces paramètres.

vacuum_freeze_table_age (integer) #

VACUUM effectuera un parcours agressif de la table si le champ pg_class.relfrozenxid de la table a atteint l'âge spécifié par ce paramètre. Un parcours agressif diffère d'un VACUUM standard dans le sens où il visite chaque bloc qui pourrait contenir des XID ou MXID non gelés, pas seulement ceux qui pourraient contenir des lignes mortes. La valeur par défaut est 150 millions de transactions. Même si les utilisateurs peuvent positionner cette valeur à n'importe quelle valeur comprise entre zéro et 2 milliards, VACUUM limitera silencieusement la valeur effective à 95% de autovacuum_freeze_max_age, afin qu'un vacuum périodique manuel ait une chance de s'exécuter avant un autovacuum anti-bouclage ne soit lancé pour la table. Pour plus d'informations voir Section 24.1.5.

vacuum_freeze_min_age (integer) #

Précise l'âge limite (en transactions) que VACUUM doit utiliser pour décider le déclenchement du gel des blocs qui ont un identifiant de transaction plus ancien. La valeur par défaut est de 50 million transactions. Bien que les utilisateurs peuvent configurer cette valeur de 0 à un milliard, VACUUM limitera silencieusement la valeur réelle à la moitié de la valeur de autovacuum_freeze_max_age, pour qu'il n'y ait pas un temps trop court entre des autovacuums forcés. Pour plus d'informations, voir Section 24.1.5.

vacuum_failsafe_age (integer) #

Indique l'âge maximum (en transactions) que le champ pg_class.relfrozenxid d'une table peut atteindre avant que VACUUM ne prenne de mesures extraordinaires pour éviter un échec du bouclage des identifiants de transaction. C'est la stratégie de dernier ressort du VACUUM. Ce paramètre se déclenche typiquement quand un autovacuum pour éviter que le bouclage des identifiants de transaction a déjà été déclenché depuis quelques temps, bien qu'il soit possible que ce paramètre se déclenche pendant tout type de VACUUM.

Quand il est déclenché, tout délai basé sur le coût ne sera pas appliqué, les tâches de maintenance non essentielles (tels que le nettoyage d'index) sont ignorés, et toute stratégie d'accès aux blocs (Buffer Access Strategy) en cours d'utilisation sera désactivée laissant VACUUM libre d'utiliser tout le cache disque de PostgreSQL.

La valeur par défaut est de 1,6 milliards de transactions. Bien que les utilisateurs peuvent configurer cette valeur de zéro à 2,1 milliards, VACUUM ajustera silencieusement la valeur réelle à au moins 105 % de autovacuum_freeze_max_age.

vacuum_multixact_freeze_table_age (integer) #

VACUUM réalise un parcours agressif si le champ pg_class.relminmxid de la table a atteint l'âge indiqué par ce paramètre. Un parcours agressif diffère d'un VACUUM standard dans le fait qu'il visite chaque bloc qui pourrait contenir des identifiants de transactions XID ou MXID non gelés, pas uniquement celles qui pourraient contenir des lignes mortes. La valeur par défaut est de 150 MultiXact. Bien que les utilisateurs peuvent configurer cette valeur de zéro à deux milliards, VACUUM limitera silencieusement la valeur réelle à 95 % de autovacuum_multixact_freeze_max_age, pour qu'un VACUUM manuel périodique ait une chance de s'exécuter avant qu'un bouclage ne soit lancé pour la table. Pour plus d'informations, voir Section 24.1.5.1.

vacuum_multixact_freeze_min_age (integer) #

Indique l'âge limite (en multixacts) que VACUUM doit utiliser pour décider s'il doit déclencher le gel des blocs ayant un identifiant multixact plus ancien. La valeur par défaut est de 5 millions de multixacts. Bien que les utilisateurs peuvent configurer cette valeur de zéro à un milliard, VACUUM limitera silencieusement la valeur réelle à la moitié de la valeur de autovacuum_multixact_freeze_max_age, pour qu'il n'y ait pas un temps trop court entre deux autovacuums forcés. Pour plus d'informations, voir Section 24.1.5.1.

vacuum_multixact_failsafe_age (integer) #

Indique l'âge maximum (en multixacts) que le champ pg_class.relminmxid d'une table peut atteindre avant que VACUUM ne prenne de mesure extraordinaires pour éviter un échec du bouclage des identifiants MultiXact globaux. C'est une mesure de dernier ressort pour le VACUUM. Cette mesure se déclenche typiquement quand un autovacuum pour éviter une bascule des identifiants de transaction a déjà été exécuté il y a quelques temps, bien qu'il soit possible qu'elle se déclenche lors de tout type de VACUUM.

Quand cette méthode est déclenchée, tout délai basé sur le coût ne sera plus appliqué, et toute tâche de maintenance non essentielle (comme le nettoyage des index) est ignorée.

La valeur par défaut est de 1,6 milliards de MultiXact. Bien que les utilisateurs peuvent configurer cette valeur de zéro à 2,1 milliards, VACUUM ajustera silencieusement la valeur réelle à au moins 105 % de autovacuum_multixact_freeze_max_age.

vacuum_max_eager_freeze_failure_rate (floating point) #

Indique le nombre maximum de blocs (sous la forme d'une fraction du nombre de blocs total de la relation) que VACUUM peut parcourir et échouer à configurer le drapeau tout-gelé dans la carte de visibilité avant de désactiver le parcours en avance. Une valeur de 0 le désactive complètement. La valeur par défaut est de 0.03 (3 %).

Notez que, quand le parcours en avance est activé, seuls les échecs de gel compte, pas les gels réussis. Les gels de bloc réussis sont bloqués en interne à 20 % des blocs tout-visible, mais pas tout-gelé, de la relation. Limiter les gels réussis de blocs aide à amortir la surcharge entre plusieurs VACUUM normaux et limite l'inconvénient potentiel des gels en avant perdus de blocs qui sont modifiés de nouveau avant le prochain VACUUM agressif.

Ce paramètre peut seulement être configuré dans le fichier postgresql.conf ou sur la ligne de commande du serveur ; mais ce paramètre peut être surchargé par une configuration table par table en modifiant le paramètre de stockage ???. Pour plus d'informations sur la configuration fine du comportement du gel de ligne par le VACUUM, voir Section 24.1.5.