↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

百科 / 配置参数 / 预写式日志

CONFIGURATION PARAMETER预写式日志 / 设置

wal_compression

此参数启用使用指定的压缩方法对 WAL 进行压缩。

Compresses full-page writes written in WAL file with specified method.

枚举 会话(超级用户) 引入 9.5 现存至 20 devel 0 次默认值变更

类型
枚举enum
上下文
会话(超级用户)超级用户可在会话内用 SET 修改
默认值
off
枚举值
pglz, lz4, zstd, on, off
引入版本
9.5
状态
现存

PostgreSQL 18.7 手册 官方文档 引入提交 57aa5b2bb1

版本轨迹

相对 PostgreSQL 17 无变化。

默认值变迁

off 9.5 – 19

已记录的默认值在 PostgreSQL 9.5–19 之间未变。带单位的取值换算成了可读形式,原始的 boot_val 与单位写在悬浮提示里。

手册说明

PostgreSQL 18.7 手册 · 19.5 预写式日志 本站手册 官方原文

此参数启用使用指定的压缩方法对 WAL 进行压缩。启用后,PostgreSQL 服务器会压缩写入 WAL 的整页镜像,例如在启用 full_page_writes 时、基础备份期间等。在 WAL 重放期间,将对压缩的页镜像进行解压缩。支持的方法有 pglz、lz4(如果 PostgreSQL 使用 --with-lz4 编译)和 zstd(如果 PostgreSQL 使用 --with-zstd 编译)。值 on 是 pglz 的历史拼写。默认值为 off。只有超级用户和具有适当 SET 权限的用户才能更改此设置。

启用压缩可以减少 WAL 数据量,而且不会增加不可恢复的数据损坏风险;代价是在记录 WAL 时压缩、重放 WAL 时解压会额外消耗一些 CPU。

机制详解

使用指定方法压缩写入 WAL 的整页映像。超级用户或获授 SET 权限的角色可在相应的会话或配置作用域中修改它。

压缩对象是 full_page_writes、备份或 hint logging 产生的整页映像,而非每条 WAL 记录。pglz 内置,lz4/zstd 取决于构建;它用主库压缩和备库解压 CPU 换取更小 WAL。

应把 wal_compression 与 full_page_writes、wal_log_hints、wal_level 一起监控和变更。先在对应角色与真实负载上验证,再按其 superuser context 选择会话修改、reload 或 restart;历史默认值并不等于当前有效值。

调优建议

按典型负载给出的取值思路,不是放之四海皆准的配方:实际取值要看数据量、并发度与硬件。

  • OLTP在线事务处理

    先保证耐久性与恢复目标,再以 WAL 生成速率、刷写延迟、检查点和 pg_wal 峰值调 wal_compression;每次改动都做崩溃/恢复与归档监控验证。

  • OLAP分析与批处理

    按批量装载峰值规划 WAL、归档带宽和恢复 I/O;需要降低峰值时应协调装载节奏与检查点,而不是牺牲恢复链。

  • 小规格低配实例与开发机

    从安全默认开始,按有限磁盘容量设置明确告警;不要仅为节省少量 I/O 就关闭耐久性或破坏恢复链。

常见问题

  • 误以为压缩作用于每条 WAL,而不是整页映像。
  • 服务器构建未提供相应方法时选择 lz4 或 zstd。
  • 忽略主库压缩 CPU 与恢复重放解压 CPU。
  • 修改特权会话值后,误以为其他会话或新连接会自动继承。
  • 未控制检查点频率与 full_page_writes 活动就比较 WAL 字节量。

演化历史

相邻两个大版本之间的差异,新的在前。版本号链到该版的快照。

  1. PostgreSQL 15 ← 14 属性变更

    类型 布尔 枚举 枚举值 (无) pglz, lz4, zstd, on, off 简述 Compresses full-page writes written in WAL file. Compresses full-page writes written in WAL file with specified method.

  2. PostgreSQL 9.5 ← 9.4 新增此参数

    PostgreSQL 9.5 起可用

