Le module pg_walinspect fournit des fonctions SQL qui
vous permettent d'inspecter à 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 fournissent des informations sur les WAL utilisant l'identifiant de la timeline actuelle du serveur.
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é.
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.
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.
La fonction pg_filenode_relation (voir
Tableau 9.103) 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.
Bharath Rupireddy <bharath.rupireddyforpostgres@gmail.com>