of {$slidecount} ½ {$title} ATZJG.NET {$author}

首页






日志
数据库原理及应用实验


Haifeng Xu


(hfxu@yzu.edu.cn)

References:

目录

PostgreSQL 中的日志

PostgreSQL 中的日志

PostgreSQL 提供了多种日志类型,用于监控数据库活动、排查问题和优化性能. 主要有服务器日志、预写式日志(Write-Ahead Log) 等. 除此, 还包括初始化日志(initlog).

使用 postgres 用户查询 /var/lib/pgsql 目录, 其中有 initlog 和 logfile 两个日志文件.

postgres@LAPTOP-Q34L5TP8:~> pwd
/var/lib/pgsql
postgres@LAPTOP-Q34L5TP8:~> ls
data  initlog  logfile

服务器日志

服务器日志

服务器日志一般保存在 data/log 目录下, 文件名格式为 postgresql-yyyy-mm-dd_hhmmss.log

postgres@LAPTOP-Q34L5TP8:~/data/log> ls
postgresql-2025-09-11_085752.log

服务器日志记录服务器的运行状态以及错误信息, 用于及时排查服务器方面出现的问题.

内容形如
2025-09-11 08:57:52.007 CST   [646]LOG:  starting PostgreSQL 17.6 on x86_64-suse-linux-gnu, compiled by gcc (SUSE Linux) 15.1.1 20250801, 64-bit
2025-09-11 08:57:52.009 CST   [646]LOG:  listening on IPv6 address "::1", port 5432
2025-09-11 08:57:52.009 CST   [646]LOG:  listening on IPv4 address "127.0.0.1", port 5432
2025-09-11 08:57:52.009 CST   [646]LOG:  could not bind IPv4 address "127.0.0.1": Address already in use
2025-09-11 08:57:52.009 CST   [646]HINT:  Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
2025-09-11 08:57:52.011 CST   [646]LOG:  listening on Unix socket "/run/postgresql/.s.PGSQL.5432"
2025-09-11 08:57:52.070 CST   [650]LOG:  database system was shut down at 2025-09-11 08:57:51 CST
2025-09-11 08:57:52.079 CST   [646]LOG:  database system is ready to accept connections
2025-09-11 08:59:30.474 CST postgres postgres [679]LOG:  provided user name (postgres) and authenticated user name (haifeng) do not match
2025-09-11 08:59:30.474 CST postgres postgres [679]FATAL:  Peer authentication failed for user "postgres"
2025-09-11 08:59:30.474 CST postgres postgres [679]DETAIL:  Connection matched file "/var/lib/pgsql/data/pg_hba.conf" line 113: "local   all             all                                     peer"
2025-09-11 09:02:52.178 CST   [648]LOG:  checkpoint starting: time
2025-09-11 09:02:56.779 CST   [648]LOG:  checkpoint complete: wrote 48 buffers (0.3%); 0 WAL file(s) added, 0 removed, 0 recycled; write=4.543 s, sync=0.028 s, total=4.601 s; sync files=11, longest=0.016 s, average=0.003 s; distance=290 kB, estimate=290 kB; lsn=0/1576760, redo lsn=0/1576708
2025-09-11 10:11:33.859 CST haifeng haifeng [1035]FATAL:  role "haifeng" does not exist
2025-09-11 10:48:24.669 CST postgres postgres [1157]ERROR:  column "catelog" does not exist at character 45
2025-09-11 10:48:24.669 CST postgres postgres [1157]HINT:  Perhaps you meant to reference the column "pg_settings.category".

WAL

预写式日志(Write-Ahead Log)

WAL 是 Write-Ahead Log 的缩写, 即预写式日志. WAL 文件是 PostgreSQL 存储所有数据库修改操作的物理日志文件.

预写式日志所在目录名是 pg_wal.


WAL(Write-Ahead Logging,预写式日志)是 PostgreSQL 实现数据持久性和崩溃恢复的核心机制.

WAL 文件是 PostgreSQL 存储所有数据库修改操作的物理日志文件. 它们记录了数据库中所有事务的变更操作(如插入、更新、删除等), 并确保这些变更在写入数据文件之前先被持久化到磁盘. 用于崩溃恢复、时间点恢复.

