PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 17.1 » Annexes » Modules et extensions supplémentaires fournis » pg_walinspect -- inspection bas niveau des journaux de transaction

F.35. pg_walinspect -- inspection bas niveau des journaux de transaction #

Le module pg_walinspect fournit des fonctions SQL qui vous permettent d'inspecter, à un bas niveau, le contenu des journaux de transactions d'une instance PostgreSQL en cours d'exécution, ce qui est utile pour le débogage, l'analyse, la création de rapports ou à des fins pédagogiques. Il est similaire à pg_waldump, mais est accessible via SQL plutôt que via un utilitaire séparé.

Toutes les fonctions de ce module fourniront des informations sur les WAL utilisant l'identifiant de la timeline actuelle du serveur.

Note

Les fonctions pg_walinspect sont souvent appelées en utilisant un argument LSN qui indique l'emplacement auquel un enregistrement WAL d'intérêt commence. Néanmoins, certaines fonctions, comme pg_logical_emit_message, renvoie le LSN après l'enregistrement qui a été inséré.

Astuce

Toutes les fonctions de pg_walinspect qui affichent des informations sur les enregistrements qui tombent dans un certain intervalle LSN acceptent des arguments end_lsn qui sont après le LSN actuel du serveur. Utiliser un end_lsn « du futur » ne renverra pas une erreur.