逐版本快照

每个收录版本里的 7 项事实,与上一个存在的版本不同的格子带底色。版本号链到该版。

版本 默认值单位上下文类型最小值最大值枚举值
9.5 off — 会话(超级用户) 布尔 — — —
9.6 off — 会话(超级用户) 布尔 — — —
10 off — 会话(超级用户) 布尔 — — —
11 off — 会话(超级用户) 布尔 — — —
12 off — 会话(超级用户) 布尔 — — —
13 off — 会话(超级用户) 布尔 — — —
14 off — 会话(超级用户) 布尔 — — —
15 off — 会话(超级用户) 枚举 — — pglz, lz4, zstd, on, off
16 off — 会话(超级用户) 枚举 — — pglz, lz4, zstd, on, off
17 off — 会话(超级用户) 枚举 — — pglz, lz4, zstd, on, off
18 off — 会话(超级用户) 枚举 — — pglz, lz4, zstd, on, off
19 off — 会话(超级用户) 枚举 — — pglz, lz4, zstd, on, off
20 — — — 枚举 — — —

参考资料

同类参数

参数 类型 上下文 默认值 版本变动 最近变更
Write-Ahead Log 预写式日志 15 个 ↗
设置 15
commit_delay 整数 会话(超级用户) 0 9.31 次
设置 commit_delay 会在发起 WAL 刷盘之前添加时间延迟。 现存
commit_siblings 整数 会话 5 9.11 次
执行 commit_delay 延迟前要求的并发活动事务的最小数目。 现存
fsync 布尔 重载生效 on —
如果打开这个参数,PostgreSQL 服务器将尝试确保更新被物理地写入到磁盘,做法是发出 fsync() 系统调用或者使用多种等价的方法(见 wal_sync_method)。 现存
full_page_writes 布尔 重载生效 on —
启用此参数时,PostgreSQL 服务器会在检查点之后首次修改每个磁盘页面时,将该页面的全部内容写入 WAL。 现存
synchronous_commit 枚举 会话 on 9.63 次
指定数据库服务器向客户端返回“成功”指示之前,必须完成多少 WAL 处理。 现存
wal_buffers 整数 重启生效 -1 8kB 9.11 次
用于还未写入磁盘的 WAL 数据的共享内存量。 现存
wal_compression 枚举 会话(超级用户) off 151 次
此参数启用使用指定的压缩方法对 WAL 进行压缩。 现存
wal_init_zero 布尔 会话(超级用户) on —
如果设置为 on(默认值),此选项会导致新的 WAL 文件被零填充。 现存
wal_level 枚举 重启生效 replica 103 次
wal_level 决定多少信息写入到 WAL 中。 现存
wal_log_hints 布尔 重启生效 off —
当这个参数为 on 时,PostgreSQL 服务器在检查点之后首次修改页面时把该磁盘页面的整个内容都写入 WAL,即使对所谓的提示位做非关键修改也会这样做。 现存
wal_recycle 布尔 会话(超级用户) on —
如果设置为 on(默认值),此选项通过重命名来回收 WAL 文件,从而避免创建新文件。 现存
wal_skip_threshold 整数 会话 2 MiB —
当 wal_level 为 minimal,且事务在创建或重写永久关系后提交时,此设置决定如何持久保存新数据。 现存
wal_sync_method 枚举 重载生效 fdatasync 8.41 次
用于将 WAL 更新强制写入磁盘的方法。 现存
wal_writer_delay 整数 重载生效 200 ms —
指定 WAL 写入器刷写 WAL 的频繁程度,以时间为单位。 现存
wal_writer_flush_after 整数 重载生效 1 MiB (128 × 8kB) —
指定 WAL 写入器刷写 WAL 的频繁程度,按数据量衡量。 现存