F.37. pg_walinspect — inspección de WAL a bajo nivel #

F.37.1. Funciones generales
F.37.2. Autor

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.

Note

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.

Tip

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.

F.37.1. Funciones generales #

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.

Tip

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.

F.37.2. Autor #

Bharath Rupireddy