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

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

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

CONFIGURATION PARAMETER预写式日志 / 设置

fsync

如果打开这个参数,PostgreSQL 服务器将尝试确保更新被物理地写入到磁盘,做法是发出 fsync() 系统调用或者使用多种等价的方法(见 wal_sync_method)。

Forces synchronization of updates to disk.

布尔 重载生效 引入 7.4(基线) 现存至 20 devel 0 次默认值变更

类型
布尔bool
上下文
重载生效改配置文件后重载(pg_ctl reload / SIGHUP)即可生效
默认值
on
引入版本
7.4(基线)
状态
现存

PostgreSQL 18.7 手册 官方文档

版本轨迹

相对 PostgreSQL 17 无变化。

默认值变迁

on 9.0 – 19

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

手册说明

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

如果打开这个参数,PostgreSQL 服务器将尝试确保更新被物理地写入到磁盘,做法是发出 fsync() 系统调用或者使用多种等价的方法(见 wal_sync_method)。这保证了数据库集簇在一次操作系统或者硬件崩溃后能恢复到一个一致的状态。

虽然关闭 fsync 常常可以得到性能上的收益,但当发生断电或系统崩溃时可能造成不可恢复的数据损坏。因此,只有在能很容易地从外部数据中重建整个数据库时才建议关闭 fsync。

可以安全关闭 fsync 的情形包括:从备份文件初始装载一个新数据库集簇;用数据库集簇处理一批数据,处理后就丢弃并重建该数据库;或者使用经常重建且不用于故障切换的只读数据库克隆。仅有高质量硬件不足以成为关闭 fsync 的理由。

为确保将 fsync 从关闭改为打开后能够可靠恢复,必须将内核中所有已修改的缓冲区强制写入持久存储。可以在集簇已关闭或 fsync 已开启时,通过运行 initdb --sync-only、运行 sync、卸载文件系统或重启服务器来完成。

在很多情况下,为非关键事务关闭 synchronous_commit,可以获得关闭 fsync 所带来的大部分潜在性能收益,同时避免伴随的数据损坏风险。

fsync 只能在 postgresql.conf 文件中或在服务器命令行上设置。如果你关闭这个参数,请也考虑关闭 full_page_writes。

机制详解

强制将更新同步到磁盘。重新加载配置即可应用新值;已经开始的工作不会被追溯改变。

开启时,PostgreSQL 发出持久化屏障,保证 WAL 与数据写入顺序能承受操作系统或掉电故障。关闭可能改善写入跑分,但崩溃后会留下 crash recovery 无法修复的损坏;重新开启也不能追溯同步此前的不安全写入。

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

调优建议

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

  • OLTP在线事务处理

    持久生产数据保持 fsync=on。性能问题应从存储延迟、检查点、WAL 压缩和批处理着手,不要用关闭崩溃安全换吞吐。

  • OLAP分析与批处理

    批量装载同样需要可恢复性;用 UNLOGGED/临时数据结构或可重建 staging 明确缩小耐久范围,而不是全局关闭保护。

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

    持久小实例也保持开启。只有数据可随时重建且与生产明确隔离的临时集群,才可在书面接受风险后例外。

常见问题

  • 在持久数据上关闭,并误以为 UPS 或 RAID cache 单独就足够。
  • 重新开启后误以为此前不安全写入已自动持久化。
  • 只测试干净关机,不测试掉电恢复。
  • 混淆 pg_settings 的原始单位与配置文件可读单位。
  • 只做吞吐基准,不做崩溃恢复与归档还原。

演化历史

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

  1. PostgreSQL 12 ← 11 仅描述更新

    补充说明 The server will use the fsync() system call in several places to make sure that updates are physically written to disk. This insures that a database cluster will recover to a consistent state after an operating system or hardware crash. The server will use the fsync() system call in several places to make sure that updates are physically written to disk. This ensures that a database cluster will recover to a consistent state after an operating system or hardware crash.

逐版本快照

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

版本 默认值单位上下文类型最小值最大值枚举值
7.4 — — — 布尔 — — —
8.0 — — — 布尔 — — —
8.1 — — — 布尔 — — —
8.2 — — — 布尔 — — —
8.3 — — — 布尔 — — —
8.4 — — — 布尔 — — —
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 — — — 布尔 — — —

参考资料

同类参数

参数 类型 上下文 默认值 版本变动 最近变更
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 的频繁程度,按数据量衡量。 现存