Il pourrait être intéressant de fournir la valeur FFFFFFFF/FFFFFFFF (la valeur maximale d'un pg_lsn) comme argument end_lsn. C'est équivalent à fournir un argument end_lsn correspondant au LSN actuel du serveur.

Par défaut, l'utilisation de ces fonctions est réservée aux superutilisateurs et aux membres du rôle pg_read_server_files. L'accès peut être accordé par des superutilisateurs à d'autres utilisateurs grâce à la commande GRANT.

F.35.1. Fonctions générales #

pg_get_wal_record_info(in_lsn pg_lsn) returns record #

Obtient les informations d'un enregistrement WAL situé sur ou après l'argument in_lsn. Par exemple :

postgres=# SELECT * FROM pg_get_wal_record_info('0/E419E28');
-[ RECORD 1 ]----+-------------------------------------------------
start_lsn        | 0/E419E28
end_lsn          | 0/E419E68
prev_lsn         | 0/E419D78
xid              | 0
resource_manager | Heap2
record_type      | VACUUM
record_length    | 58
main_data_length | 2
fpi_length       | 0
description      | nunused: 5, unused: [1, 2, 3, 4, 5]
block_ref        | blkref #0: rel 1663/16385/1249 fork main blk 364

Si in_lsn n'est pas au début d'un enregistrement WAL, l'information sur le prochain enregistrement WAL valide est affichée à la place. S'il n'y a pas d'enregistrement WAL valide, la fonction renvoie une erreur.

pg_get_wal_records_info(start_lsn pg_lsn, end_lsn pg_lsn) #

Obtient des informations sur tous les enregistrements WAL valides entre start_lsn et end_lsn. Renvoie une ligne par enregistrement WAL. Par exemple :

postgres=# SELECT * FROM pg_get_wal_records_info('0/1E913618', '0/1E913740') LIMIT 1;
-[ RECORD 1 ]----+--------------------------------------------------------------
start_lsn        | 0/1E913618
end_lsn          | 0/1E913650
prev_lsn         | 0/1E9135A0
xid              | 0
resource_manager | Standby
record_type      | RUNNING_XACTS
record_length    | 50
main_data_length | 24
fpi_length       | 0
description      | nextXid 33775 latestCompletedXid 33774 oldestRunningXid 33775
block_ref        |

Cette fonction renvoie une erreur si start_lsn n'est pas disponible.

pg_get_wal_block_info(start_lsn pg_lsn, end_lsn pg_lsn, show_data boolean DEFAULT true) returns setof record #

Obtient des informations sur chaque référence de bloc à partir de tous les enregistrements WAL valides entre start_lsn et end_lsn avec une ou plusieurs références de blocs. Renvoie une ligne par référence de bloc par enregistrement WAL. Par exemple :

postgres=# SELECT * FROM pg_get_wal_block_info('0/1230278', '0/12302B8');
-[ RECORD 1 ]-----+-----------------------------------
start_lsn         | 0/1230278
end_lsn           | 0/12302B8
prev_lsn          | 0/122FD40
block_id          | 0
reltablespace     | 1663
reldatabase       | 1
relfilenode       | 2658
relforknumber     | 0
relblocknumber    | 11
xid               | 341
resource_manager  | Btree
record_type       | INSERT_LEAF
record_length     | 64
main_data_length  | 2
block_data_length | 16
block_fpi_length  | 0
block_fpi_info    |
description       | off: 46
block_data        | \x00002a00070010402630000070696400
block_fpi_data    |

Cet exemple implique un enregistrement WAL qui contient seulement une référence de bloc, mais beaucoup d'enregistrements WAL contiennent plusieurs références de blocs. Les lignes en sortie de pg_get_wal_block_info sont garanties avoir une combinaison unique de valeurs start_lsn et block_id.

Beaucoup des informations affichées ici correspondent à la sortie de pg_get_wal_records_info, en utilisant les mêmes arguments. Néanmoins, pg_get_wal_block_info désimbrique l'information pour chaque enregistrement WAL dans une forme étendue en affichant une ligne par référence de bloc, donc certains détails sont tracés au niveau de la référence de bloc plutôt qu'au niveau enregistrement. Cette structure est utile avec les requêtes qui tracent comment les blocs individuels changent dans le temps. Notez que les enregistrements sans référence de bloc (enregistrement WAL des COMMIT) n'auront pas de lignes renvoyées, donc pg_get_wal_block_info pourrait en fait renvoyer moins de lignes que pg_get_wal_records_info.

Les paramètres reltablespace, reldatabase et relfilenode référencent respectivement pg_tablespace.oid, pg_database.oid et pg_class.relfilenode. Le champ relforknumber est le numéro de fork dans la relation pour la référence de bloc ; voir common/relpath.h pour les détails.

Astuce

La fonction pg_filenode_relation (voir Tableau 9.101) peut vous aider à déterminer la relation modifiée pendant l'exécution originale.

Il est possible que les clients évitent la surcharge de la matérialisation des données. Ceci peut accélérer l'exécution de la fonction. Quand show_data vaut false, les valeurs de block_data et block_fpi_data sont omises (c'est-à-dire les arguments OUT block_data et block_fpi_data valent NULL pour toutes les lignes renvoyées). À l'évidence, cette optimisation est seulement faisable pour les requêtes où les données de bloc ne sont pas réellement demandées.

La fonction renvoie une erreur si start_lsn n'est pas disponible.

pg_get_wal_stats(start_lsn pg_lsn, end_lsn pg_lsn, per_record boolean DEFAULT false) returns setof record #

Récupère les statistiques de tous les enregistrements WAL valides entre start_lsn et end_lsn. Par défaut, elle renvoie une ligne par type resource_manager. Lorsque per_record est défini sur true, elle renvoie une ligne par record_type. Par exemple :

postgres=# SELECT * FROM pg_get_wal_stats('0/1E847D00', '0/1E84F500')
             WHERE count > 0 LIMIT 1 AND
                   "resource_manager/record_type" = 'Transaction';
-[ RECORD 1 ]----------------+-------------------
resource_manager/record_type | Transaction
count                        | 2
count_percentage             | 8
record_size                  | 875
record_size_percentage       | 41.23468426013195
fpi_size                     | 0
fpi_size_percentage          | 0
combined_size                | 875
combined_size_percentage     | 2.8634072910530795

La fonction renvoie une erreur si start_lsn n'est pas disponible.

F.35.2. Auteur #

Bharath Rupireddy