CONFIGURATION PARAMETER开发者选项
zero_damaged_pages
检测到损坏的页面头通常会导致 PostgreSQL 报告错误,中止当前事务。
Continues processing past damaged page headers.
布尔 会话(超级用户) 引入 7.4(基线) 现存至 20 devel 0 次默认值变更
- 类型
- 布尔bool
- 上下文
- 会话(超级用户)超级用户可在会话内用 SET 修改
- 默认值
off- 分类
- 开发者选项
- 引入版本
- 7.4(基线)
- 状态
- 现存
版本轨迹
相对 PostgreSQL 17 无变化。
默认值变迁
已记录的默认值在 PostgreSQL 9.0–19 之间未变。带单位的取值换算成了可读形式,原始的 boot_val 与单位写在悬浮提示里。
手册说明
检测到损坏的页面头通常会导致 PostgreSQL 报告错误,中止当前事务。将 zero_damaged_pages 设置为 on 会导致系统报告警告,将内存中的损坏页面清零,并继续处理。这种行为会破坏数据,即损坏页面上的所有行。但是,它确实允许你跳过错误,并从表中可能存在的未损坏页面中检索行。如果由于硬件或软件错误而发生损坏,这对于恢复数据很有用。通常在放弃从表的损坏页面恢复数据的希望之前,不应将其设置为 on。清零的页面不会强制写入磁盘,因此建议在再次关闭此参数之前重新创建表或索引。默认设置为 off。只有超级用户和具有适当 SET 权限的用户才能更改此设置。
机制详解
PostgreSQL 检测到损坏页面头时,zero_damaged_pages 会在内存中替换为全零页、发出警告并继续;原页面上的每一行都会从抢救读取中丢失。
零页不会自动强制写盘,因此继续使用该关系会产生不一致行为;抢救后必须重建表或索引。
这是备份与存储恢复手段耗尽后的最后数据提取开关。必须在已保全副本上窄范围使用,并在完成后立即关闭。其 superuser 上下文允许获授权会话修改,无需重启服务器。
调优建议
按典型负载给出的取值思路,不是放之四海皆准的配方:实际取值要看数据量、并发度与硬件。
-
OLTP在线事务处理
绝不能把 zero_damaged_pages 当作调优或常态可用性设置。应停止写入、保全不可变副本、用尽备份/存储修复、记录预期数据损失、窄范围抢救、重建并验证后才可恢复服务。
-
OLAP分析与批处理
只读分析也不会让 zero_damaged_pages 安全:损坏页面仍会污染结果或结构。只能在可丢弃抢救副本上使用,并明确接受数据丢失。
-
小规格低配实例与开发机
不能因为没有副本就直接启用 zero_damaged_pages。先保全原件并寻找干净备份;该开关可能把可见损坏变成静默丢失。
常见问题
- 限时诊断或恢复任务结束后仍让 zero_damaged_pages 保持启用。
- 在生产数据的唯一副本上进行实验。
- 低估日志、core、临时文件、WAL、CPU 或连接名额放大。
- 把服务器能启动或查询能完成误当作数据与行为正确的证明。
演化历史
相邻两个大版本之间的差异,新的在前。版本号链到该版的快照。
-
PostgreSQL 17 ← 16 仅描述更新
补充说明
Detection of a damaged page header normally causes PostgreSQL to report an error, aborting the current transaction. Setting zero_damaged_pages to true causes the system to instead report a warning, zero out the damaged page, and continue processing. This behavior will destroy data, namely all the rows on the damaged page.Detection of a damaged page header normally causes PostgreSQL to report an error, aborting the current transaction. Setting "zero_damaged_pages" to true causes the system to instead report a warning, zero out the damaged page, and continue processing. This behavior will destroy data, namely all the rows on the damaged page.
逐版本快照
每个收录版本里的 7 项事实,与上一个存在的版本不同的格子带底色。版本号链到该版。
| 版本 | 默认值 | 单位 | 上下文 | 类型 | 最小值 | 最大值 | 枚举值 |
|---|---|---|---|---|---|---|---|
| 7.4 | — | — | — | 布尔 |
— | — | — |
| 8.0 | — | — | — | 布尔 |
— | — | — |
| 8.1 | — | — | — | 布尔 |
— | — | — |
| 8.2 | — | — | — | 布尔 |
— | — | — |
| 8.3 | — | — | — | 布尔 |
— | — | — |
| 8.4 | — | — | — | 布尔 |
— | — | — |
| 9.0 | off |
— |
会话(超级用户) |
布尔 |
— |
— |
— |
| 9.1 | off |
— |
会话(超级用户) |
布尔 |
— |
— |
— |
| 9.2 | off |
— |
会话(超级用户) |
布尔 |
— |
— |
— |
| 9.3 | off |
— |
会话(超级用户) |
布尔 |
— |
— |
— |
| 9.4 | off |
— |
会话(超级用户) |
布尔 |
— |
— |
— |
| 9.5 | off |
— |
会话(超级用户) |
布尔 |
— |
— |
— |
| 9.6 | off |
— |
会话(超级用户) |
布尔 |
— |
— |
— |
| 10 | off |
— |
会话(超级用户) |
布尔 |
— |
— |
— |
| 11 | off |
— |
会话(超级用户) |
布尔 |
— |
— |
— |
| 12 | off |
— |
会话(超级用户) |
布尔 |
— |
— |
— |
| 13 | off |
— |
会话(超级用户) |
布尔 |
— |
— |
— |
| 14 | off |
— |
会话(超级用户) |
布尔 |
— |
— |
— |
| 15 | off |
— |
会话(超级用户) |
布尔 |
— |
— |
— |
| 16 | off |
— |
会话(超级用户) |
布尔 |
— |
— |
— |
| 17 | off |
— |
会话(超级用户) |
布尔 |
— |
— |
— |
| 18 | off |
— |
会话(超级用户) |
布尔 |
— |
— |
— |
| 19 | off |
— |
会话(超级用户) |
布尔 |
— |
— |
— |
| 20 | — | — | — | 布尔 |
— | — | — |
参考资料
同类参数
| 参数 | 类型 | 上下文 | 默认值 | 版本变动 | 最近变更 |
|---|---|---|---|---|---|
composite_type_mismatch |
枚举 | 会话(超级用户) | error |
— | |
| 设置如何处理复合类型数据的版本不匹配。 | 现存 | ||||
allow_in_place_tablespaces |
布尔 | 会话(超级用户) | off |
— | |
| 当向 CREATE TABLESPACE 命令提供空的位置字符串时,允许将表空间创建为 pg_tblspc 内的目录。 | 现存 | ||||
allow_system_table_mods |
布尔 | 会话(超级用户) | off |
131 次 | |
| 允许修改系统表的结构以及对系统表进行某些其他风险操作。 | 现存 | ||||
backtrace_functions |
字符串 | 会话(超级用户) | 空字符串 |
— | |
| 这个参数包含一个以逗号分隔的 C 函数名称列表。 | 现存 | ||||
debug_copy_parse_plan_trees |
布尔 | — | — | ||
| 启用该选项会强制所有解析树和计划树都经过 copyObject() 处理,以便更容易发现 copyObject() 中的错误和遗漏。 | 现存 | ||||
debug_deadlocks |
布尔 | — | — | ||
| 如果设置,当死锁超时发生时,转储所有当前锁的信息。 | 现存 | ||||
debug_discard_caches |
整数 | 会话(超级用户) | 0 |
— | |
| 当设置为 1 时,每个系统目录缓存条目都会在最早可能的时刻被置为无效,无论是否真的发生了使其失效的事件。 | 现存 | ||||
debug_io_direct |
字符串 | 重启生效 | 空字符串 |
— | |
| 要求内核使用 O_DIRECT(大多数类 Unix 系统)、F_NOCACHE(macOS)或 FILE_FLAG_NO_BUFFERING(Windows),尽量减小关系数据和 WAL 文件缓存的影响。 | 现存 | ||||
debug_logical_replication_streaming |
枚举 | 会话 | buffered |
— | |
| 允许值为 buffered 和 immediate。 | 现存 | ||||
debug_parallel_query |
枚举 | 会话 | off |
— | |
| 允许出于测试目的使用并行查询,即使预计不会带来性能收益也是如此。 | 现存 | ||||
debug_raw_expression_coverage_test |
布尔 | — | — | ||
| 启用该选项会强制所有 DML 语句的原始解析树都经过 raw_expression_tree_walker() 扫描,以便更容易发现该函数中的错误和遗漏。 | 现存 | ||||
debug_shared_buffers |
整数 | — | — | ||
| 缓冲区空闲列表报告之间的秒数。 | 于 8.1 移除 | ||||
debug_write_read_parse_plan_trees |
布尔 | — | — | ||
| 启用该选项会强制所有解析树和计划树都经过 outfuncs.c/readfuncs.c 处理,以便更容易发现这些模块中的错误和遗漏。 | 现存 | ||||
force_parallel_mode |
枚举 | 会话 | off |
— | |
| 允许为测试目的使用并行查询,即使预期不会带来性能收益。 | 于 16 移除 | ||||
ignore_checksum_failure |
布尔 | 会话(超级用户) | off |
— | |
| 只有启用数据校验和时才有效。 | 现存 | ||||
ignore_invalid_pages |
布尔 | 重启生效 | off |
— | |
| 如果设置为 off(默认值),则在恢复期间检测到引用无效页面的 WAL 记录会导致 PostgreSQL 引发 PANIC 级别错误,中止恢复。 | 现存 | ||||
ignore_system_indexes |
布尔 | 连接时 | off |
— | |
| 读取系统表时忽略系统索引(但是修改系统表时依然同时更新索引)。 | 现存 | ||||
jit_debugging_support |
布尔 | 连接时(超级用户) | off |
— | |
| 如果 LLVM 具有所需的功能,则向 GDB 注册生成的函数。 | 现存 | ||||
jit_dump_bitcode |
布尔 | 会话(超级用户) | off |
— | |
| 将生成的 LLVM IR 写入文件系统,位于 data_directory 内。 | 现存 | ||||
jit_expressions |
布尔 | 会话 | on |
— | |
| 当 JIT 编译被激活时(见第 30.2 节),确定表达式是否用 JIT 编译。 | 现存 | ||||
jit_profiling_support |
布尔 | 连接时(超级用户) | off |
— | |
| 如果 LLVM 具有所需的功能,则输出让 perf 对 JIT 生成的函数进行性能分析所需的数据。 | 现存 | ||||
jit_tuple_deforming |
布尔 | 会话 | on |
— | |
| 当 JIT 编译被激活时(见第 30.2 节),确定元组拆解是否被 JIT 编译。 | 现存 | ||||
log_btree_build_stats |
布尔 | — | — | ||
| 如果设置,会记录 B-树操作上的系统资源使用情况统计(内存和 CPU)。 | 现存 | ||||
post_auth_delay |
整数 | 连接时 | 0 s |
— | |
| 新服务器进程启动并完成认证过程之后的延迟时间。 | 现存 | ||||
pre_auth_delay |
整数 | 重载生效 | 0 s |
— | |
| 新服务器进程刚刚派生之后、执行认证过程之前的延迟时间。 | 现存 | ||||
remove_temp_files_after_crash |
布尔 | 重载生效 | on |
— | |
| 当设置为 on(默认值)时,PostgreSQL 将在后端崩溃后自动删除临时文件。 | 现存 | ||||
send_abort_for_crash |
布尔 | 重载生效 | off |
— | |
| 默认情况下,后端崩溃后,postmaster 会向其余子进程发送 SIGQUIT 信号使其停止,这样它们可以较为平稳地退出。 | 现存 | ||||
send_abort_for_kill |
布尔 | 重载生效 | off |
— | |
| 默认情况下,在尝试用 SIGQUIT 停止子进程之后,postmaster 会等待五秒,然后发送 SIGKILL 强制立即终止。 | 现存 | ||||
trace_connection_negotiation |
布尔 | 重启生效 | off |
— | |
| 记录认证开始前连接握手过程的详细信息。 | 现存 | ||||
trace_lock_oidmin |
整数 | — | 8.41 次 | ||
| 如果设置,不会跟踪 OID 小于此值的表上的锁(用于避免在系统表上的输出)。 | 现存 | ||||
trace_lock_table |
整数 | — | 8.41 次 | ||
| 无条件地跟踪此表(OID)上的锁。 | 现存 | ||||
trace_locks |
布尔 | — | — | ||
| 如果开启,发出锁使用情况的信息。 | 现存 | ||||
trace_lwlocks |
布尔 | — | — | ||
| 如果开启,发出轻量级锁的使用信息。 | 现存 | ||||
trace_notify |
布尔 | 会话 | off |
— | |
| 为 LISTEN 和 NOTIFY 命令生成大量调试输出。 | 现存 | ||||
trace_recovery_messages |
枚举 | 重载生效 | log |
— | |
| 启用原本不会记录的恢复相关调试输出。 | 于 17 移除 | ||||
trace_sort |
布尔 | 会话 | off |
— | |
| 如果开启,输出排序操作中的资源使用信息。 | 现存 | ||||
trace_userlocks |
布尔 | — | — | ||
| 如果开启,发出关于用户锁使用的信息。 | 现存 | ||||
wal_consistency_checking |
字符串 | 会话(超级用户) | 空字符串 |
— | |
| 这个参数被设计用来检查 WAL 重做例程中的缺陷。 | 现存 | ||||
wal_debug |
布尔 | — | 8.01 次 | ||
| 如果被打开,WAL 相关的调试输出将被发出。 | 现存 | ||||
zero_damaged_pages |
布尔 | 会话(超级用户) | off |
— | |
| 检测到损坏的页面头通常会导致 PostgreSQL 报告错误,中止当前事务。 | 现存 | ||||