【赵渝强老师】高斯数据库(openGauss)的WAL预写日志

b476

openGauss数据库集群初始化会创建数据目录,由环境变量 $PGDATA 标识。初始化完成后该目录会生成各类子目录与数据文件,pg_xlog 目录用于存放 WAL(Write Ahead Logging,预写日志),也叫重做日志(redo)。

一、WAL 核心原理

WAL 是保障数据库数据完整性的标准机制:

修改数据文件前,必须先把变更记录写入WAL日志;WAL日志持久化刷盘完成之后,才允许修改数据文件。

事务提交时不需要立刻把变更数据全部刷入磁盘文件。当数据库宕机、内存数据丢失,可回放磁盘上的WAL日志重做变更,完成数据库故障恢复,所以WAL又被称为redo重做日志。

image.png
点击这里查看视频讲解:【赵渝强老师】高斯数据库(openGauss)的WAL预写日志
  • 默认单个WAL日志文件大小:16MB,由参数 wal_segment_size 控制。

查看wal_segment_size参数:

openGauss=# show wal_segment_size;
 wal_segment_size 
------------------
 16MB
(1 row)

源码编译安装时修改单文件大小:

./configure --with-wal-segsize=target_value

二、WAL 日志文件存放与命名

默认WAL日志存放于 $PGDATA/pg_xlog 目录。

目录示例:

[postgres@opengauss pg_xlog]$ pwd
/home/postgres/training/gaussdb/data/single_node/pg_xlog
[postgres@opengauss pg_xlog]$ tree
.
├── 000000010000000000000001
├── 000000010000000000000002
├── 000000010000000000000003
├── 000000010000000000000004
├── 000000010000000000000005
├── 000000010000000000000006
├── 000000010000000000000007
├── 000000010000000000000008
├── 000000010000000000000009
├── 00000001000000000000000A
├── 00000001000000000000000B
├── 00000001000000000000000C
├── 00000001000000000000000D
└── archive_status
1 directory, 13 files

日志文件名解析:文件名一共24位十六进制字符,每8位一组:

00000001  00000000  00000001
 时间线    逻辑ID     物理ID

三、WAL日志切换

当单个WAL文件写满,会自动切换生成新WAL文件;也支持手动执行函数强制切换。实操示例:

  1. 查询当前WAL目录下所有日志文件
openGauss=# select * from pg_ls_waldir();
           name           |   size   |      modification      
--------------------------+----------+------------------------
 000000010000000000000005 | 16777216 | 2024-10-06 21:37:44+08
 000000010000000000000002 | 16777216 | 2024-10-06 21:37:43+08
 000000010000000000000009 | 16777216 | 2024-10-06 21:37:46+08
 000000010000000000000004 | 16777216 | 2024-10-06 21:37:44+08
 000000010000000000000006 | 16777216 | 2024-10-06 21:37:45+08
 00000001000000000000000B | 16777216 | 2024-10-06 21:37:46+08
 00000001000000000000000D | 16777216 | 2024-10-06 21:37:46+08
 000000010000000000000007 | 16777216 | 2024-10-06 21:37:45+08
 00000001000000000000000A | 16777216 | 2024-10-06 21:37:46+08
 000000010000000000000008 | 16777216 | 2024-10-06 21:37:45+08
 00000001000000000000000C | 16777216 | 2024-10-06 21:37:46+08
 000000010000000000000003 | 16777216 | 2024-10-07 00:55:06+08
 000000010000000000000001 | 16777216 | 2024-10-06 13:28:06+08
(13 rows)
  1. 手动切换WAL日志
openGauss=# select pg_switch_xlog();
 pg_switch_xlog 
----------------
 0/3011AD0
(1 row)

执行完成后,会生成一条全新的WAL日志文件,再次查询pg_ls_waldir()可以看到目录变化。

四、WAL 带来的两大优势

  1. 故障恢复保障数据安全
    数据库宕机时内存缓冲区的数据还没刷盘,磁盘上完整持久化的WAL日志可以回放重做事务变更,完成数据恢复,避免数据丢失。

  2. 显著降低IO开销,提升性能
    事务提交时,仅刷写WAL日志,不会直接刷新数据文件。

  • IO次数:WAL刷盘次数远少于直接刷数据文件;
  • IO类型:WAL是连续IO,而刷数据文件属于随机IO,连续IO磁盘成本远低于随机IO。

WAL同时保证事务持久性、数据完整性,还优化数据库读写性能。

五、wal_level 参数配置(postgresql.conf)

在postgresql.conf文件中关于WAL的配置参数最主要的是wal_level,下面展示该参数的默认值。

wal_level = hot_standby

下面的表格展示了wal_level参数的可选值。级别依次增高,记录的WAL信息也越多。

参数值 功能说明
minimal 仅保留崩溃恢复必需日志;建表、建索引、簇操作等部分操作日志可跳过,速度更快;不支持归档恢复
archive 在minimal基础上增加归档所需要日志,支持WAL归档恢复
hot_standby 默认值。增加备机只读查询所需日志;修改后需重启数据库;主库设置该级别,备机开启hot_standby参数,备库才可执行只读SQL;和archive级别性能差异很小
logical 开启逻辑复制,WAL输出逻辑复制需要的变更信息

六、WAL日志解析工具 pg_xlogdump

WAL文件是二进制格式,不能直接查看。openGauss提供pg_xlogdump工具,解析并打印WAL日志可读内容。

使用示例:

$ pwd
/home/postgres/training/gaussdb/data/single_node
$ pg_xlogdump pg_xlog/000000010000000000000001 

输出片段参考:

REDO @ 0/1000028; LSN 0/10000A8: prev 0/0; xid 0; term 0; len 88; total 122; crc 3203234698; desc: XLOG - checkpoint: redo 0/1000028; len 0; next_csn 0; recent_global_xmin 0; tli 1; fpw false; xid 4; oid 10000; multi 2; offset 0; oldest xid 3 in DB 1; oldest running xid 0; oldest xid with epoch having undo 0; shutdown at Sun Oct  6 13:27:49 2024; remove_seg 0/0
REDO @ 0/10000A8; LSN 0/10000D0: prev 0/1000028; xid 1; term 1; len 4; total 38; crc 2563411093; desc: XLOG - nextOid: 18192
......

posted @ 2026-10-14 08:54  赵渝强老师  阅读(4)  评论(0)    收藏  举报