CONFIGURATION PARAMETER预写式日志 / 设置
full_page_writes
检查点后页面首次修改时将完整页面写入 WAL。
Writes full pages to WAL when first modified after a checkpoint.
布尔 重载生效 引入 9.0(基线) 现存至 20 devel 0 次默认值变更
- 类型
- 布尔bool
- 上下文
- 重载生效改配置文件后重载(pg_ctl reload / SIGHUP)即可生效
- 默认值
on- 分类
- 预写式日志 / 设置
- 引入版本
- 9.0(基线)
- 状态
- 现存
版本轨迹
相对 PostgreSQL 17 无变化。
默认值变迁
默认值自 PostgreSQL 9.0 起没有变过。带单位的取值换算成了可读形式,原始的 boot_val 与单位写在悬浮提示里。
手册说明
当这个参数为打开时,PostgreSQL服务器在一个检查点之后的页面的第一次修改期间将每个页面的全部内容写到 WAL 中。这么做是因为在操作系统崩溃期间正在处理的一次页写入可能只有部分完成,从而导致在一个磁盘页面中混合有新旧数据。在崩溃后的恢复期间,通常存储在 WAL 中的行级改变数据不足以完全恢复这样一个页面。存储整页镜像可以保证页面被正确存储,但代价是增加了必须被写入 WAL 的数据量(因为 WAL 重放总是从一个检查点开始,所以在检查点后每个页面的第一次改变时这样做就够了。因此,一种减小全页面写开销的方法是增加检查点间隔参数值)。
把这个参数关闭会加快正常操作,但是在系统失败后可能导致不可恢复的数据损坏,或者静默的数据损坏。其风险类似于关闭fsync, 但是风险较小。并且只有在可关闭fsync的情况下才应该关闭它。
关闭这个选项并不影响用于时间点恢复(PITR)的 WAL 归档使用(见Section 25.3)。
这个参数只能在postgresql.conf文件中或在服务器命令行上设置。默认值是on。
机制详解
检查点后页面首次修改时将完整页面写入 WAL。重新加载配置即可应用新值;已经开始的工作不会被追溯改变。
每次检查点后,数据页第一次修改会把完整页映像写入 WAL,避免撕裂页恢复时拼接新旧扇区。额外 WAL 集中在检查点后并受 wal_compression 影响;除非存储栈提供等价的原子页保证,否则不应关闭。
应把 full_page_writes 与 data_sync_retry、restart_after_crash、recovery_init_sync_method 一起监控和变更。先在对应角色与真实负载上验证,再按其 sighup context 选择会话修改、reload 或 restart;历史默认值并不等于当前有效值。
调优建议
按典型负载给出的取值思路,不是放之四海皆准的配方:实际取值要看数据量、并发度与硬件。
-
OLTP在线事务处理
持久生产数据保持 full_page_writes=on。性能问题应从存储延迟、检查点、WAL 压缩和批处理着手,不要用关闭崩溃安全换吞吐。
-
OLAP分析与批处理
批量装载同样需要可恢复性;用 UNLOGGED/临时数据结构或可重建 staging 明确缩小耐久范围,而不是全局关闭保护。
-
小规格低配实例与开发机
持久小实例也保持开启。只有数据可随时重建且与生产明确隔离的临时集群,才可在书面接受风险后例外。
常见问题
- 没有端到端原子页写保证就关闭该参数。
- 把它增加的 WAL 量误解成每次修改都会记录整页。
- 忽略检查点之后全页镜像集中出现的 WAL 突发。
- 误以为 reload 后会追溯保护在 full_page_writes=off 期间已经生成的 WAL。
- 关闭参数做基准,却没有端到端崩溃、恢复与 torn-page 测试。
演化历史
相邻两个大版本之间的差异,新的在前。版本号链到该版的快照。
-
PostgreSQL 20 ← 19 沿用 19
事实沿用 19
逐版本快照
每个收录版本里的 7 项事实,与上一个存在的版本不同的格子带底色。版本号链到该版。
| 版本 | 默认值 | 单位 | 上下文 | 类型 | 最小值 | 最大值 | 枚举值 |
|---|---|---|---|---|---|---|---|
| 9.0 | on |
— |
重载生效 |
布尔 |
— |
— |
— |
| 9.1 | on |
— |
重载生效 |
布尔 |
— |
— |
— |
| 9.2 | on |
— |
重载生效 |
布尔 |
— |
— |
— |
| 9.3 | on |
— |
重载生效 |
布尔 |
— |
— |
— |
| 9.4 | on |
— |
重载生效 |
布尔 |
— |
— |
— |
| 9.5 | on |
— |
重载生效 |
布尔 |
— |
— |
— |
| 9.6 | on |
— |
重载生效 |
布尔 |
— |
— |
— |
| 10 | on |
— |
重载生效 |
布尔 |
— |
— |
— |
| 11 | on |
— |
重载生效 |
布尔 |
— |
— |
— |
| 12 | on |
— |
重载生效 |
布尔 |
— |
— |
— |
| 13 | on |
— |
重载生效 |
布尔 |
— |
— |
— |
| 14 | on |
— |
重载生效 |
布尔 |
— |
— |
— |
| 15 | on |
— |
重载生效 |
布尔 |
— |
— |
— |
| 16 | on |
— |
重载生效 |
布尔 |
— |
— |
— |
| 17 | on |
— |
重载生效 |
布尔 |
— |
— |
— |
| 18 | on |
— |
重载生效 |
布尔 |
— |
— |
— |
| 19 | on |
— |
重载生效 |
布尔 |
— |
— |
— |
| 20 沿用 | on |
— |
重载生效 |
布尔 |
— |
— |
— |
参考资料
同类参数
| 参数 | 类型 | 上下文 | 默认值 | 版本变动 | 最近变更 |
|---|---|---|---|---|---|
| 设置 15 | |||||
commit_delay |
整数 | 会话(超级用户) | 0 |
9.31 次 | |
| 设置事务提交与将 WAL 刷入磁盘之间的延迟(微秒)。 | 现存 | ||||
commit_siblings |
整数 | 会话 | 5 |
9.11 次 | |
| 设置启用 commit_delay 前所需的并发活动事务最低数量。 | 现存 | ||||
fsync |
布尔 | 重载生效 | on |
— | |
| 强制将更新同步到磁盘。 | 现存 | ||||
full_page_writes |
布尔 | 重载生效 | on |
— | |
| 检查点后页面首次修改时将完整页面写入 WAL。 | 现存 | ||||
synchronous_commit |
枚举 | 会话 | on |
9.63 次 | |
| 设置当前事务提交时使用的同步级别。 | 现存 | ||||
wal_buffers |
整数 | 重启生效 | -1 8kB |
9.11 次 | |
| 设置共享内存中用于 WAL 的磁盘页缓冲区数量。 | 现存 | ||||
wal_compression |
枚举 | 会话(超级用户) | off |
151 次 | |
| 使用指定方法压缩写入 WAL 的整页映像。 | 现存 | ||||
wal_init_zero |
布尔 | 会话(超级用户) | on |
— | |
| 新 WAL 文件首次使用前先写零。 | 现存 | ||||
wal_level |
枚举 | 重启生效 | replica |
103 次 | |
| 设置写入 WAL 的信息级别。 | 现存 | ||||
wal_log_hints |
布尔 | 重启生效 | off |
— | |
| 页面在检查点后首次发生非关键修改时也将完整页面写入 WAL。 | 现存 | ||||
wal_recycle |
布尔 | 会话(超级用户) | on |
— | |
| 通过重命名复用 WAL 文件。 | 现存 | ||||
wal_skip_threshold |
整数 | 会话 | 2 MiB |
— | |
| 设置用 fsync 新文件代替写 WAL 的最小文件规模。 | 现存 | ||||
wal_sync_method |
枚举 | 重载生效 | fdatasync |
— | |
| 选择将 WAL 更新强制写入磁盘的方法。 | 现存 | ||||
wal_writer_delay |
整数 | 重载生效 | 200 ms |
— | |
| 设置 WAL writer 两次刷写之间的时间。 | 现存 | ||||
wal_writer_flush_after |
整数 | 重载生效 | 1 MiB (128 × 8kB) |
— | |
| 设置触发 WAL writer 刷盘的写出 WAL 数量。 | 现存 | ||||