El módulo pg_walinspect proporciona funciones SQL que
te permiten inspeccionar el contenido del write-ahead log (WAL) de
un clúster de bases de datos PostgreSQL en ejecución a bajo
nivel, lo cual es útil para propósitos de depuración, análisis, reportes o
educativos. Es similar a pg_waldump, pero
accesible a través de SQL en lugar de una utilidad separada.
Todas las funciones de este módulo proporcionarán la información del WAL utilizando el ID de línea de tiempo (timeline ID) actual del servidor.
Las funciones de pg_walinspect a menudo se llaman
utilizando un argumento LSN que especifica la ubicación en la que comienza
un registro WAL conocido de interés. Sin embargo, algunas
funciones, como
pg_logical_emit_message,
devuelven el LSN después del registro que se acaba de
insertar.
Todas las funciones de pg_walinspect que muestran
información sobre registros que caen dentro de un cierto rango de LSN son
permisivas al aceptar argumentos end_lsn
que están después del LSN actual del servidor. El uso de un
end_lsn “del futuro”
no generará un error.
Puede ser conveniente proporcionar el valor
FFFFFFFF/FFFFFFFF (el valor máximo válido de
pg_lsn) como argumento end_lsn.
Esto es equivalente a proporcionar un argumento end_lsn
que coincida con el LSN actual del servidor.
Por defecto, el uso de estas funciones está restringido a superusuarios y miembros del
rol pg_read_server_files. El acceso puede ser otorgado por los
superusuarios a otros utilizando GRANT.
pg_get_wal_record_info(in_lsn pg_lsn) returns record
#
Obtiene información del registro WAL sobre un registro que se encuentra en o
después del argumento in_lsn. Por
ejemplo:
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 no está al principio de un registro
WAL, se muestra en su lugar la información sobre el siguiente registro WAL válido.
Si no hay un siguiente registro WAL válido, la función genera un error.
pg_get_wal_records_info(start_lsn pg_lsn, end_lsn pg_lsn)
returns setof record
#
Obtiene información de todos los registros WAL válidos entre
start_lsn y end_lsn.
Devuelve una fila por registro WAL. Por ejemplo:
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 |
La función genera un error si
start_lsn no está disponible.
pg_get_wal_block_info(start_lsn pg_lsn, end_lsn pg_lsn, show_data boolean DEFAULT true) returns setof record
#
Obtiene información sobre cada referencia de bloque de todos los registros
WAL válidos entre start_lsn y
end_lsn con una o más referencias de
bloque. Devuelve una fila por referencia de bloque por registro WAL.
Por ejemplo:
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 |
Este ejemplo involucra un registro WAL que solo contiene una referencia de bloque,
pero muchos registros WAL contienen varias referencias de bloque. Se garantiza que
las filas devueltas por pg_get_wal_block_info tengan una
combinación única de valores de start_lsn y
block_id.
Mucha de la información que se muestra aquí coincide con la salida que mostraría
pg_get_wal_records_info, dados los mismos argumentos. Sin
embargo, pg_get_wal_block_info desglosa la información de
cada registro WAL en una forma expandida al devolver una fila por referencia de
bloque, por lo que ciertos detalles se rastrean a nivel de referencia de bloque
en lugar de a nivel de registro completo. Esta estructura es útil con consultas
que rastrean cómo cambiaron los bloques individuales a lo largo del tiempo. Ten en
cuenta que los registros sin referencias de bloque (por ejemplo, registros WAL de
COMMIT) no devolverán filas, por lo que
pg_get_wal_block_info puede de hecho devolver
menos filas que pg_get_wal_records_info.
Los parámetros reltablespace,
reldatabase, y
relfilenode hacen referencia a
pg_tablespace.oid,
pg_database.oid, y
pg_class.relfilenode
respectivamente. El campo relforknumber es el número de
bifurcación (fork number) dentro de la relación para la referencia de bloque; consulta
common/relpath.h para obtener más detalles.
La función pg_filenode_relation (consulta
Table 9.103) puede ayudarte a determinar
qué relación se modificó durante la ejecución original.
Es posible para los clientes evitar la sobrecarga de materializar los datos de los bloques.
Esto puede hacer que la ejecución de la función sea significativamente más rápida. Cuando
show_data se establece en false, los
valores de block_data y block_fpi_data
se omiten (es decir, los argumentos OUT block_data
y block_fpi_data son NULL para todas las filas devueltas).
Obviamente, esta optimización solo es factible con consultas donde los datos de bloque no sean
realmente requeridos.
La función genera un error si
start_lsn no está disponible.
pg_get_wal_stats(start_lsn pg_lsn, end_lsn pg_lsn, per_record boolean DEFAULT false)
returns setof record
#
Obtiene estadísticas de todos los registros WAL válidos entre
start_lsn y end_lsn. Por
defecto, devuelve una fila por tipo de resource_manager.
Cuando per_record se establece en true,
devuelve una fila por record_type. Por ejemplo:
postgres=# SELECT * FROM pg_get_wal_stats('0/1E847D00', '0/1E84F500')
WHERE count > 0 AND
"resource_manager/record_type" = 'Transaction'
LIMIT 1;
-[ 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 función genera un error si
start_lsn no está disponible.
Bharath Rupireddy <[email protected]>