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.
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.97) 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>