WAL的核心概念是, 对数据文件(存放表和索引的地方)的更改必须在这些更改被记录之后才被写入, 也就是说,在描述这些更改的WAL记录被刷新到永久存储之后。如果我们遵循这个 程序,我们就不需要在每次事务提交时将数据页刷新到磁盘,因为我们知道在发生 崩溃的情况下,我们可以使用日志恢复数据库:任何尚未应用到数据页的更改都可以 从WAL记录中重做。(这就是前滚恢复,也称为REDO。)

WAL 文件的作用

数据持久性

在 PostgreSQL 中,任何数据修改操作(如 INSERT、UPDATE、DELETE)都会先生成 WAL 记录。这些记录会被写入 WAL 文件,确保即使数据库崩溃或断电,数据也不会丢失。恢复时,PostgreSQL 会通过重放(replay)WAL 文件中的记录,将数据库恢复到崩溃前的状态。

崩溃恢复

如果数据库因异常中断(如断电、系统崩溃),重启时会通过 WAL 文件中的记录,重新应用所有未持久化到数据文件的事务变更,从而保证数据一致性。

流复制与逻辑复制

WAL 是 PostgreSQL 实现高可用性的基础。主库(Primary)会将 WAL 文件发送给备库(Standby),备库通过重放这些日志实现数据同步。

WAL 文件的结构

文件格式

WAL 文件是固定大小的二进制文件,默认大小为 16MB(可通过 wal_segment_size 配置)。文件名是一个连续的数字序列,例如 000000010000000000000001,表示 WAL 日志的逻辑顺序。

日志内容

每个 WAL 文件包含多个 WAL 记录(WAL record),记录的内容包括:

LSN(日志序列号)

LSN 是 WAL 记录的唯一标识符,用于标识日志的位置。每个 WAL 记录都有一个递增的 LSN,例如日志中的 lsn=0/15DFB708 和 redo lsn=0/15DFB6D0 表示当前日志和检查点的位置。

WAL 文件的生命周期

生成

当事务修改数据时,PostgreSQL 会先将变更记录写入内存中的 WAL Buffer。 提交事务时,WAL Buffer 的记录会被刷新到磁盘的 WAL 文件中(通过 fsync 确保持久性)。

归档

如果启用了 WAL 归档(archive_mode=on),WAL 文件会在写满或触发检查点(Checkpoint)后被归档到指定目录(archive_command 配置)。 归档的 WAL 文件用于点到时间恢复(PITR)。

循环使用

PostgreSQL 会循环使用 WAL 文件. 当 WAL 文件被检查点标记为“已安全重放”后,它们会被覆盖或删除.

日志中的 0 WAL file(s) added, 0 removed, 0 recycled 表示当前没有新增、删除或回收的 WAL 文件。

检查点(Checkpoint)

检查点会将内存中的脏页(Dirty Page)写入数据文件,并标记 WAL 文件中哪些部分可以被安全覆盖。 日志中的 checkpoint complete 表示检查点完成,例如写入了 3 个缓冲区,耗时 0.054 秒。

WAL 文件的管理

避免 WAL 文件耗尽(pg_wal 目录空间不足会导致数据库停止)。 优化检查点频率,减少频繁的 I/O 开销。

总结

WAL 文件是 PostgreSQL 实现数据可靠性、崩溃恢复和高可用性的核心组件。它们通过记录所有数据库变更操作,确保即使在异常情况下也能恢复数据. 理解 WAL 文件的生成、管理和优化,对于数据库性能调优和故障排查至关重要.

CSV 日志 postgresql-<日期>.csv 结构化日志数据 日志分析、自动化处理 审计日志 自定义位置 用户活动记录 安全审计、合规性检查


连接管理

查看 pg_stat_activity 视图.

postgres=# select * from pg_stat_activity;
 datid | datname  |  pid  | leader_pid | usesysid | usename  | application_name | client_addr | client_hostname | client_port |         backend_start         |          xact_start           |          query_start          |         state_change          | wait_event_type |     wait_event      | state  | backend_xid | backend_xmin | query_id |              query              |         backend_type
