news 2026/10/15 10:29:05

高斯数据库(openGauss)的WAL预写日志

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
高斯数据库(openGauss)的WAL预写日志

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

一、WAL 核心原理

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

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

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

  • 默认单个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文件;也支持手动执行函数强制切换。实操示例:

  • 查询当前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)
  • 手动切换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 ......

转载:IT悦读会

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/15 10:29:05

Mac上同时配置CoreNLP、REPPlab与LaTeX环境实战

1. 三套环境同装一台Mac:这件事到底难在哪很多人看到这个标题的第一反应是:装三个东西而已,能有多难?我一开始也这么想。结果那个周末我在 Mac 上折腾了整整六个小时,重装了两次 Python 环境,把 R 的包路径…

作者头像 李华
网站建设 2026/10/15 10:27:50

Canvas分形树动画:算法实现与性能优化

1. 项目概述:Canvas动画的魅力与挑战 十年前我第一次接触Canvas动画时,就被它的无限可能性震撼了。不同于静态的DOM元素,Canvas给了我们一块完全自由的画布,可以像传统绘画一样逐帧创造动态世界。这次要实现的"梦幻树生长动画…

作者头像 李华
网站建设 2026/10/15 10:27:30

ARM服务器搭建Ambari:从源码编译到集群上线全指南

看到“鲲鹏泰山(arm)服务器搭建ambari”这个标题,我脑子里蹦出来的第一个词就是“折腾”。我去查了一圈资料,发现网上关于Ambari的教程,九成以上都是x86平台、CentOS 7、虚拟机一把梭,真正能在ARM架构服务器…

作者头像 李华
网站建设 2026/10/15 10:27:22

泰勒公式:从粗糙规则到严谨理论,它如何撑起现代算法

泰勒公式大概是微积分教材里“最”字辈选手:最容易被误用,也最能检验你是不是真的理解极限。很多人背下展开式就以为自己会了,结果一遇到误差估计就懵。作为微积分历史系列的第六篇、泰勒公式部分的下篇,这篇我打算把镜头从十八世…

作者头像 李华