PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 12.18 » Administration du serveur » Superviser l'activité de la base de données » Le récupérateur de statistiques

27.2. Le récupérateur de statistiques

Le récupérateur de statistiques de PostgreSQL est un sous-système qui prend en charge la récupération et les rapports d'informations sur l'activité du serveur. Actuellement, le récupérateur peut compter les accès aux tables et index à la fois en termes de blocs disque et de lignes individuelles. Il conserve aussi la trace du nombre total de lignes dans chaque table ainsi que des informations sur les VACUUM et les ANALYZE pour chaque table. Il peut aussi compter le nombre d'appels aux fonctions définies par l'utilisateur ainsi que le temps total dépensé par chacune d'elles.

PostgreSQL est également capable de renvoyer des informations dynamiques en temps réel sur ce qu'il se passe exactement dans le système, comme la commande exacte en cours d'exécution par d'autres processus serveur et les autres connexions qui existent dans le système. Cette fonctionnalité est indépendante du processus de récupération de données statistiques.

27.2.1. Configuration de la récupération de statistiques

Comme la récupération de statistiques ajoute un temps supplémentaire à l'exécution de la requête, le système peut être configuré pour récupérer ou non des informations. Ceci est contrôlé par les paramètres de configuration qui sont normalement initialisés dans postgresql.conf (voir Chapitre 19 pour plus de détails sur leur initialisation).

Le paramètre track_activities active la collecte d'informations sur la commande en cours d'exécution pour n'importe quel processus serveur.

Le paramètre track_counts contrôle si les statistiques sont récupérées pour les accès aux tables et index.

Le paramètre track_functions active le calcul de statistiques sur l'utilisation des fonctions définies par l'utilisateur.

Le paramètre track_io_timing active la collecte des temps de lecture et d'écriture de blocs.