-------+----------+-------+------------+----------+----------+------------------+-------------+-----------------+-------------+-------------------------------+-------------------------------+-------------------------------+-------------------------------+-----------------+---------------------+--------+-------------+--------------+----------+---------------------------------+------------------------------
     5 | postgres | 11468 |            |       10 | postgres | psql             | ::1         |                 |       59276 | 2025-09-17 15:58:19.624955+08 | 2025-09-17 15:59:16.614173+08 | 2025-09-17 15:59:16.614173+08 | 2025-09-17 15:59:16.614182+08 |                 |                     | active |             |          755 |          | select * from pg_stat_activity; | client backend
       |          |  7272 |            |          |          |                  |             |                 |             | 2025-09-11 14:06:08.817575+08 |                               |                               |                               | Activity        | AutovacuumMain      |        |             |              |          |                                 | autovacuum launcher
       |          |  7732 |            |       10 | postgres |                  |             |                 |             | 2025-09-11 14:06:08.812426+08 |                               |                               |                               | Activity        | LogicalLauncherMain |        |             |              |          |                                 | logical replication launcher
       |          |  8136 |            |          |          |                  |             |                 |             | 2025-09-11 14:06:08.523862+08 |                               |                               |                               | Activity        | CheckpointerMain    |        |             |              |          |                                 | checkpointer
       |          |  8144 |            |          |          |                  |             |                 |             | 2025-09-11 14:06:08.515669+08 |                               |                               |                               | Activity        | BgwriterHibernate   |        |             |              |          |                                 | background writer
       |          |  8120 |            |          |          |                  |             |                 |             | 2025-09-11 14:06:08.94994+08  |                               |                               |                               | Activity        | WalWriterMain       |        |             |              |          |                                 | walwriter
(6 行记录)

该命令可以查出每个连接上最近一次执行的语句, 例如上面查到执行了 select * from pg_stat_activity;.

如果执行的 SQL 语句非常耗时, 我们希望能断开此连接或者终止 SQL 语句的运行.

SELECT pg_cancel_backend(pid);

这里的 pid 是指进程号, 就是上面表中的属性 pid, 比如 11468. PostgreSQL 9.2 版本之前这个属性是 procpid.

该操作不会终止连接本身.

如果要终止该连接, 则使用下面的命令.

SELECT pg_terminate_backend(procid);

如果直接终止某个连接, 而该连接正在执行某些SQL语句, 则这些SQL语句也会被停止掉.

例: 终止某个用户的所有连接.

SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE usename='some_role';

视图 pg_stat_activity 的定义

视图 pg_stat_activity 的定义

mydb=> \d+ pg_stat_activity
                            视图 "pg_catalog.pg_stat_activity"
       栏位       |           类型           | 校对规则 | 可空的 | 预设 |   存储   | 描述
------------------+--------------------------+----------+--------+------+----------+------
 datid            | oid                      |          |        |      | plain    |
 datname          | name                     |          |        |      | plain    |
 pid              | integer                  |          |        |      | plain    |
 leader_pid       | integer                  |          |        |      | plain    |
 usesysid         | oid                      |          |        |      | plain    |
 usename          | name                     |          |        |      | plain    |
 application_name | text                     |          |        |      | extended |
 client_addr      | inet                     |          |        |      | main     |
 client_hostname  | text                     |          |        |      | extended |
 client_port      | integer                  |          |        |      | plain    |
 backend_start    | timestamp with time zone |          |        |      | plain    |
 xact_start       | timestamp with time zone |          |        |      | plain    |
 query_start      | timestamp with time zone |          |        |      | plain    |
 state_change     | timestamp with time zone |          |        |      | plain    |
 wait_event_type  | text                     |          |        |      | extended |
 wait_event       | text                     |          |        |      | extended |
 state            | text                     |          |        |      | extended |
 backend_xid      | xid                      |          |        |      | plain    |
 backend_xmin     | xid                      |          |        |      | plain    |
 query_id         | bigint                   |          |        |      | plain    |
 query            | text                     |          |        |      | extended |
 backend_type     | text                     |          |        |      | extended |
