本节描述控制 WAL 生成、刷写、检查点以及恢复行为的参数。
wal_level #指定 WAL 记录的详细程度。较高的级别会记录更多信息,以支持复制和归档恢复。 默认值通常是 replica。此参数只能在服务器启动时设置。
fsync #指定服务器是否在把 WAL 和数据文件写入磁盘后强制同步。默认值为 on。 关闭它会显著加快写入,但会带来数据损坏风险。此参数只能在服务器启动时设置。
synchronous_commit #指定事务提交时要等待到什么程度才算完成。默认值通常是 on, 也可以设为 remote_write、remote_apply、local 或 off。 更弱的设置可以降低延迟,但也会增加在崩溃时丢失已提交事务的风险。
full_page_writes #控制在检查点之后页面第一次被修改时,是否把整个页面内容写入 WAL。 默认值为 on。关闭它可以减少 WAL 量,但会增加崩溃后出现不可恢复数据损坏的风险。
wal_log_hints #指定在检查点之后页面第一次被修改时,是否即使只是提示位变化也写入整页映像到 WAL。 如果启用了数据校验和,这一行为总会发生,此设置会被忽略。此参数只能在服务器启动时设置。
wal_compression #指定是否以及使用何种压缩方式压缩写入 WAL 的整页映像。可用值通常包括 pglz、 lz4(如果编译时启用)和 zstd(如果编译时启用)。 启用后可减少 WAL 体积,但会增加 CPU 开销。
wal_init_zero #指定新建 WAL 文件时是否先用零填充。默认值为 on,这样可以确保文件空间在需要写入 WAL 记录前就已分配。 关闭它可以跳过这一步。此参数只能在服务器启动时设置。
wal_recycle #指定是否通过重命名回收旧 WAL 文件而不是创建新文件。默认值为 on。 在某些 Copy-On-Write 文件系统上,关闭该选项可能更快。
wal_sync_method #指定将 WAL 强制刷写到磁盘时使用的方法。若 fsync 关闭,则此设置无关紧要。 可选值包括 open_datasync、fdatasync、fsync、 fsync_writethrough 和 open_sync。并非所有平台都支持所有值, 默认值通常是平台支持的第一个选项。
wal_buffers #指定尚未写入磁盘的 WAL 数据可占用多少共享内存。默认值 -1 会自动选择合适大小, 约为 shared_buffers 的 1/32,但不少于 64kB。此参数只能在服务器启动时设置。
wal_writer_delay #指定 WAL 写入进程刷写 WAL 的间隔。默认值为 200ms。若指定值没有单位,则按毫秒计算。 此参数只能在 postgresql.conf 中或服务器命令行上设置。
wal_writer_flush_after #指定 WAL 写入进程在写出多少 WAL 后主动调用刷盘。默认值通常为 1MB。 该参数有助于平滑磁盘 I/O,但如果设置过大,可能会增加崩溃时恢复的工作量。
wal_skip_threshold #指定在某些情况下可以跳过回放旧 WAL 的阈值。该参数用于减少检查点和恢复过程中的无效工作。 默认值为 2MB。
commit_delay #指定在刷写 WAL 之前,提交进程可额外等待的时间。默认值为 0。它主要用于较少连接并且提交冲突较多的场景。 只有具有相应权限的用户才能更改此设置。
commit_siblings #指定当系统中至少有多少个并发事务时,commit_delay 才会生效。 默认值为 5。该参数只能与 commit_delay 配合使用。
checkpoint_timeout #指定两个检查点之间的最长时间。默认值为 5 分钟。若指定值没有单位,则按秒计算。 更长的间隔可以减少检查点开销,但会增加崩溃恢复需要回放的 WAL 量。
checkpoint_completion_target #指定检查点写入在整个检查点间隔中的目标完成比例。默认值为 0.9。 较高的值会让检查点 I/O 更均匀,但也可能延长检查点完成时间。
checkpoint_flush_after #指定检查点在写出多少数据后主动刷盘。默认值通常为 256kB。 这样可以减少一次性积压的大量 I/O。
checkpoint_warning #如果检查点过于频繁,则发出警告。默认值为 30 秒。若指定值没有单位,则按秒计算。 这有助于发现 max_wal_size 或检查点配置过小的问题。
max_wal_size #指定触发检查点前允许 WAL 增长到的目标上限。默认值通常为 1GB。 更大的值会减少检查点频率,但会增加崩溃恢复时间。
min_wal_size #指定在检查点后系统应尽量保留的 WAL 最小量。默认值通常为 80MB。 较大的值会减少 WAL 段文件被频繁创建和删除的开销。
archive_mode #指定是否把生成的 WAL 段归档。除 off 外,通常还可设为 on 或 always。 只有在配置了 archive_command 或 archive_library 时才真正有意义。 此参数只能在服务器启动时设置。
archive_command #指定把完成写入的 WAL 段复制到归档位置时执行的 shell 命令。 只有该命令返回零退出状态,服务器才认为归档成功。此参数只能在 postgresql.conf 中或服务器命令行上设置。
archive_library #指定执行 WAL 归档时要调用的共享库模块。它可以代替 archive_command 使用。 此参数只能在服务器启动时设置。
archive_timeout #指定即使 WAL 段尚未写满,也最多等待多久就强制切换并归档。默认值为 0,表示只在段写满时切换。 如果指定值没有单位,则按秒计算。
recovery_prefetch #控制恢复过程中是否预取即将需要的块。预取可以减少某些工作负载下的 I/O 等待时间。 此参数可与 wal_decode_buffer_size 和 maintenance_io_concurrency 配合使用。
wal_decode_buffer_size #指定在 WAL 中查找预取块时允许向前看的最大距离。默认值为 512kB。 此参数只能在服务器启动时设置。
本节所述设置只在恢复期间生效。如果需要后续恢复,必须重新配置它们。
“恢复”既包括把服务器作为备库运行,也包括执行定点恢复。 一般来说,备库模式用于高可用和读扩展,定点恢复则用于从数据丢失中恢复。
要以备库模式启动服务器,请在数据目录中创建名为 standby.signal 的文件。 服务器会进入恢复状态,并在到达归档 WAL 末尾后继续尝试恢复,通过 primary_conninfo 指定的发送服务器和/或通过 restore_command 获取新的 WAL 段。 在这种模式下,本节参数以及 Section 19.16.4 中的参数都可能生效, 但后者通常无须特别设置。
要以定点恢复模式启动服务器,请在数据目录中创建名为 recovery.signal 的文件。 如果同时创建了 standby.signal 和 recovery.signal, 则优先使用备库模式。定点恢复会在归档 WAL 全部回放完成,或者到达 recovery_target 时结束。
restore_command #指定用于从归档中提取 WAL 文件段的本地 shell 命令。该参数是归档恢复所必需的,但对流复制是可选的。 命令中的 %f 会被替换为归档文件名,%p 会被替换为服务器上的目标路径名, %r 会被替换为包含上一个可用重启点的文件名。要表示真正的百分号,请写成 %%。
该命令只有在成功时才应返回零退出状态。命令会被用于查询归档中可能不存在的文件,因此在找不到文件时必须返回非零。 如果命令因信号或 shell 错误而终止,恢复会中止并且服务器不会启动。
此参数只能在 postgresql.conf 中或通过服务器命令行设置。
archive_cleanup_command #指定在每个重启点执行的可选 shell 命令,用于清理不再需要的已归档 WAL 文件。 命令中的 %r 会被替换为包含最后一个可用重启点的文件名。 这个文件以及它之前的文件都可以安全删除。
对单一备库配置,常会把 pg_archivecleanup 用在此参数中。 如果多个备库共享同一个归档目录,则必须保证只有当所有服务器都不再需要某个 WAL 文件时才删除它。 要在命令中嵌入真正的百分号,请写成 %%。
如果命令返回非零退出状态,会写出警告日志;如果命令因信号或 shell 错误中止,则会报致命错误。 此参数只能在 postgresql.conf 中或通过服务器命令行设置。
recovery_end_command #指定一个只会在恢复结束时执行一次的 shell 命令。它通常用于在复制或恢复完成后执行清理。 与 archive_cleanup_command 类似,命令中的 %r 会被替换为包含最后一个可用重启点的文件名。
如果命令返回非零退出状态,会写出警告日志,数据库仍会继续启动;如果命令因信号或 shell 错误中止, 则数据库不会继续启动。此参数只能在 postgresql.conf 中或通过服务器命令行设置。
默认情况下,恢复会一直执行到 WAL 日志末尾。下面这些参数可以指定更早的停止点。 recovery_target、recovery_target_lsn、recovery_target_name、 recovery_target_time 和 recovery_target_xid 中最多只能选择一个, 否则会报错。此参数只能在服务器启动时设置。
recovery_target #指定恢复应在达到一致状态后尽快结束,也就是尽早结束。对于从在线备份恢复,这意味着停在备份结束的位置。 在技术上这是一个字符串参数,但目前唯一允许的值是 immediate。
recovery_target_name #指定由 pg_create_restore_point() 创建的命名恢复点,恢复将停在该恢复点。
recovery_target_time #指定恢复应停在的时间戳。精确停止点还受 recovery_target_inclusive 影响。 该值应使用 timestamp with time zone 接受的相同格式,但不能使用时区缩写, 除非已经在配置文件中设置了 timezone_abbreviations。推荐使用 UTC 数值偏移或完整时区名。
recovery_target_xid #指定恢复应停在的事务 ID。事务 ID 在事务开始时按顺序分配,但完成顺序可能不同。 目标事务之前(以及可能包括该事务)的提交都会被恢复。精确停止点还受 recovery_target_inclusive 影响。
recovery_target_lsn #指定恢复应继续到的 WAL LSN。精确停止点也受 recovery_target_inclusive 影响。 该参数使用系统数据类型 pg_lsn 解析。
recovery_target_inclusive #指定是停在恢复目标之后(on),还是停在恢复目标之前(off)。 适用于 recovery_target_lsn、recovery_target_time 或 recovery_target_xid 被指定的情况。默认值为 on。
recovery_target_timeline #指定恢复到某个特定时间线。可取数值时间线 ID,或特殊值 current 和 latest。 current 会沿着生成基础备份时的时间线恢复,latest 会恢复到归档中能找到的最新时间线。默认值为 latest。
如果要以十六进制指定时间线 ID,例如从 WAL 文件名或历史文件中提取,请前置 0x。 例如,文件名 00000011000000A10000004F 的时间线 ID 是 0x11, 即十进制 17。
一般只在更复杂的再次恢复场景中需要设置此参数,也就是你需要回到一个状态,而那个状态本身又是一次时间点恢复的结果。 相关讨论见 Section 25.3.6。
recovery_target_action #指定到达恢复目标后服务器应立即采取的动作。默认值是 pause,表示暂停恢复。 promote 表示结束恢复并开始接受连接,shutdown 则表示到达目标后直接停止服务器。
pause 的用途是:如果目标位置正是你希望查询的恢复位置,就允许数据库在该点上继续提供只读查询。 暂停状态可通过 pg_wal_replay_resume() 继续。如果目标点不是最终想要的位置, 则可以关闭服务器、修改恢复目标并重启继续恢复。
shutdown 在希望实例停留在某个特定重放点时很有用。之后它仍然可以继续重放更多 WAL 记录。 由于在设置为 shutdown 时不会移除 recovery.signal, 后续启动仍会在到达该目标后关闭,除非更改配置或手工删除该文件。
如果没有设置恢复目标,此参数无效。若未启用 hot_standby, pause 的效果等同于 shutdown。如果在升级过程中达到恢复目标, pause 的效果与 promote 相同。
如果已经配置了恢复目标,但在到达目标前归档恢复结束,服务器将以致命错误关闭。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。