Normalement, ces paramètres sont configurés dans postgresql.conf de façon à ce qu'ils s'appliquent à tous les processus serveur, mais il est possible de les activer/désactiver sur des sessions individuelles en utilisant la commande SET (pour empêcher les utilisateurs ordinaires de cacher leur activité à l'administrateur, seuls les superutilisateurs sont autorisés à modifier ces paramètres avec SET).

Le collecteur de statistiques transmet l'information récupérée aux autres processus PostgreSQL à travers des fichiers temporaires. Ces fichiers sont stockés dans le répertoire défini par le paramètre stats_temp_directory, par défaut pg_stat_tmp. Pour de meilleures performances, stats_temp_directory peut pointer vers un disque en RAM, diminuant ainsi les besoins en entrées/sorties physiques. Quand le serveur s'arrête proprement, une copie permanente des données statistiques est stockée dans le sous-répertoire pg_stat, pour que les statistiques puissent être conservées puis réutilisées au redémarrage du serveur. Lorsqu'au démarrage du serveur, la restauration est réalisée (par exemple, après un arrêt immédiat, un crash du serveur ou encore après une restauration PITR), tous les compteurs statistiques sont réinitialisés.

Une transaction peut aussi voir des statistiques propres à son activité (qui ne sont pas encore transmises au collecteur) dans les vues pg_stat_xact_all_tables, pg_stat_xact_sys_tables, pg_stat_xact_user_tables et pg_stat_xact_user_functions. Ces informations se mettent à jour en continu pendant l'exécution de la transaction.

27.2.2. Visualiser les statistiques

Plusieurs vues prédéfinies, listées à Tableau 27.1, sont disponibles pour montrer l'état courant du système. Il existe aussi plusieurs autres vues, listées à Tableau 27.2, qui montrent les résultats des statistiques récupérées. De manière alternative, il est possible de créer des vues personnalisées qui utilisent les fonctions statistiques sous-jacentes, comme discuté à Section 27.2.3.

En utilisant les statistiques pour surveiller l'activité en cours, il est important de réaliser que l'information n'est pas mise à jour instantanément. Chaque processus serveur individuel transmet les nouvelles statistiques au récupérateur juste avant l'attente d'une nouvelle commande du client ; donc une requête toujours en cours n'affecte pas les totaux affichés. De plus, le récupérateur lui-même émet un nouveau rapport une fois par PGSTAT_STAT_INTERVAL millisecondes (soit 500 millisecondes, sauf si cette valeur a été modifiée lors de la construction du serveur). Donc, les totaux affichés sont bien derrière l'activité réelle. Néanmoins, l'information sur la requête en cours récupérée par track_activities est toujours à jour.

Un autre point important est que, lorsqu'un processus serveur se voit demander d'afficher une des statistiques, il récupère tout d'abord le rapport le plus récent émis par le processus de récupération, puis continue d'utiliser cette image de toutes les vues et fonctions statistiques jusqu'à la fin de sa transaction en cours. De façon similaire, les informations sur les requêtes en cours, quel que soit le processus, sont récupérées quand une telle information est demandée dans une transaction, et cette même information sera affichée lors de la transaction. Donc, les statistiques afficheront des informations statiques tant que vous restez dans la même transaction. Ceci est une fonctionnalité, et non pas un bogue, car il vous permet de traiter plusieurs requêtes sur les statistiques et de corréler les résultats sans vous inquiéter que les nombres aient pu changer. Mais si vous voulez voir les nouveaux résultats pour chaque requête, assurez-vous de lancer les requêtes en dehors de tout bloc de transaction. Autrement, vous pouvez appeler pg_stat_clear_snapshot(), qui annulera l'image statistique de la transaction en cours. L'utilisation suivante des informations statistiques causera la récupération d'une nouvelle image.

Certaines des informations des vues statistiques dynamiques montrées dans Tableau 27.1 sont à accès restreint. Les utilisateurs ordinaires peuvent seulement voir toutes les informations sur leur propres sessions (les sessions appartenant à un rôle dont ils sont membres). Les lignes des autres sessions auront de nombreuses colonnes à NULL. Notez néanmoins que l'existence d'une session et ses propriétés générales, tel que l'utilisateur et la base de données, sont visibles à tous les utilisateurs. Les superutilisateurs et les membres du rôle interne pg_read_all_stats (voir aussi Section 21.5) peuvent accéder à toutes les informations sur les sessions.

Tableau 27.1. Vues statistiques dynamiques

Nom de la vueDescription
pg_stat_activity Une ligne par processus serveur, montrant les informations liées à l'activité courante du processus, comme l'état et la requête en cours. Voir pg_stat_activity pour plus de détails.
pg_stat_replicationUne ligne par processus d'envoi de WAL, montrant les statistiques sur la réplication vers le serveur standby connecté au processus. Voir pg_stat_replication pour les détails.
pg_stat_wal_receiverSeulement une ligne, affichant des statistiques sur le récepteur WAL à partir du serveur ayant ce récepteur. Voir pg_stat_wal_receiver pour les détails.
pg_stat_subscriptionAu moins une ligne par souscription, affichant des informations sur les processus workers de souscription. Voir pg_stat_subscription pour plus de détails.
pg_stat_sslUne ligne par connexion (régulière et de réplication), montrant des informations sur le chiffrement SSL utilisé pour ces connexions. Voir pg_stat_ssl pour les détails.
pg_stat_gssapiUne ligne par connexion (standard et réplication), montrant des informations sur l'authentification et le chiffrement GSSAPI utilisés sur cette connexion. Voir pg_stat_gssapi pour les détails.
pg_stat_progress_create_indexUne ligne pour chaque processus serveur exécutant un CREATE INDEX ou un REINDEX, affichant la progression actuelle. Voir Section 27.4.1.
pg_stat_progress_vacuumUne ligne pour chaque processus (incluant les processus autovacuum worker) exécutant un VACUUM, affichant le progrès en cours. Voir Section 27.4.2.
pg_stat_progress_clusterUne ligne pour chaque processus serveur exécutant CLUSTER ou VACUUM FULL, affichant le progrès en cours. Voir Section 27.4.3.

Tableau 27.2. Vues sur les statistiques récupérées

Nom de la vueDescription
pg_stat_archiverUne seule ligne, montrant les statistiques sur l'activité du processus d'archivage des journaux de transactions. Voir pg_stat_archiver pour les détails.
pg_stat_bgwriterUne seule ligne, montrant les statistiques d'activité du processus d'écriture d'arrière-plan. Voir pg_stat_bgwriter pour plus de détails.
pg_stat_databaseUne ligne par base de données, montrant les statistiques globales des bases. Voir pg_stat_database pour plus de détails.
pg_stat_database_conflicts Une ligne par base de données, montrant les statistiques au niveau de la base concernant les requêtes annulées à cause de conflits avec les serveurs standby en restauration. Voir pg_stat_database_conflicts pour les détails.
pg_stat_all_tables Une ligne par table de la base de données courante, montrant les statistiques d'accès de chaque table spécifiquement. Voir pg_stat_all_tables pour plus de détails.
pg_stat_sys_tablesIdentique à pg_stat_all_tables, sauf que seules les tables systèmes sont affichées
pg_stat_user_tablesIdentique à pg_stat_all_tables, sauf que seules les tables utilisateurs sont affichées
pg_stat_xact_all_tablesSimilaire à pg_stat_all_tables, mais décompte les actions prises dans la transaction en cours (qui ne sont pas encore pris en compte dans la vue pg_stat_all_tables et les vues du même type). Les colonnes correspondant au nombre de lignes vivantes et mortes, ainsi que celles pour les actions du VACUUM et de l'ANALYZE ne sont pas présentes dans cette vue
pg_stat_xact_sys_tablesIdentique à pg_stat_xact_all_tables, sauf que seules les tables systèmes sont affichées
pg_stat_xact_user_tablesIdentique à pg_stat_xact_all_tables, sauf que seules les tables utilisateurs sont affichées
pg_stat_all_indexes Une ligne par index de la base de données courante, montrant les statistiques d'accès de chaque index spécifiquement. Voir pg_stat_all_indexes pour plus de détails.
pg_stat_sys_indexesIdentique à pg_stat_all_indexes, sauf que seules les tables systèmes sont affichées
pg_stat_user_indexesIdentique à pg_stat_all_indexes, sauf que seules les tables utilisateurs sont affichées
pg_statio_all_tables Une ligne par table de la base de données courante, montrant les statistiques d'entrées/sorties de chaque table spécifiquement. Voir pg_statio_all_tables pour plus de détails.
pg_statio_sys_tablesIdentique à pg_statio_all_tables, sauf que seules les tables systèmes sont affichées
pg_statio_user_tablesIdentique à pg_statio_all_tables, sauf que seules les tables utilisateur sont affichées
pg_statio_all_indexes Une ligne par index de la base de données courante, montrant les les statistiques d'entrées/sorties de chaque index spécifiquement. Voir pg_statio_all_indexes pour plus de détails.
pg_statio_sys_indexesIdentique à pg_statio_all_indexes, sauf que seuls les index systèmes sont affichés
pg_statio_user_indexesIdentique à pg_statio_all_indexes, sauf que seuls les index utilisateur sont affichés
pg_statio_all_sequences Une ligne par séquence de la base de données courante, montrant les statistiques d'entrées/sorties de chaque séquence spécifiquement. Voir pg_statio_all_sequences pour plus de détails.
pg_statio_sys_sequencesIdentique à pg_statio_all_sequences, sauf que seules les séquences système sont affichées (actuellement, aucune séquence système n'est définie, donc cette vue est toujours vide)
pg_statio_user_sequencesIdentique à pg_statio_all_sequences, sauf que seules les séquences utilisateur sont affichées
pg_stat_user_functions Une ligne par fonction suivie, montrant les statistiques d'exécution de cette fonction. Voir pg_stat_user_functions pour plus de détails.
pg_stat_xact_user_functionsSimilaire à pg_stat_user_functions, mais compte seulement les appels pendant la transaction en cours (qui ne sont pas encore inclus dans pg_stat_user_functions)

Les statistiques par index sont particulièrement utiles pour déterminer les index utilisés et leur efficacité.

Les vues pg_statio_ sont principalement utiles pour déterminer l'efficacité du cache tampon. Quand le nombre de lectures disques réelles est plus petit que le nombre de récupérations valides par le tampon, alors le cache satisfait la plupart des demandes de lecture sans faire appel au noyau. Néanmoins, ces statistiques ne nous donnent pas l'histoire complète : à cause de la façon dont PostgreSQL gère les entrées/sorties disque, les données qui ne sont pas dans le tampon de PostgreSQL pourraient toujours résider dans le tampon d'entrées/sorties du noyau et pourraient, du coup, être toujours récupérées sans nécessiter une lecture physique. Les utilisateurs intéressés pour obtenir des informations plus détaillées sur le comportement des entrées/sorties dans PostgreSQL sont invités à utiliser le récupérateur de statistiques de PostgreSQL avec les outils du système d'exploitation permettant une vue de la gestion des entrées/sorties par le noyau.

Tableau 27.3. Vue pg_stat_activity

ColonneTypeDescription
datidoidOID de la base de données auquel ce processus serveur est connecté
datnamenameNom de la base de données auquel ce processus serveur est connecté
pidintegerIdentifiant du processus serveur
usesysidoidOID de l'utilisateur connecté à ce processus serveur
usenamenameNom de l'utilisateur connecté à ce processus serveur
application_nametextNom de l'application connectée à ce processus serveur
client_addrinetAdresse IP du client pour ce processus serveur. Si ce champ est vide, cela indique soit que le client est connecté via un socket Unix sur la machine serveur soit qu'il s'agit d'un processus interne tel qu'autovacuum.
client_hostnametextNom d'hôte du client connecté, comme reporté par une recherche DNS inverse sur client_addr. Ce champ ne sera rempli que pour les connexions IP, et seulement quand log_hostname est activé.
client_portintegerNuméro de port TCP que le client utilise pour communiquer avec le processus serveur, ou -1 si un socket Unix est utilisé.
backend_starttimestamp with time zoneHeure de démarrage du processus. Pour les processus backends, c'est l'heure où le client s'est connecté au serveur.
xact_starttimestamp with time zoneHeure de démarrage de la transaction courante du processus, ou NULL si aucune transaction n'est active. Si la requête courante est la première de sa transaction, cette colonne a la même valeur que la colonne query_start.
query_starttimestamp with time zoneHeure à laquelle la requête active a été démarrée, ou si state ne vaut pas active, quand la dernière requête a été lancée.
state_changetimestamp with time zoneHeure à laquelle l'état (state) a été modifié en dernier
wait_event_typetextType de l'événement pour lequel le processus est en attente  sinon NULL. Les valeurs possibles sont :
  • LWLock : Le processus attend un verrou léger. Ce type de verrou protège une structure de données en mémoire partagée. wait_event contiendra un nom identifiant le but du verrou léger. (Certains verrous ont des noms spécifiques ; d'autres font partie d'un groupe de verrous ayant chacun un but similaire.)

  • Lock : Le processus attend un verrou lourd. Les verrous lourds, connus aussi en tant que verrous du gestionnaire de verrous ou plus simplement verrous, protègent principalement des objets visibles au niveau SQL, comme les tables. Néanmoins, ils sont aussi utilisés pour assurer une exclusion mutuelle pour certaines opérations internes comme l'agrandissement d'une relation. wait_event identifie le type de verrou attendu.

  • BufferPin : Le processus serveur attend d'accéder à un tampon de données lors d'une période où aucun autre processus ne peut examiner ce tampon. Les attentes sur des tampons peuvent rétractées si un autre processus détient un curseur ouvert qui a lu des données dans le tampon en question.

  • Activity : Le processus serveur est en attente. Ceci est utilisé par les processus système attendant une activité dans leur boucle principale de traitement. wait_event identifiera le point d'attente spécifique.

  • Extension : Le processus serveur est en attente d'activité dans une extension. Cette catégorie est utile pour que les modules puissent tracer des points d'attente.

  • Client : Le processus serveur est en attente d'activité d'une application utilisateur sur un socket. Autrement dit, le serveur attend la venue d'une activité indépendante à ses traitements internes. wait_event identifiera le point d'attente spécifique.

  • IPC : Le processus serveur est une attente d'une activité d'un autre processus serveur. wait_event identifiera le point d'attente spécifique.

  • Timeout : Le processus serveur est en attente de l'expiration d'un délai. wait_event identifiera le point d'attente spécifique.

  • IO : Le processus serveur est en attente de la fin d'une opération disque. wait_event identifiera le point d'attente spécifique.

wait_eventtextNom de l'événement d'attente si le processus est en attente, NULL dans le cas contraire. Voir Tableau 27.4 pour plus de détails.
statetextÉtat général du processus serveur. Les valeurs possibles sont :
  • active : le processus serveur exécute une requête.

  • idle : le processus serveur est en attente d'une commande par le client.

  • idle in transaction : le processus serveur est en transaction, mais n'est pas en train d'exécuter une requête.

  • idle in transaction (aborted) : l'état est similaire à idle in transaction, à la différence qu'une des instructions de la transaction a généré une erreur.

  • fastpath function call : le processus serveur exécute une fonction fast-path.

  • disabled : cet état est affiché si track_activities est désactivé pour ce processus serveur.

backend_xidxidIdentifiant de transaction de haut niveau de ce processus, si disponible.
backend_xminxidL'horizon xmin de ce processus.
querytextTexte de la requête la plus récente pour ce processus serveur. Si state vaut active, alors ce champ affiche la requête en cours d'exécution. Dans tous les autres cas, il affichera la dernière requête à avoir été exécutée. Par défaut, le texte de la requête est tronqué à 1024 octets. Cette valeur peut être modifiée avec le paramètre track_activity_query_size.
backend_typetextType du processus actuel. Les types possibles sont logical replication launcher, logical replication worker, parallel worker, background writer, client backend, checkpointer, startup, walreceiver, walsender et walwriter. De plus, les background workers enregistrés par les extensions pourraient avoir des types supplémentaires.

La vue pg_stat_activity aura une ligne par processus serveur, montrant des informations liées à l'activité courante de ce processus.

Note

Les colonnes wait_event et state sont indépendantes. Si un processus serveur est dans l'état active, il pourrait, ou non, être en attente (waiting) d'un événement. Si l'état est active et si wait_event est différent de NULL, cela signifie qu'une requête est en cours d'exécution, mais que cette exécution est bloquée quelque part dans le système.

Tableau 27.4. Description de wait_event

Type d'événement d'attenteNom d'événement d'attenteDescription
LWLockShmemIndexLockAttente pour trouver ou allouer de l'espace en mémoire partagée.
OidGenLockAttente pour allouer ou affecter un OID.
XidGenLockAttente pour allouer ou affecter un identifiant de transaction.
ProcArrayLockAttente pour obtenir une image de la base ou pour effacer un identifiant de transaction à la fin de la transaction.
SInvalReadLockAttente pour récupérer ou supprimer des messages à partir de la queue partagée d'invalidation.
SInvalWriteLockAttente pour ajouter un message dans la queue partagée d'invalidation.
WALBufMappingLockAttente pour replacer un bloc dans les tampons des journaux de transactions.
WALWriteLockAttente pour l'écriture des tampons de journaux de transactions sur disque.
ControlFileLockAttente pour lire ou mettre à jour le fichier contrôle ou pour créer un nouveau journal de transactions.
CheckpointLockAttente pour l'exécution d'un checkpoint.
CLogControlLockAttente pour lire ou mettre à jour le statut de transaction.
SubtransControlLockAttente pour lire ou mettre à jour les informations de sous- transactions.
MultiXactGenLockAttente pour lire ou mettre à jour l'état partagé multixact.
MultiXactOffsetControlLockAttente pour lire ou mettre à jour les correspondances de décalage multixact.
MultiXactMemberControlLockAttente pour lire ou mettre à jour les correspondances de membre multixact.
RelCacheInitLockAttente pour lire ou écrire le fichier d'initialisation du cache de relations.
CheckpointerCommLockAttente pour gérer les demandes fsync.
TwoPhaseStateLockAttente pour lire ou mettre à jour l'état des transactions préparées.
TablespaceCreateLockAttente pour créer ou supprimer le tablespace.
BtreeVacuumLockAttente pour lire ou mettre à jour les informations relatives au vacuum pour un index Btree.
AddinShmemInitLockAttente pour gérer l'allocation d'espace en mémoire partagée.
AutovacuumLockAutovacuum worker ou launcher en attente de mise à jour ou de lecture de l'état actuel des autovacuum worker.
AutovacuumScheduleLockAttente pour s'assurer que la table sélectionnée pour un vacuum a justement besoin d'un vacuum.
SyncScanLockAttente pour obtenir l'emplacement de début d'un parcours d'une table dans le cas de parcours synchronisés.
RelationMappingLockAttente pour mettre à jour le fichier de correspondance des relations utilisé pour enregistrer la correspondance objet logique vers objet physique.
AsyncCtlLockAttente pour lire ou mettre à jour l'état partagé de notification.
AsyncQueueLockAttente pour lire ou mettre à jour les messages de notification.
SerializableXactHashLockAttente pour récupérer ou enregistrer des informations sur les transactions sérialisables.
SerializableFinishedListLockAttente pour accéder à la liste des transactions sérialisées terminées.
SerializablePredicateLockListLockAttente pour réaliser une opération sur une liste de verrous détenus par les transactions sérialisées.
OldSerXidLockAttente pour lire ou enregistrer des transactions sérialisées en conflit.
SyncRepLockAttente pour lire ou mettre à jour des informations sur les réplicas synchrones.
BackgroundWorkerLockAttente pour lire ou mettre à l'état d'un background worker.
DynamicSharedMemoryControlLockAttente pour lire ou mettre à jour l'état de la mémoire partagée dynamique.
AutoFileLockAttente pour mettre à jour le fichier postgresql.auto.conf.
ReplicationSlotAllocationLockAttente pour allouer ou libérer un slot de réplication.
ReplicationSlotControlLockAttente pour lire ou mettre à jour l'état d'un slot de réplication.
CommitTsControlLockAttente pour lire ou mettre à jour les horodatages de validation des transactions.
CommitTsLockAttente pour lire ou mettre à jour la dernière valeur d'horodatage de transaction.
ReplicationOriginLockAttente pour configurer, supprimer ou utiliser une origine de réplication.
MultiXactTruncationLockAttente pour lire ou tronquer une information multixact.
OldSnapshotTimeMapLockAttente de lecture ou mise à jour d'informations de contrôle d'une ancienne image de base.
LogicalRepWorkerLockAttente d'une action sur le processus worker de la réplication logique pour se terminer.
CLogTruncationLockAttente de l'exécution de txid_status ou de la mise à jour de l'identifiant le plus ancien disponible.
WrapLimitsVacuumLockAttente de la mise à jour des limites sur la consommation des identifiants de transactions et de multixact.
NotifyQueueTailLockAttente de la mise à jour des limites sur le stockage des messages de notification.
clogAttente d'I/O sur un tampon clog (statut de transaction).
commit_timestampAttente d'I/O sur un tampon d'horodatage de validation de transaction.
subtransAttente d'I/O sur un tampon de sous-transaction.
multixact_offsetAttente d'I/O sur un tampon de décalage multixact.
multixact_memberAttente d'I/O sur un tampon de membre multixact.
asyncAttente d'I/O sur un tampon async (notify).
oldserxidAttente d'I/O sur un tampon oldserxid.
wal_insertAttente pour insérer un WAL dans un tampon mémoire.
buffer_contentAttente pour lire ou écrire un bloc de données en mémoire.
buffer_ioAttente d'I/O sur un bloc de données.
replication_originAttente pour lire ou mettre à jour le progrès de la réplication.
replication_slot_ioAttente d'I/O sur un slot de réplication.
procAttente pour lire ou mettre à jour l'information de verrou par chemin rapide (fast-path lock).
buffer_mappingAttente pour associer un bloc de données avec un tampon dans le groupe de tampons.
lock_managerAttente pour ajouter ou examiner les verrous des processus, ou attente pour joindre ou quitter un groupe de verrouillage (utilisé par les requêtes parallélisées).
predicate_lock_managerAttente pour ajouter ou examiner les infirmations sur les verrous de prédicat.
serializable_xactAttente pour réaliser une opération sur une transaction sérialisable dans une requête parallélisée.
parallel_query_dsaAttente du verrou d'allocation de la mémoire partagée dynamique pour les requêtes dynamiques.
tbmAttente du verrou sur l'itérateur partagé TBM.
parallel_appendAttente pour sélectionner le sous-plan suivant pendant l'exécution du plan Parallel Append
parallel_hash_joinAttente pour allouer ou changer une portion de la mémoire ou pour mettre à jour les compteurs pendant l'exécution d'un Parallel Hash du plan d'exécution.
LockrelationAttente pour acquérir un verrou sur une relation.
extendAttente pour étendre une relation.
frozenidAttente pour mettre à jour pg_database.datfrozenxid et pg_database.datminmxid.
pageAttente pour acquérir un verrou sur une page d'une relation.
tupleAttente pour acquérir un verrou sur une ligne.
transactionidAttente de la fin d'une transaction.
virtualxidAttente pour acquérir un verrou de transaction virtuel.
speculative tokenAttente pour acquérir un verrou d'insertion spéculatif.
objectAttente pour acquérir un verrou sur un objet de base qui n'est pas une relation.
userlockAttente pour acquérir un verrou utilisateur.
advisoryAttente pour acquérir un verrou utilisateur informatif.
BufferPinBufferPinAttente pour acquérir un blocage d'un tampon.
ActivityArchiverMainAttente dans la boucle principale du processus d'archivage.
AutoVacuumMainAttente dans la boucle principale du processus autovacuum launcher.
BgWriterHibernateAttente du processus background writer, hibernation.
BgWriterMainAttente dans la boucle principale du processus background writer.
CheckpointerMainAttente dans la boucle principale du processus checkpointer.
LogicalApplyMainAttente dans la boucle principale du processus logical apply.
LogicalLauncherMainAttente dans la boucle principale du processus logical launcher.
PgStatMainAttente dans la boucle principale du processus de collecte des statistiques.
RecoveryWalAllAttente de WAL à partir du flux lors de la restauration.
RecoveryWalStreamAttente lorsque les données WAL ne sont pas disponibles à partir de tout type de sources (local, archive ou stream) avant d'essayer de nouveau de récupérer les données WAL lors de la restauration.
SysLoggerMainAttente dans la boucle principale du processus syslogger.
WalReceiverMainAttente dans la boucle principale du processus WAL receiver.
WalSenderMainAttente dans la boucle principale du processus WAL sender.
WalWriterMainAttente dans la boucle principale du processus WAL writer.
ClientClientReadAttente de lecture de données provenant du client.
GSSOpenServerAttente de lecture de données provenant du client lors de l'établissement de la session GSSAPI.
ClientWriteAttente d'écriture de données provenant du client.
LibPQWalReceiverConnectAttente dans le WAL receiver pour établir une connexion avec le serveur distant.
LibPQWalReceiverReceiveAttente dans le WAL receiver pour recevoir des données du serveur distant.
SSLOpenServerAttente du SSL lors d'une tentative de connexion.
WalReceiverWaitStartAttente du processus de démarrage pour envoyer les données initiales de la réplication en flux.
WalSenderWaitForWALAttente de WAL à vider sur disque par le processus WAL sender.
WalSenderWriteDataAttente de toute activité lors du traitement des réponses provenant du WAL receiver dans le processus WAL sender.
ExtensionExtensionAttente dans une extension.
IPCBgWorkerShutdownAttente de l'arrêt d'un background worker.
BgWorkerStartupAttente du démarrage d'un background worker.
BtreePageAttente de la disponibilité du numéro de bloc nécessaire pour continuer un parcours parallélisé d'un index B-tree.
CheckpointDoneAttente de la fin d'un checkpoint.
CheckpointStartAttente du lancement d'un checkpoint.
ClogGroupUpdateAttente du leader pour mettre à jour le statut de transaction à la fin d'une transaction.
ExecuteGatherAttente d'activité d'un processus fils lors de l'exécution d'un nœud Gather.
Hash/Batch/AllocatingAttente de l'élection d'un participant (worker) Parallel Hash pour lui attribuer une table de hachage.
Hash/Batch/ElectingÉlection d'un participant (worker) au Parallel Hash pour lui attribuer une table de hachage.
Hash/Batch/LoadingAttente d'autres participants (workers) au Parallel Hash afin de terminer le chargement d'une table de hachage
Hash/Build/AllocatingAttente qu'un participant (worker) élu au Parallel Hash s'attribue la table de hachage initiale.
Hash/Build/ElectingÉlection d'un participant (worker) au Parallel Hash pour l'attribution de la table de hachage initiale.
Hash/Build/HashingInnerAttente que d'autres participants (worker) au Parallel Hash aient terminé le hachage de la relation interne.
Hash/Build/HashingOuterAttente que d'autres participants (worker) au Parallel Hash aient terminé le partitionnement de la relation externe
Hash/GrowBatches/AllocatingAttente qu'un participant (worker) élu au Parallel Hash s'attribue d'autres lots de traitement.
Hash/GrowBatches/DecidingÉlection d'un participant (worker) au Parallel Hash à la décision de la croissance future des lots de traitements.
Hash/GrowBatches/ElectingÉlection d'un participant (worker) au Parallel Hash pour l'affectation de lots de traitements supplémentaires.
Hash/GrowBatches/FinishingAttente d'un participant (worker) élu au Parallel Hash à la décision de la croissance future des lots de traitements.
Hash/GrowBatches/RepartitioningAttente que d'autres participants (workers) au Parallel Hash aient terminé le repartitionnement.
Hash/GrowBuckets/AllocatingAttente qu'un participant (worker) élu au Parallel Hash ait terminé l'affectation de plus de paquets.
Hash/GrowBuckets/ElectingÉlection d'un participant (worker) au Parallel Hash pour l'affectation de plus de paquets.
Hash/GrowBuckets/ReinsertingAttente que d'autres participants (worker) au Parallel Hash aient terminé d'insérer les lignes dans de nouveaux paquets.
LogicalSyncDataAttente de l'envoi de données du serveur distant en réplication logique pour la synchronisation initiale de tables.
LogicalSyncStateChangeAttente du changement d'état du serveur distant en réplication logique.
MessageQueueInternalAttente de l'attachement dans la queue de messages partagées d'autres processus.
MessageQueuePutMessageAttente de l'écriture d'un message du protocole dans une queue de messages partagée.
MessageQueueReceiveAttente de la réception d'octets d'une queue de messages partagée.
MessageQueueSendAttente de l'envoi d'octets provenant d'une queue de messages partagé.
ParallelBitmapScanAttente de l'initialisation d'un parcours bitmap parallélisé.
ParallelCreateIndexScanAttente de la fin du parcours de table pour les workers d'un CREATE INDEX parallélisés.
ParallelFinishAttente la fin du traitement de processus workers parallélisés.
ProcArrayGroupUpdateAttente de l'effacement de l'identifiant de transactions en fin de transaction par le leader du groupe.
PromoteAttente de la promotion du standby.
ReplicationOriginDropAttente du placement en inactivité de l'origine de réplication pour sa suppression.
ReplicationSlotDropAttente du placement en inactivité d'un slot de réplication pour sa suppression.
SafeSnapshotAttente d'un snapshot pour une transaction READ ONLY DEFERRABLE.
SyncRepAttente de confirmation du serveur distant lors d'une réplication synchrone.
TimeoutBaseBackupThrottleAttente d'une sauvegarde de base provoquée par un délai d'attente dépassé pendant une forte activité système.
PgSleepAttente du processus ayant appelé pg_sleep.
RecoveryApplyDelayAttente lors de l'application des WAL à la restauration pour respecter le délai configuré.
RegisterSyncRequestAttente lors de l'envoi des demandes de synchronisation au checkpointer car la queue de demandes est remplie.
IOBufFileReadAttente de lecture à partir d'un fichier en cache.
BufFileWriteAttente d'écriture dans un fichier en cache.
ControlFileReadAttente d'une lecture du fichier de contrôle.
ControlFileSyncAttente que le fichier de contrôle atteigne un stockage stable.
ControlFileSyncUpdateAttente d'une mise à jour pour que le fichier de contrôle atteigne un stockage stable.
ControlFileWriteAttente d'une écriture dans le fichier de contrôle.
ControlFileWriteUpdateAttente d'une écriture pour mettre à jour le fichier de contrôle.
CopyFileReadAttente d'une lecture lors d'une opération de copie de fichier.
CopyFileWriteAttente d'une écriture lors d'une opération de copie de fichier.
DataFileExtendAttente de l'extension d'un fichier de données.
DataFileFlushAttente qu'un fichier de données atteignent un stockage stable.
DataFileImmediateSyncAttente de la synchronisation immédiate d'un fichier de données dans un stockage table.
DataFilePrefetchAttente d'une prélecture asynchrone d'un fichier de données.
DataFileReadAttente d'une lecture à partir d'un fichier de données.
DataFileSyncAttente que les changements d'un fichier de données atteignent le stockage stable.
DataFileTruncateAttente de la troncature d'un fichier de données.
DataFileWriteAttente d'une écriture sur un fichier de données.
DSMFillZeroWriteAttente de l'écriture de zéro octet dans un fichier de mémoire partagée dynamique.
LockFileAddToDataDirReadAttente d'une lecture lors de l'ajout d'une ligne dans le fichier de verrouillage du répertoire de données.
LockFileAddToDataDirSyncAttente que les données atteignent un stockage stable lors de l'ajout d'une ligne dans le fichier de verrouillage du répertoire de données.
LockFileAddToDataDirWriteAttente d'une écriture lors de l'ajout d'une ligne dans le fichier de verrouillage du répertoire de données.
LockFileCreateReadAttente d'une lecture lors de la création du fichier de verrouillage du répertoire de données.
LockFileCreateSyncAttente que les données atteignent le stockage stable lors de la création du fichier de verrouillage du répertoire de données.
LockFileCreateWriteAttente d'une écriture lors de la création du fichier de verrouillage du répertoire de données.
LockFileReCheckDataDirReadAttente d'une lecture lors de la vérification du fichier de verrouillage du répertoire de données.
LogicalRewriteCheckpointSyncAttente que les correspondances de réécriture logique atteignent un stockage stable lors d'un checkpoint.
LogicalRewriteMappingSyncAttente que la correspondance des données atteignent un stockage stable lors d'une réécriture logique.
LogicalRewriteMappingWriteAttente d'une réécriture des correspondances des données lors d'une réécriture logique.
LogicalRewriteSyncAttente que les correspondances de réécriture logique atteignent un stockage stable.
LogicalRewriteTruncateAttente du vidage des données de correspondance lors d'une réécriture logique.
LogicalRewriteWriteAttente d'une écriture des correspondances de réécriture logique.
RelationMapReadAttente d'une lecture dans le fichier de correspondance des relations.
RelationMapSyncAttente que le fichier de correspondance des relations atteigne un stockage stable.
RelationMapWriteAttente d'une écriture dans le fichier de correspondance des relations.
ReorderBufferReadAttente d'une lecture lors de la gestion du tri des tampons.
ReorderBufferWriteAttente d'une écriture lors de la gestion du tri des tampons.
ReorderLogicalMappingReadAttente d'une lecture d'une correspondance logique lors de la gestion du tri des tampons.
ReplicationSlotReadAttente d'une lecture à partir d'un fichier de contrôle pour un slot de réplication.
ReplicationSlotRestoreSyncAttente qu'un fichier de contrôle pour un slot de réplication atteigne le stockage stable lors de sa restauration en mémoire.
ReplicationSlotSyncAttente qu'un fichier de contrôle pour un slot de réplication atteigne le stockage stable.
ReplicationSlotWriteAttente d'une écriture dans un fichier de contrôle pour un slot de réplication.
SLRUFlushSyncAttente que les données SLRU atteignent un stockage stable lors d'un checkpoint ou lors d'un arrêt du serveur de bases de données.
SLRUReadAttente d'une lecture à partir d'un bloc SLRU.
SLRUSyncAttente que les données SLRU atteignent un stockage stable suivant l'écriture d'un bloc.
SLRUWriteAttente d'une écriture dans un bloc SLRU.
SnapbuildReadAttente d'une lecture pour un snapshot du catalogue historique sérialisé.
SnapbuildSyncAttente que le snapshot du catalogue historique sérialisé atteigne un stockage stable.
SnapbuildWriteAttente d'une écriture dans le snapshot du catalogue historique sérialisé.
TimelineHistoryFileSyncAttente que le fichier d'historique des timelines reçu via le flux de réplication atteigne un stockage stable.
TimelineHistoryFileWriteAttente d'une écriture dans le fichier d'historique des timelines reçu via le flux de réplication.
TimelineHistoryReadAttente d'une lecture dans le fichier d'historique des timelines reçu via le flux de réplication.
TimelineHistorySyncAttente qu'un nouveau fichier d'historique des timelines atteigne le stockage stable.
TimelineHistoryWriteAttente d'une écriture d'un fichier d'historique des timelines.
TwophaseFileReadAttente d'une lecture dans un fichier d'état pour le 2PC.
TwophaseFileSyncAttente que le fichier d'état du 2PC atteigne un stockage stable.
TwophaseFileWriteAttente d'une écriture dans un fichier d'état pour le 2PC.
WALBootstrapSyncAttente que le WAL atteigne le stockage stable pendant l'initialisation (bootstrapping).
WALBootstrapWriteAttente d'une écriture d'une page WAL lors de l'initialisation (bootstrapping).
WALCopyReadAttente d'une lecture lors de la création d'un nouveau segment WAL en copiant un existant.
WALCopySyncAttente qu'un nouveau segment WAL créé, en copiant un existant, atteigne un stockage stable.
WALCopyWriteAttente d'une écriture lors de la création d'un nouveau segment WAL par copie d'un existant.
WALInitSyncAttente qu'un fichier WAL nouvellement initialisée atteigne le stockage stable.
WALInitWriteAttente d'une écriture lors de l'initialisation d'un nouveau fichier WAL.
WALReadAttente d'une lecture à partir d'un fichier WAL.
WALSenderTimelineHistoryReadAttente d'une lecture dans un fichier d'historique de timelines lors de la commande timeline du walsender.
WALSyncAttente du stockage d'un fichier WAL.
WALSyncMethodAssignAttente que les données atteignent un stockage stable lors de l'affectation de la méthode de synchronisation des WAL.
WALWriteAttente d'une écriture dans un fichier WAL.

Note

Pour les tranches enregistrées par les extensions, le nom est indiqué par l'extension et peut être affiché comme wait_event. Il est tout à fait possible que l'utilisateur ait enregistré la tranche dans un des processus serveur (en allouant de la mémoire partagée dynamique), auquel cas les autres processus serveur n'ont pas cette information. Dans ce cas, le texte extension est affiché.

Voici un exemple de visualisation d'événements d'attente :

SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event is NOT NULL;
pid  | wait_event_type |  wait_event
------+-----------------+---------------
2540 | Lock            | relation
6644 | LWLock          | ProcArrayLock
(2 rows)
    

Tableau 27.5. Vue pg_stat_replication

ColonneTypeDescription
pidintegerIdentifiant du processus d'envoi des WAL
usesysidoidOID de l'utilisateur connecté à ce processus
usenamenameNom de l'utilisateur connecté à ce processus
application_nametextNom de l'application qui est connectée à ce processus
client_addrinetAdresse IP du client connecté à ce processus. Si ce champ est NULL, ceci signifie que le client est connecté via un socket Unix sur la machine serveur.
client_hostnametextNom de l'hôte du client connecté, comme renvoyé par une recherche DNS inverse sur client_addr. Ce champ sera uniquement non NULL pour les connexions IP, et seulement si log_hostname est activé.
client_portintegerNuméro du port TCP que le client utilise pour la communication avec ce processus, ou -1 si un socket Unix est utilisée.
backend_starttimestamp with time zoneHeure à laquelle ce processus a été démarré, exemple, lorsque le client s'est connecté à ce processus expéditeur de WALs.
backend_xminxidL'horizon xmin de ce serveur standby renvoyé par hot_standby.
statetextÉtat courant du processus walsender. Les valeurs possibles sont :
  • startup : Le processus walsender est en cours de démarrage.

  • catchup : Le secondaire connecté au processus walsender est en cours de rattrapage du primaire.

  • streaming : Ce processus walsender envoie les modifications au serveur secondaire connecté depuis que ce dernier a rattrapé le primaire.

  • backup : Ce processus walsender est en train d'envoyer une sauvegarde.

  • stopping : Ce processus walsender est en cours d'arrêt.

sent_lsnpg_lsnLa position de la dernière transaction envoyée sur cette connexion
write_lsnpg_lsnLa position de la dernière transaction écrite sur disque par ce serveur standby
flush_lsnpg_lsnLa position de la dernière transaction vidée sur disque par ce serveur standby
replay_lsnpg_lsnLa position de la dernière transaction rejouée dans la base de données par ce serveur standby
write_lagintervalDurée passée entre le vidage local des WAL récents et la réception de notification que ce serveur secondaire les a bien écrites (mais pas encore vidées ou appliquées). Ceci peut être utilisé pour mesurer le délai que le niveau remote_write de synchronous_commit coûterait lors de la validation si ce serveur était configuré comme un serveur secondaire synchrone.
flush_lagintervalDurée passée entre le vidage local des WAL récents et la réception de notification que ce serveur secondaire les a bien écrites et vidées sur disque (mais pas encore appliquées). Ceci peut être utilisé pour mesurer le délai que le niveau on de synchronous_commit coûterait lors de la validation si ce serveur était configuré comme un serveur secondaire synchrone.
replay_lagintervalDurée passée entre le vidage local des WAL récents et la réception de notification que ce serveur secondaire les a bien écrites, vidées sur disque et appliquées. Ceci peut être utilisé pour mesurer le délai que le niveau remote_apply de synchronous_commit coûterait lors de la validation si ce serveur était configuré comme un serveur secondaire synchrone.
sync_priorityintegerPriorité de ce serveur standby pour être choisi comme le serveur standby synchrone dans une réplication synchrone basée sur la priorité. Ceci n'a pas d'effet sur une réplication synchrone basée sur un quorum.
sync_statetextÉtat synchrone de ce serveur standby. Les valeurs possibles sont :
  • async : Ce serveur standby est asynchrone.

  • potential : Ce serveur standby est maintenant asynchrone, mais peut potentiellement devenir synchrone si un des synchrones échoue.

  • sync : Ce serveur standby est synchrone.

  • quorum : Ce serveur standby est considéré comme un candidat dans les standbys avec quorum.

reply_timetimestamp with time zoneHorodatage d'envoi du dernier message de réponse reçu par le standby

La vue pg_stat_replication contiendra une ligne par processus d'envoi de WAL, montrant des statistiques sur la réplication avec le serveur standby connecté au processus. Seuls les serveurs standby directement connectés sont listés ; aucune information n'est disponible concernant les serveurs standby en aval.

Les délais rapportés dans la vue pg_stat_replication sont des mesures de temps prises pour l'écriture, le vidage sur disque et le rejeu des données récentes des WAL et pour que le serveur d'envoi soit mis au courant. Ces durées représentent le délai de validation qui a été (ou aurait été) introduit par chaque niveau de validation synchrone si le serveur distant était configuré comme un standby synchrone. Pour un standby asynchrone, la colonne replay_lag renvoie une approximation du délai avant que les transactions récentes deviennent visibles aux requêtes. Si le serveur standby a complètement rattrapé le serveur d'envoi et qu'il n'y a plus d'activité en écriture (donc plus de nouveaux enregistrements dans les journaux de transactions), les délais mesurés le plus récemment continueront à être affichés pendant un court instant, puis seront mis à NULL.

Les délais fonctionnent automatiquement pour la réplication physique. Les plugins de décodage logique pourraient émettre des messages de trace. S'ils ne le font pas, le mécanisme de trace affichera simplement une valeur NULL.

Note

Les délais rapportés ne sont pas des prédictions du temps pris par le serveur standby pour rattraper le serveur d'envoi en constatant le taux actuel de rejeu. Un tel système afficherait des temps similaires alors que de nouveaux journaux de transactions seraient générés, mais différeraient lorsque le serveur deviendrait inactif. En particulier, quand le serveur standby a complètement rattrapé le serveur d'envoi, pg_stat_replication affiche le temps pris pour écrire, vider sur disque et rejouer l'emplacement de l'enregistrement le plus récemment rapporté plutôt que zéro comme certains utilisateurs pourraient s'y attendre. Ceci est cohérent avec le but de mesurer les délais de la validation synchrone et de la visibilité des transactions pour les transactions récentes en écriture. Pour réduire la confusion pour les utilisateurs s'attendant à un autre modèle de retard, les colonnes de retard sont réinitialisées à NULL après un court moment sur un système entièrement à jour et complètement inactif. Les systèmes de supervision devraient choisir s'ils souhaitent représenter ces colonnes comme des données manquantes, des données à zéro, ou continuer à afficher la dernière valeur connue.

Tableau 27.6. Vue pg_stat_wal_receiver

ColonneTypeDescription
pidintegerIdentifiant du processus de réception des enregistrements de transaction
statustextStatut d'activité du processus walreceiver
receive_start_lsnpg_lsnPremière position dans le journal de transaction utilisée quand walreceiver a été démarré
receive_start_tliintegerPremière ligne de temps utilisée quand walreceiver a été démarré
received_lsnpg_lsnDernière position des journaux de transactions, déjà reçue et écrite sur disque, la valeur initiale de ce champ étant la première position dans les journaux de transactions utilisée lors du démarrage du walreceiver
received_tliintegerNuméro de la ligne de temps de la dernière position des journaux de transactions, déjà reçue et écrite sur disque, la valeur initiale de ce champ étant la ligne de temps de la première position dans les journaux de transactions utilisée lors du démarrage du walreceiver
last_msg_send_timetimestamp with time zoneHorodatage d'envoi du dernier message reçu à partir du walsender
last_msg_receipt_timetimestamp with time zoneHorodatage de la réception du dernier message à partir du walsender
latest_end_lsnpg_lsnDernière position de transaction reportée par le walsender associé
latest_end_timetimestamp with time zoneHorodatage de la dernière position de transaction reportée par le walsender associé
slot_nametextNom du slot de réplication utilisé par ce walreceiver
sender_hosttext Hôte de l'instance PostgreSQL auquel ce processus « wal receiver » est connecté. Il peut s'agir d'un nom d'hôte, d'une adresse IP ou d'un chemin d'accès à un répertoire si la connexion se fait via un socket Unix (dans ce dernier cas, il est facile de le distinguer car il s'agira toujours d'un chemin absolu débutant par le caractère (/).)
sender_portinteger Numéro de port de l'instance PostgreSQL auquel wal receiver est connecté.
conninfotext Chaîne de connexion utilisée par ce wal receiver, les informations sensibles au niveau sécurité sont cachés.

La vue pg_stat_wal_receiver contiendra seulement une ligne, affichant les statistiques du walreceiver du serveur de connexion.

Tableau 27.7. Vue pg_stat_subscription

ColonneTypeDescription
subidoidOID de la souscription
subnametextNom de la souscription
pidintegerIdentifiant du processus worker de la souscription
relidOidOID de la relation que le processus worker synchronise ; NULL pour le processus worker apply principal
received_lsnpg_lsnDernier emplacement de journal de transactions reçu, la valeur initiale de ce champ étant 0
last_msg_send_timetimestamp with time zoneHorodatage d'envoi du dernier message reçu à partir du walsender original
last_msg_receipt_timetimestamp with time zoneHorodatage de réception du dernier message reçu du walsender original
latest_end_lsnpg_lsnDernier emplacement des journaux de transactions rapporté par le walsender original
latest_end_timetimestamp with time zoneHorodatage du dernier emplacement de journal de transactions rapporté par le walsender original

La vue pg_stat_subscription contiendra une ligne par souscription du worker principal (avec le PID NULL si le processus worker n'est pas en cours d'exécution), et des lignes supplémentaires pour les workers gérant la copie initiale de données des tables souscrites.

Tableau 27.8. Vue pg_stat_ssl

ColonneTypeDescription
pidintegerID du processus backend ou du processus d'envoi de WAL
sslbooleanTrue si SSL est utilisé dans cette connexion
versiontextVersion de SSL utilisée, ou NULL si SSL n'est pas utilisé pour cette connexion
ciphertextNom du chiffrement SSL utilisé, ou NULL si SSL n'est pas utilisé pour cette connexion
bitsintegerNombre de bits dans l'algorithme de chiffrement utilisé, ou NULL si SSL n'est pas utilisé pour cette connexion
compressionbooleanTrue si la compression SSL est utilisée, false sinon, ou NULL si SSL n'est pas utilisé pour cette connexion
client_dntextChamp Distinguished Name (DN) utilisé par le certificat du client, ou NULL si aucun certificat client n'a été fourni ou si SSL n'est pas utilisé pour cette connexion. Ce champ est tronqué si le champ DN est plus long que NAMEDATALEN (64 caractères dans une compilation standard).
client_serialnumericNuméro de série du certificat client ou NULL si aucun certificat n'a été fourni ou si le SSL n'est pas utilisé dans cette connexion. La combinaison du numéro de série du certification et de l'émetteur du certificat identifie de façon unique un certificat (sauf si l'émetteur réutilise par erreur les numéros de série).
issuer_dntextDN de l'émetteur du certificat client ou NULL si aucun certificat client n'a été fourni ou si le SSL n'est pas utilisé dans cette connexion. Ce champ est tronqué comme client_dn.

La vue pg_stat_ssl contiendra une ligne par backend ou processus d'envoi de WAL, montrant des statistiques sur l'usage de SSL dans cette connexion. Elle peut être jointe à pg_stat_activity ou pg_stat_replication sur la colonne pid pour obtenir plus de détails sur la connexion.

Tableau 27.9. Vue pg_stat_gssapi

ColonneTypeDescription
pidintegerIdentifiant du processus serveur
gss_authenticatedbooleanTrue si l'authentification GSSAPI a été utilisée pour cette connexion
principaltextPrincipal utilisé pour authentifier cette connexion, ou NULL si GSSAPI n'a pas été utilisé pour authentifier cette connexion. Ce champ est tronqué si le principal est plus long que NAMEDATALEN (64 caractères dans une construction standard).
encryptedbooleanTrue si le chiffrement GSSAPI est utilisé avec cette connexion

La vue pg_stat_gssapi contient une ligne par processus serveur, affichant des informations sur l'utilisation de GSSAPI pour cette connexion. Elle peut être jointe à pg_stat_activity ou pg_stat_replication sur la colonne pid pour obtenir plus de détails sur la connexion.

Tableau 27.10. Vue pg_stat_archiver

ColonneTypeDescription
archived_countbigintNombre de journaux de transactions archivés avec succès
last_archived_waltextNom du dernier journal de transaction archivé avec succès
last_archived_timetimestamp with time zoneHorodatage de la dernière opération d'archivage réussie
failed_countbigintNombre d'échecs d'archivage de journaux de transactions
last_failed_waltextNom du journal de transactions correspondant au dernier archivage échoué
last_failed_timetimestamp with time zoneHorodatage de la dernière opération d'archivage échouée
stats_resettimestamp with time zoneHorodatage de la dernière réinitialisation de ces statistiques

La vue pg_stat_archiver aura toujours une seule ligne contenant les données du processus d'archivage de l'instance.

Tableau 27.11. Vue pg_stat_bgwriter

ColonneTypeDescription
checkpoints_timedbigintNombre de checkpoints planifiés ayant été effectués
checkpoints_reqbigintNombre de checkpoints demandés ayant été effectués
checkpoint_write_timedouble precision Temps total passé dans la partie des checkpoints où les fichiers sont écrits sur disque, en millisecondes.
checkpoint_sync_timedouble precision Temps total passé dans la partie des checkpoints où les fichiers sont synchronisés sur le disque, en millisecondes.
buffers_checkpointbigintNombre de tampons écrits durant des checkpoints
buffers_cleanbigintNombre de tampons écrits par le processus background writer (processus d'écriture en tâche de fond)
maxwritten_cleanbigintNombre de fois que le processus background writer a arrêté son parcours de nettoyage pour avoir écrit trop de tampons
buffers_backendbigintNombre de tampons écrits directement par un processus serveur
buffers_backend_fsyncbigintNombre de fois qu'un processus serveur a du exécuter son propre appel à fsync (normalement le processus background writer gère ces appels même quand le processus serveur effectue sa propre écriture)
buffers_allocbigintNombre de tampons alloués
stats_resettimestamp with time zoneDernière fois que ces statistiques ont été réinitialisées

La vue pg_stat_bgwriter aura toujours une ligne unique, contenant les données globales de l'instance.

Tableau 27.12. Vue pg_stat_database

ColonneTypeDescription
datidoidOID d'une base de données, or 0 for objects belonging to a shared relation
datnamenameNom de cette base de données, or NULL for the shared objects
numbackendsintegerNombre de processus serveur actuellement connectés à cette base de données, or NULL for the shared objects. C'est la seule colonne de cette vue qui renvoie une valeur reflétant l'état actuel ; toutes les autres colonnes renvoient les valeurs accumulées depuis la dernière réinitialisation
xact_commitbigintNombre de transactions de cette base de données qui ont été validées
xact_rollbackbigintNombre de transactions de cette base de données qui ont été annulées
blks_readbigintNombre de blocs disques lus dans cette base de données
blks_hitbigintNombre de fois que des blocs disques étaient déjà dans le cache tampon, et qu'il n'a donc pas été nécessaire de les lire sur disque (cela n'inclut que les accès dans le cache tampon de PostgreSQL, pas dans le cache de fichiers du système d'exploitation).
tup_returnedbigintNombre de lignes retournées par des requêtes dans cette base de données
tup_fetchedbigintNombre de lignes rapportées par des requêtes dans cette base de données
tup_insertedbigintNombre de lignes insérées par des requêtes dans cette base de données
tup_updatedbigintNombre de lignes mises à jour par des requêtes dans cette base de données
tup_deletedbigintNombre de lignes supprimées par des requêtes dans cette base de données
conflictsbigintNombre de requêtes annulées à cause de conflits avec la restauration dans cette base de données. (Les conflits n'arrivent que sur des serveurs de standby ; voir pg_stat_database_conflicts pour plus de détails.)
temp_filesbigintNombre de fichiers temporaires créés par des requêtes dans cette base de données. Tous les fichiers temporaires sont comptabilisés, quel que soit la raison de la création du fichier temporaire (par exemple, un tri ou un hachage) et quel que soit la valeur du paramètre log_temp_files.
temp_bytesbigintQuantité totale de données écrites dans des fichiers temporaires par des requêtes dans cette base de données. Tous les fichiers temporaires sont comptabilisés, quel que soit la raison de la création de ce fichier temporaire, et de la valeur du paramètre log_temp_files.
deadlocksbigintNombre de verrous mortels détectés dans cette base de données
checksum_failuresbigintNombre d'échecs pour la vérification des sommes de contrôle détectés sur cette base de données (ou sur un objet partagé), ou NULL si les sommes de contrôle ne sont pas activées.
checksum_last_failuretimestamp with time zoneHorodatage du dernier échec de vérification de somme de contrôle pour un bloc détecté dans cette base (ou sur un objet partagé), ou NULL si les sommes de contrôle ne sont pas activés.
blk_read_timedouble precisionTemps passé à lire des blocs de donnée dans des fichiers par des processus serveur dans cette base de données, en millisecondes
blk_write_timedouble precisionTemps passé à écrire des blocs de données dans des fichiers par les processus serveur dans cette base de données, en millisecondes
stats_resettimestamp with time zoneDernière fois que ces statistiques ont été réinitialisées

La vue pg_stat_database ne contiendra qu'une ligne pour chaque base de données dans l'instance, plus une pour les objets partagés, montrant ses statistiques globales.

Tableau 27.13. Vue pg_stat_database_conflicts

ColonneTypeDescription
datidoidOID de la base de données
datnamenameNom de cette base de données
confl_tablespacebigintNombre de requêtes dans cette base de données qui ont été annulées suite à la suppression de tablespaces
confl_lockbigintNombre de requêtes dans cette base de données qui ont été annulées suite à des délais dépassés sur des verrouillages
confl_snapshotbigintNombre de requêtes dans cette base de données qui ont été annulées à cause d'instantanés trop vieux
confl_bufferpinbigintNombre de requêtes dans cette base de données qui ont été annulées à cause de tampons verrouillés
confl_deadlockbigintNombre de requêtes dans cette base de données qui ont été annulées à cause de deadlocks

La vue pg_stat_database_conflicts contiendra une ligne par base de données, montrant des statistiques au niveau de chaque base de données concernant les requêtes annulées survenant à cause de conflits avec la restauration sur des serveurs standby. Cette vue contiendra seulement des informations sur les serveurs standby, dans la mesure où aucun conflit ne survient sur les serveurs primaires.

Tableau 27.14. Vue pg_stat_all_tables

ColonneTypeDescription
relidoidOID d'une table
schemanamenameNom du schéma dans lequel se trouve cette table
relnamenameNom de cette table
seq_scanbigintNombre de parcours séquentiels initiés sur cette table
seq_tup_readbigintNombre de lignes vivantes rapportées par des parcours séquentiels
idx_scanbigintNombre de parcours d'index initiés sur cette table
idx_tup_fetchbigintNombre de lignes vivantes rapportées par des parcours d'index
n_tup_insbigintNombre de lignes insérées
n_tup_updbigintNombre de lignes mises à jour (y compris les lignes mises à jour avec HOT)
n_tup_delbigintNombre de lignes supprimées
n_tup_hot_updbigintNombre de lignes mises à jour par HOT (c’est-à-dire sans mises à jour d'index nécessaire)
n_live_tupbigintNombre estimé de lignes vivantes
n_dead_tupbigintNombre estimé de lignes mortes
n_mod_since_analyzebigintNombre estimé de lignes modifiées depuis le dernier ANALYZE sur cette table
last_vacuumtimestamp with time zoneDernière fois qu'une opération VACUUM manuelle a été faite sur cette table (sans compter  VACUUM FULL)
last_autovacuumtimestamp with time zoneDernière fois que le démon autovacuum a exécuté une opération VACUUM sur cette table
last_analyzetimestamp with time zoneDernière fois qu'une opération ANALYZE a été lancée manuellement sur cette table
last_autoanalyzetimestamp with time zoneDernière fois que le démon autovacuum a exécuté une opération ANALYZE sur cette table
vacuum_countbigintNombre de fois qu'une opération VACUUM manuelle a été lancée sur cette table (sans compter VACUUM FULL)
autovacuum_countbigintNombre de fois que le démon autovacuum a exécuté une opération VACUUM manuelle
analyze_countbigintNombre de fois qu'une opération ANALYZE manuelle a été lancée sur cette table
autoanalyze_countbigintNombre de fois que le démon autovacuum a exécuté une opération ANALYZE sur cette table

La vue pg_stat_all_tables contiendra une ligne par table dans la base de données courante (incluant les tables TOAST), montrant les statistiques d'accès pour cette table spécifiquement. Les vues pg_stat_user_tables et pg_stat_sys_tables contiennent les mêmes informations, mais filtrent respectivement les tables utilisateurs et les tables systèmes.

Tableau 27.15. Vue pg_stat_all_indexes

ColonneTypeDescription
relidoidOID de la table pour cet index
indexrelidoidOID de cet index
schemanamenameNom du schéma dans lequel se trouve cet index
relnamenameNom de la table pour cet index
indexrelnamenameNom de cet index
idx_scanbigintNombre de parcours d'index initiés par cet index
idx_tup_readbigintNombre d'entrées d'index retournées par des parcours sur cet index
idx_tup_fetchbigintNombre de lignes vivantes de la table rapportées par des simples parcours d'index utilisant cet index

La vue pg_stat_all_indexes contiendra une ligne pour chaque index dans la base de données courante, montrant les statistiques d'accès sur cet index spécifiquement. Les vues pg_stat_user_indexes et pg_stat_sys_indexes contiennent la même information, mais sont filtrées pour ne montrer respectivement que les index utilisateurs et les index système.

Les index peuvent être utilisés avec un simple parcours d'index, un parcours d'index « bitmap » ou l'optimiseur. Dans un parcours de bitmap, les sorties de plusieurs index peuvent être combinées avec des règles AND ou OR, c'est pourquoi il est difficile d'associer des lectures de lignes individuelles de la table avec des index spécifiques quand un parcours de bitmap est utilisé. Par conséquent, un parcours de bitmap incrémente le(s) valeur(s) de pg_stat_all_indexes. idx_tup_read pour le(s) index qu'il utilise, et incrémente la valeur de pg_stat_all_tables. idx_tup_fetch pour la table, mais il n'affecte pas pg_stat_all_indexes.idx_tup_fetch. L'optimiseur accède également aux index pour vérifier si des constantes fournies sont en dehors des plages de valeurs enregistrées par les statistiques de l'optimiseur car celles-ci peuvent ne pas être à jour.

Note

Les valeurs de idx_tup_read et idx_tup_fetch peuvent être différentes même sans aucune utilisation de parcours de bitmap, car idx_tup_read comptabilise les entrées d'index récupérées de cet index alors que idx_tup_fetch comptabilise le nombre de lignes vivantes rapportées de la table. Le second sera moindre si des lignes mortes ou pas encore validées sont rapportées en utilisant l'index, ou si des lectures de lignes de la table sont évitées grâce à un parcours d'index seul.

Tableau 27.16. Vue pg_statio_all_tables

ColonneTypeDescription
relidoidOID d'une table
schemanamenameNom du schéma dans lequel se trouve cette table
relnamenameNom de cette table
heap_blks_readbigintNombre de blocs disque lus hors cache pour cette table
heap_blks_hitbigintNombre de blocs disque lus dans le cache pour cette table
idx_blks_readbigintNombre de blocs disque lus hors cache pour tous les index de cette table
idx_blks_hitbigintNombre de tampons lus dans le cache pour tous les index de cette table
toast_blks_readbigintNombre de blocs disque lus sur la partie TOAST de cette table (si présente)
toast_blks_hitbigintNombre de tampons récupérés sur la partie TOAST de cette table (si présente)
tidx_blks_readbigintNombre de blocs disque lus sur les index de la partie TOAST de cette table (si présente)
tidx_blks_hitbigintNombre de tampons récupérés sur les index de la partie TOAST de cette table (si présente)

La vue pg_statio_all_tables contiendra une ligne pour chaque table dans la base de données courante (en incluant les tables TOAST), montrant les statistiques d'entrées/sorties de chaque table spécifiquement. Les vues pg_statio_user_tables et pg_statio_sys_tables contiennent la même information, mais sont filtrées pour ne montrer respectivement que les tables utilisateurs et les tables système.

Tableau 27.17. Vue pg_statio_all_indexes

ColonneTypeDescription
relidoidOID de la table pour cet index
indexrelidoidOID de cet index
schemanamenameNom du schéma dans lequel se trouve cet index
relnamenameNom de la table pour cet index
indexrelnamenameNom de cet index
idx_blks_readbigintNombre de blocs disque lus pour cet index
idx_blks_hitbigintNombre de tampons récupérés sur cet index

La vue pg_statio_all_indexes contiendra une ligne pour chaque index dans la base de données courante, montrant les statistiques d'entrées/sorties sur chaque index spécifiquement. Les vues pg_statio_user_indexes et pg_statio_sys_indexes contiennent la même information, mais sont filtrées pour ne montrer respectivement que les tables utilisateur et tables système.

Tableau 27.18. Vue pg_statio_all_sequences

ColonneTypeDescription
relidoidOID de cette séquence
schemanamenameNom du schéma dans lequel se trouve cette séquence
relnamenameNom de cette séquence
blks_readbigintNombre de blocs disque lus pour cette séquence
blks_hitbigintNombre de tampons récupérés pour cette séquence

La vue pg_statio_all_sequences contiendra une ligne pour chaque séquence dans la base de données courante, montrant les statistiques d'entrées/sorties pour chaque séquence spécifiquement.

Tableau 27.19. Vue pg_stat_user_functions

ColonneTypeDescription
funcidoidOID de cette fonction
schemanamenameNom du schéma dans lequel se trouve cette fonction
funcnamenameNom de cette fonction
callsbigintNombre de fois que cette fonction a été appelée
total_timedouble precisionTemps total passé dans cette fonction ainsi que dans toutes les autres fonctions appelées par elle, en millisecondes
self_timedouble precisionTemps total passé dans cette fonction seule, sans inclure les autres fonctions appelées par elle, en millisecondes

La vue pg_stat_user_functions contiendra une ligne pour chaque fonction suivie, montrant les statistiques d'exécution de cette fonction. Le paramètre track_functions contrôle exactement quelles fonctions sont suivies.

27.2.3. Fonctions Statistiques

Une autre façon de regarder les statistiques peut être mise en place en écrivant des requêtes utilisant les mêmes fonctions d'accès sous- jacentes utilisées par les vues standards montrées au-dessus. Pour des détails comme les noms de fonction, veuillez consulter les définitions de ces vues standards. (Par exemple, dans psql vous pouvez utiliser \d+ pg_stat_activity.) Les fonctions d'accès pour les statistiques par base de données prennent comme argument un OID pour identifier sur quelle base de données travailler. Les fonctions par table et par index utilisent un OID de table ou d'index. Les fonctions pour les statistiques par fonctions utilisent un OID de fonction. Notez que seuls les tables, index et fonctions dans la base de données courante peuvent être vus avec ces fonctions.

Les fonctions supplémentaires liées à la récupération de statistiques sont listées dans Tableau 27.20.

Tableau 27.20. Fonctions supplémentaires de statistiques

FonctionType renvoyéDescription
pg_backend_pid()integer Identifiant du processus serveur gérant la session courante.
pg_stat_get_activity(integer)setof record Retourne un enregistrement d'informations sur le processus serveur du PID spécifié, ou un enregistrement pour chaque processus serveur actif dans le système si NULL est spécifié. Les champs retournés sont des sous-ensembles de ceux dans la vue pg_stat_activity.
pg_stat_get_snapshot_timestamp()timestamp with time zone Renvoie l'horodatage de l'instantané courant des statistiques
pg_stat_clear_snapshot()void Supprime l'image statistique courante.
pg_stat_get_xact_blocks_fetched(oid)bigint Renvoie le nombre de demandes de lecture de bloc pour la table ou l'index dans la transaction en cours. Ce nombre soustrait à pg_stat_get_xact_blocks_hit donne le nombre d'appels à la fonction noyau read() ; le nombre de lectures physiques réelles est généralement plus basse grâce au cache au niveau noyau.
pg_stat_get_xact_blocks_hit(oid)bigint Renvoie le nombre de demandes de lecture de bloc pour la table ou l'index dans la transaction en cours, trouvé dans le cache (donc ne déclenchant pas les appels à la fonction noyau read()).
pg_stat_reset()void Remet à zéro tous les compteurs de statistique pour la base de données courante (nécessite les droits super-utilisateur par défaut, mais le droit EXECUTE peut être donné à d'autres pour cette fonction).
pg_stat_reset_shared(text)void Remet à zéro quelques statistiques globales de l'instance, en fonction de l'argument (nécessite les droits super-utilisateur par défaut, mais le droit EXECUTE peut être donné sur cette fonction à d'autres rôles). Appeler pg_stat_reset_shared('bgwriter') réinitialisera tous les compteurs montrés dans la vue pg_stat_bgwriter. Appeler pg_stat_reset_shared('archiver') réinitialisera tous les compteurs indiqués dans la vue pg_stat_archiver.
pg_stat_reset_single_table_counters(oid)void Remet à zéro les statistiques pour une seule table ou index dans la base de données courante (nécessite les droits super-utilisateur par défaut, mais le droit EXECUTE peut être donné à d'autres pour cette fonction).
pg_stat_reset_single_function_counters(oid)void Remet à zéro les statistiques pour une seule fonction dans la base de données courante (nécessite les droits super-utilisateur par défaut, mais le droit EXECUTE peut être donné à d'autres pour cette fonction).

Avertissement

Utiliser pg_stat_reset() réinitialise aussi les compteurs que l'autovacuum utilise pour déterminer quand déclencher une opération VACUUM ou une opération ANALYZE. Réinitialiser ces compteurs peut empêcher l'autovacuum de réaliser un travail pourtant nécessaire, ce qui entrainerait comme conséquence une fragmentation des tables ou des statistiques obsolètes sur les données des tables. Un ANALYZE sur la base est recommandé après avoir réinitialisé les statistiques.

pg_stat_get_activity, la fonction sous-jacente de la vue pg_stat_activity, retourne un ensemble d'enregistrements contenant toute l'information disponible sur chaque processus serveur. Parfois il peut être plus pratique de n'obtenir qu'un sous-ensemble de cette information. Dans ces cas-là, un ensemble plus vieux de fonctions d'accès aux statistiques par processus serveur peut être utilisé ; celle-ci sont montrées dans Tableau 27.21. Ces fonctions d'accès utilisent un numéro d'identifiant du processus serveur, qui va de un au nombre de processus serveur actuellement actifs. La fonction pg_stat_get_backend_idset fournit une manière pratique de générer une ligne pour chaque processus serveur actif pour appeler ces fonctions. Par exemple, pour montrer les PID et requêtes en cours de tous les processus serveur :

SELECT pg_stat_get_backend_pid(s.backendid) AS pid,
   pg_stat_get_backend_activity(s.backendid) AS query
FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s;
    

Tableau 27.21. Fonctions statistiques par processus serveur

FonctionType renvoyéDescription
pg_stat_get_backend_idset()setof integerEnsemble de numéros de processus serveur actuellement actifs (de 1 jusqu'au nombre de processus serveur actifs)
pg_stat_get_backend_activity(integer)textTexte de la requête la plus récente de ce processus serveur
pg_stat_get_backend_activity_start(integer)timestamp with time zoneHeure à laquelle la requête la plus récente a été démarrée
pg_stat_get_backend_client_addr(integer)inetAdresse IP du client connecté à ce processus serveur
pg_stat_get_backend_client_port(integer)integerNuméro de port TCP que le client utilise pour communiquer
pg_stat_get_backend_dbid(integer)oidOID de la base de données auquel ce processus serveur est connecté
pg_stat_get_backend_pid(integer)integerIdentifiant du processus serveur
pg_stat_get_backend_start(integer)timestamp with time zoneHeure à laquelle ce processus a été démarré
pg_stat_get_backend_userid(integer)oidOID de l'utilisateur connecté à ce processus serveur
pg_stat_get_backend_wait_event_type(integer)textNom du type d'événement d'attente si le processus est actuellement en attente, NULL sinon. Voir Tableau 27.4 pour les détails.
pg_stat_get_backend_wait_event(integer)textNom de l'événement d'attente si le processus est actuellement en attente, NULL sinon. Voir Tableau 27.4 pour les détails.
pg_stat_get_backend_xact_start(integer)timestamp with time zoneHeure à laquelle la transaction courante a été démarrée