视图定义:
 SELECT s.datid,
    d.datname,
    s.pid,
    s.leader_pid,
    s.usesysid,
    u.rolname AS usename,
    s.application_name,
    s.client_addr,
    s.client_hostname,
    s.client_port,
    s.backend_start,
    s.xact_start,
    s.query_start,
    s.state_change,
    s.wait_event_type,
    s.wait_event,
    s.state,
    s.backend_xid,
    s.backend_xmin,
    s.query_id,
    s.query,
    s.backend_type
   FROM pg_stat_get_activity(NULL::integer) s(datid, pid, usesysid, application_name, state, query, wait_event_type, wait_event, xact_start, query_start, backend_start, state_change, client_addr, client_hostname, client_port, backend_xid, backend_xmin, backend_type, ssl, sslversion, sslcipher, sslbits, ssl_client_dn, ssl_client_serial, ssl_issuer_dn, gss_auth, gss_princ, gss_enc, gss_delegation, leader_pid, query_id)
     LEFT JOIN pg_database d ON s.datid = d.oid
     LEFT JOIN pg_authid u ON s.usesysid = u.oid;


mydb=>

pg_database

pg_database

pg_database 是数据表, 其从属于 pg_catalog

mydb=> \d+ pg_database
                               数据表 "pg_catalog.pg_database"
      栏位      |   类型    | 校对规则 |  可空的  | 预设 |   存储   | 压缩 | 统计目标 | 描述
----------------+-----------+----------+----------+------+----------+------+----------+------
 oid            | oid       |          | not null |      | plain    |      |          |
 datname        | name      |          | not null |      | plain    |      |          |
 datdba         | oid       |          | not null |      | plain    |      |          |
 encoding       | integer   |          | not null |      | plain    |      |          |
 datlocprovider | "char"    |          | not null |      | plain    |      |          |
 datistemplate  | boolean   |          | not null |      | plain    |      |          |
 datallowconn   | boolean   |          | not null |      | plain    |      |          |
 dathasloginevt | boolean   |          | not null |      | plain    |      |          |
 datconnlimit   | integer   |          | not null |      | plain    |      |          |
 datfrozenxid   | xid       |          | not null |      | plain    |      |          |
 datminmxid     | xid       |          | not null |      | plain    |      |          |
 dattablespace  | oid       |          | not null |      | plain    |      |          |
 datcollate     | text      | C        | not null |      | extended |      |          |
 datctype       | text      | C        | not null |      | extended |      |          |
 datlocale      | text      | C        |          |      | extended |      |          |
 daticurules    | text      | C        |          |      | extended |      |          |
 datcollversion | text      | C        |          |      | extended |      |          |
 datacl         | aclitem[] |          |          |      | extended |      |          |
索引:
    "pg_database_oid_index" PRIMARY KEY, btree (oid), 表空间 "pg_global"
    "pg_database_datname_index" UNIQUE CONSTRAINT, btree (datname), 表空间 "pg_global"
表空间:"pg_global"
访问方法 heap

查看一下 pg_database 中的内容.

mydb=> select * from pg_database;
  oid  |  datname  | datdba | encoding | datlocprovider | datistemplate | datallowconn | dathasloginevt | datconnlimit | datfrozenxid | datminmxid | dattablespace | datcollate | datctype | datlocale | daticurules | datcollversion |               datacl              
-------+-----------+--------+----------+----------------+---------------+--------------+----------------+--------------+--------------+------------+---------------+------------+----------+-----------+-------------+----------------+-------------------------------------
     5 | postgres  |     10 |        6 | c              | f             | t            | f              |           -1 |          731 |          1 |          1663 | zh-CN      | zh-CN    |           |             | 1539.5,1539.5  |
     1 | template1 |     10 |        6 | c              | t             | t            | f              |           -1 |          731 |          1 |          1663 | zh-CN      | zh-CN    |           |             | 1539.5,1539.5  | {=c/postgres,postgres=CTc/postgres}
     4 | template0 |     10 |        6 | c              | t             | f            | f              |           -1 |          731 |          1 |          1663 | zh-CN      | zh-CN    |           |             |                | {=c/postgres,postgres=CTc/postgres}
 16393 | mydb      |  16388 |        6 | c              | f             | t            | f              |           -1 |          731 |          1 |          1663 | zh-CN      | zh-CN    |           |             | 1539.5,1539.5  |
(4 行记录)
mydb=> \dp+ pg_database
                                    存取权限
  架构模式  |    名称     |  类型  |          存取权限          | 列特权 | 策略
------------+-------------+--------+----------------------------+--------+------
 pg_catalog | pg_database | 数据表 | postgres=arwdDxtm/postgres+|        |
            |             |        | =r/postgres                |        |
(1 行记录)

pg_authid

pg_authid

mydb=> \d+ pg_authid
                                       数据表 "pg_catalog.pg_authid"
      栏位      |           类型           | 校对规则 |  可空的  | 预设 |   存储   | 压缩 | 统计目标 | 描述
----------------+--------------------------+----------+----------+------+----------+------+----------+------
 oid            | oid                      |          | not null |      | plain    |      |          |
 rolname        | name                     |          | not null |      | plain    |      |          |
 rolsuper       | boolean                  |          | not null |      | plain    |      |          |
 rolinherit     | boolean                  |          | not null |      | plain    |      |          |
 rolcreaterole  | boolean                  |          | not null |      | plain    |      |          |
 rolcreatedb    | boolean                  |          | not null |      | plain    |      |          |
 rolcanlogin    | boolean                  |          | not null |      | plain    |      |          |
 rolreplication | boolean                  |          | not null |      | plain    |      |          |
 rolbypassrls   | boolean                  |          | not null |      | plain    |      |          |
 rolconnlimit   | integer                  |          | not null |      | plain    |      |          |
 rolpassword    | text                     | C        |          |      | extended |      |          |
 rolvaliduntil  | timestamp with time zone |          |          |      | plain    |      |          |
索引:
    "pg_authid_oid_index" PRIMARY KEY, btree (oid), 表空间 "pg_global"
    "pg_authid_rolname_index" UNIQUE CONSTRAINT, btree (rolname), 表空间 "pg_global"
表空间:"pg_global"
访问方法 heap

pg_authid 无权限查看.

mydb=> select * from pg_authid;
错误:  对表 pg_authid 权限不够

查看 pg_authid 的权限.

mydb=> \dp+ pg_authid
                                   存取权限
  架构模式  |   名称    |  类型  |          存取权限          | 列特权 | 策略
------------+-----------+--------+----------------------------+--------+------
 pg_catalog | pg_authid | 数据表 | postgres=arwdDxtm/postgres |        |
(1 行记录)

使用 pg_waldump 工具读取 wal 文件

使用 pg_waldump 工具读取 wal 文件

以下内容参考自 https://philipmcclarence.com/guide-to-using-pg_waldump

pg_waldump 是一个 PostgreSQL 自带的命令行工具, 可以以人类可读的格式显示预写日志 (WAL) 文件的内容. WAL 是 PostgreSQL 架构的一个基本组成部分, 提供数据持久性, 并支持复制和时间点恢复等功能. pg_waldump 工具对于检查 WAL 文件以进行调试、审计更改和理解 PostgreSQL 事务日志的内部工作原理非常有用.

Tips for Using pg_waldump The WAL filenames are typically in the format 000000010000000000000001, where the first part is the timeline ID and the rest is the log segment and log file ID. Be sure to run pg_waldump as a user with the necessary file system permissions to read the WAL files. The output of pg_waldump can be quite verbose, especially with the --verbose flag. You may want to redirect the output to a file or pipe it through a tool like less for easier analysis. Remember that pg_waldump is a diagnostic tool, not meant for routine operations. It is most useful when you need to understand the low-level details of WAL records. By familiarizing yourself with pg_waldump, you can gain a deeper understanding of PostgreSQL’s WAL system and have a powerful tool at your disposal for troubleshooting and auditing database changes.

pg_waldump 的使用场景

PS C:\Program Files\PostgreSQL\17\data\pg_wal> pg_waldump .\000000010000000000000002
pg_waldump: 错误: 未给出WAL起始位置
pg_waldump: hint: Try "pg_waldump --help" for more information.
在 Linux 下
postgres@LAPTOP-Q34L5TP8:~/data/pg_wal> pg_waldump 000000010000000000000001  > ~/pg_wal_1.txt
pg_waldump: error: error in WAL record at 0/19C3D20: invalid record length at 0/19C3D58: expected at least 24, got 0
postgres@LAPTOP-Q34L5TP8:~/data/pg_wal> cd
postgres@LAPTOP-Q34L5TP8:~> ls
data  initlog  logfile  pg_wal_1.txt
postgres@LAPTOP-Q34L5TP8:~> ls -l
total 4800
drwx------ 20 postgres postgres    4096 Sep 19 16:34 data
-rw-r--r--  1 postgres postgres     905 Sep 11 08:57 initlog
-rw-------  1 postgres postgres     187 Sep  7 22:37 logfile
-rw-r--r--  1 postgres postgres 4902526 Sep 19 16:54 pg_wal_1.txt

To display WAL records within a specific range of Log Sequence Numbers (LSNs): This will show records starting at LSN 0/01574360 and stopping at LSN 0/01577790.

postgres@LAPTOP-Q34L5TP8:~> pg_waldump --start=0/01574360 --end=0/01577790 /var/lib/pgsql/data/pg_wal/000
000010000000000000001
rmgr: Heap        len (rec/tot):     53/  8177, tx:          0, lsn: 0/01574360, prev 0/01574320, desc: INPLACE off: 40, blkref #0: rel 1663/1/1259 blk 3 FPW
rmgr: Heap        len (rec/tot):     53/   713, tx:          0, lsn: 0/01576370, prev 0/01574360, desc: INPLACE off: 46, blkref #0: rel 1663/1/1259 blk 0 FPW
rmgr: Standby     len (rec/tot):    138/   138, tx:          0, lsn: 0/01576640, prev 0/01576370, desc: INVALIDATIONS ; relcache init file inval dbid 1 tsid 1663; inval msgs: catcache 55 catcache 54 catcache 55 catcache 54 relcache 2696 relcache 2619
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/015766D0, prev 0/01576640, desc: RUNNING_XACTS nextXid 749 latestCompletedXid 748 oldestRunningXid 749
rmgr: XLOG        len (rec/tot):     30/    30, tx:          0, lsn: 0/01576708, prev 0/015766D0, desc: CHECKPOINT_REDO wal_level replica
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/01576728, prev 0/01576708, desc: RUNNING_XACTS nextXid 749 latestCompletedXid 748 oldestRunningXid 749
rmgr: XLOG        len (rec/tot):    114/   114, tx:          0, lsn: 0/01576760, prev 0/01576728, desc: CHECKPOINT_ONLINE redo 0/1576708; tli 1; prev tli 1; fpw true; wal_level replica; xid 0:749; oid 24576; multi 1; offset 0; oldest xid 730 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 749; online
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/015767D8, prev 0/01576760, desc: RUNNING_XACTS nextXid 749 latestCompletedXid 748 oldestRunningXid 749
rmgr: XLOG        len (rec/tot):    114/   114, tx:          0, lsn: 0/01576810, prev 0/015767D8, desc: CHECKPOINT_SHUTDOWN redo 0/1576810; tli 1; prev tli 1; fpw true; wal_level replica; xid 0:749; oid 24576; multi 1; offset 0; oldest xid 730 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 0; shutdown
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/01576888, prev 0/01576810, desc: RUNNING_XACTS nextXid 749 latestCompletedXid 748 oldestRunningXid 749
rmgr: XLOG        len (rec/tot):    114/   114, tx:          0, lsn: 0/015768C0, prev 0/01576888, desc: CHECKPOINT_SHUTDOWN redo 0/15768C0; tli 1; prev tli 1; fpw true; wal_level replica; xid 0:749; oid 24576; multi 1; offset 0; oldest xid 730 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 0; shutdown
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/01576938, prev 0/015768C0, desc: RUNNING_XACTS nextXid 749 latestCompletedXid 748 oldestRunningXid 749
rmgr: XLOG        len (rec/tot):     30/    30, tx:          0, lsn: 0/01576970, prev 0/01576938, desc: CHECKPOINT_REDO wal_level replica
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/01576990, prev 0/01576970, desc: RUNNING_XACTS nextXid 749 latestCompletedXid 748 oldestRunningXid 749
rmgr: XLOG        len (rec/tot):    114/   114, tx:          0, lsn: 0/015769C8, prev 0/01576990, desc: CHECKPOINT_ONLINE redo 0/1576970; tli 1; prev tli 1; fpw true; wal_level replica; xid 0:749; oid 24576; multi 1; offset 0; oldest xid 730 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 749; online
rmgr: Standby     len (rec/tot):     50/    50, tx:          0, lsn: 0/01576A40, prev 0/015769C8, desc: RUNNING_XACTS nextXid 749 latestCompletedXid 748 oldestRunningXid 749
rmgr: XLOG        len (rec/tot):     30/    30, tx:          0, lsn: 0/01576A78, prev 0/01576A40, desc: NEXTOID 32768
rmgr: Standby     len (rec/tot):     54/    54, tx:          0, lsn: 0/01576A98, prev 0/01576A78, desc: RUNNING_XACTS nextXid 750 latestCompletedXid 748 oldestRunningXid 749; 1 xacts: 749
rmgr: Heap        len (rec/tot):     54/  2050, tx:        749, lsn: 0/01576AD0, prev 0/01576A98, desc: INSERT off: 17, flags: 0x01, blkref #0: rel 1664/0/1260 blk 0 FPW
rmgr: Btree       len (rec/tot):     53/   673, tx:        749, lsn: 0/015772D8, prev 0/01576AD0, desc: INSERT_LEAF off: 1, blkref #0: rel 1664/0/2676 blk 1 FPW
rmgr: Btree       len (rec/tot):     53/   433, tx:        749, lsn: 0/01577580, prev 0/015772D8, desc: INSERT_LEAF off: 17, blkref #0: rel 1664/0/2677 blk 1 FPW
rmgr: Transaction len (rec/tot):     82/    82, tx:        749, lsn: 0/01577738, prev 0/01577580, desc: COMMIT 2025-09-12 17:04:42.905389 CST; inval msgs: catcache 11 catcache 10
postgres@LAPTOP-Q34L5TP8:~>

pg_waldump 的详细使用方法

pg_waldump 的详细使用方法

pg_waldump 工具位于 bin 目录.

C:\Users\haife>where pg_waldump
C:\Program Files\PostgreSQL\17\bin\pg_waldump.exe

C:\Users\haife>pg_waldump --help
pg_waldump 为了调试,解码并显示PostgreSQL预写日志.

使用方法:
  pg_waldump [选项]... [STARTSEG [ENDSEG]]

选项:
  -b, --bkp-details      输出有关备份块的详细信息
  -B, --block=N          with --relation, only show records that modify block N
  -e, --end=RECPTR       在指定的WAL位置停止读取
  -f, --follow           在到达可用WAL的末尾之后,继续重试
  -F, --fork=FORK        only show records that modify blocks in fork FORK;
                         valid names are main, fsm, vm, init
  -n, --limit=N          要显示的记录数
  -p, --path=PATH        directory in which to find WAL segment files or a
                         directory with a ./pg_wal that contains such files
                         (default: current directory, ./pg_wal, $PGDATA/pg_wal)
  -q, --quiet            不打印任何输出,错误除外
  -r, --rmgr=RMGR        只显示由RMGR资源管理器生成的记录
                         使用--rmgr=list列出有效的资源管理器名称
  -R, --relation=T/D/R   only show records that modify blocks in relation T/D/R
  -s, --start=RECPTR     在WAL中位于RECPTR处开始阅读
  -t, --timeline=TLI     timeline from which to read WAL records
                         (default: 1 or the value used in STARTSEG)
  -V, --version          输出版本信息, 然后退出
  -w, --fullpage         only show records with a full page write
  -x, --xid=XID          只显示用给定事务ID标记的记录
  -z, --stats[=record]   显示统计信息而不是记录
                         (或者,显示每个记录的统计信息)
  --save-fullpage=DIR    save full page images to DIR
  -?, --help             显示此帮助, 然后退出

臭虫报告至 <pgsql-bugs@lists.postgresql.org>.
PostgreSQL 主页: <https://www.postgresql.org/>

End






Thanks very much!