ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 18.17\. 开发人员选项 下面的选项目的是在PostgreSQL代码上使用,并且在某些情况下可以帮助恢复严重损坏了的数据库。 在生产环境里没有理由使用这些设置。因此,我们把他们从样例`postgresql.conf`文件中排除了出去。 请注意许多这些选项要求特殊的源代码编译标志才能运转。 `allow_system_table_mods` (`boolean`) 允许修改系统表的结构。它可以被`initdb`使用。这个值只能在服务器启动的时候设置。 `debug_assertions` (`boolean`) 打开各种断言检查。这是调试助手。如果你经历了奇怪的问题或者崩溃, 那么你可能会想把这个打开,因为它可能暴露编程的错误。要使用这个选项, 我们必须在编译PostgreSQL的时候定义宏`USE_ASSERT_CHECKING` (通过`configure`选项`--enable-cassert`完成)。 请注意,如果启用断言选项编译PostgreSQL,那么`debug_assertions`缺省就是`on` `ignore_system_indexes` (`boolean`) 读取系统表时忽略系统索引(但是修改系统表时依然同时修改索引)。 这个在从系统索引被破坏的表中恢复数据的时候很有用。该参数不能在会话启动之后修改。 `post_auth_delay` (`integer`) 如果为非零,那么在一个新的服务器进程启动并完成认证过程之后, 就会延迟这么多秒。这样就给开发人员一个机会用调试器附着在一个服务器进程上。 该参数不能在会话启动之后修改。 `pre_auth_delay` (`integer`) 如果为非零,那么在一个新的服务器进程派生出来之后, 就会延迟这么多秒,然后才会继续认证过程。 这样就给开发人员一个机会用调试器附着在一个服务器进程上跟踪认证里面的异常行为。 这个选项只能在服务器启动的时候或者在`postgresql.conf`文件里设置。 `trace_notify` (`boolean`) 为`LISTEN`和`NOTIFY`命令生成大量调试输出。 [client_min_messages](#calibre_link-1448)或者[log_min_messages](#calibre_link-1449) 必须是`DEBUG1`。 或者更低才能把这些输出分别发送到客户端或者服务器日志。 `trace_recovery_messages` (`enum`) 启用恢复相关的调试输出的日志记录,否则 不会被记录。该参数允许用户覆盖[log_min_messages](#calibre_link-1449)的正常设置, 但仅限于特定消息。打算调试双机热备时使用。 有效值`DEBUG5`, `DEBUG4`,`DEBUG3`, `DEBUG2`, `DEBUG1`和`LOG`。 默认情况下,`LOG`不影响记录决定。其他值会导致恢复相关的 记录优先级或更高的调试消息,虽然他们 有`LOG`的优先级;对于`log_min_messages`常用的设置 导致无条件地发送这些到服务器日志。 这个参数只能在`postgresql.conf`文件或者服务器命令行中设置。 `trace_sort` (`boolean`) 如果打开,发出在排序操作中的资源使用的有关信息。 这个选项只有在编译PostgreSQL的时候定义了`TRACE_SORT` 宏的时候才可用(不过,目前`TRACE_SORT`缺省就是定义了的)。 `trace_locks` (`boolean`) 如果打开,发出关于锁用法信息。信息转储包括锁定操作的类型,锁定类型和 被锁定或解锁的对象的唯一标识符。 还包括已授权在该对象上的锁类型 以及等待此对象上的锁类型的位掩码。 对于每个锁类型的授予锁和等待锁的数量计数以及总数都被转储。 该日志文件输出的例子在这显示: ``` LOG: LockAcquire: new: lock(0xb7acd844) id(24688,24696,0,0,0,1) grantMask(0) req(0,0,0,0,0,0,0)=0 grant(0,0,0,0,0,0,0)=0 wait(0) type(AccessShareLock) LOG: GrantLock: lock(0xb7acd844) id(24688,24696,0,0,0,1) grantMask(2) req(1,0,0,0,0,0,0)=1 grant(1,0,0,0,0,0,0)=1 wait(0) type(AccessShareLock) LOG: UnGrantLock: updated: lock(0xb7acd844) id(24688,24696,0,0,0,1) grantMask(0) req(0,0,0,0,0,0,0)=0 grant(0,0,0,0,0,0,0)=0 wait(0) type(AccessShareLock) LOG: CleanUpLock: deleting: lock(0xb7acd844) id(24688,24696,0,0,0,1) grantMask(0) req(0,0,0,0,0,0,0)=0 grant(0,0,0,0,0,0,0)=0 wait(0) type(INVALID) ``` 结构详情可以从`src/include/storage/lock.h`里找到。 当编译PostgreSQL时,如果定义了`LOCK_DEBUG` 宏指令,则只能使用这个参数。 `trace_lwlocks` (`boolean`) 如果打开,则发出轻量级锁用法信息。轻量级锁主要提供访问互斥以共享内存数据结构。 当编译PostgreSQL时,如果定义了`LOCK_DEBUG` 宏指令,则只能使用这个参数。 `trace_userlocks` (`boolean`) 如果打开,则发出关于用户锁用法的信息。输出类似于`trace_locks`, 仅仅为了咨询锁。 当编译PostgreSQL时,如果定义了`LOCK_DEBUG` 宏指令,则只能使用这个参数。 `trace_lock_oidmin` (`integer`) 如果设置,不跟踪低于这个OID的表锁。(为了避免系统表输出) 当编译PostgreSQL时,如果定义了`LOCK_DEBUG` 宏指令,则只能使用这个参数。 `trace_lock_table` (`integer`) 无条件跟踪表(OID)上的锁。 当编译PostgreSQL时,如果定义了`LOCK_DEBUG` 宏指令,则只能使用这个参数。 `debug_deadlocks` (`boolean`) 当死锁发生超时,如果设置,那么备份所有当前锁的信息。 当编译PostgreSQL时,如果定义了`LOCK_DEBUG` 宏指令,则只能使用这个参数。 `log_btree_build_stats` (`boolean`) 如果设置,日志系统资源用法在各种B-tree操作上统计(内存和CPU)。 当编译PostgreSQL时,如果定义了`BTREE_BUILD_STATS` 宏指令,则只能使用这个参数。 `wal_debug` (`boolean`) 打开 WAL 相关的调试输出。只有在编译PostgreSQL的时候打开了 `WAL_DEBUG`宏定义的情况下,这个选项才可用。 `ignore_checksum_failure` (`boolean`) 如果启动[data checksums](#calibre_link-1547),已经受到影响。 在读期间校验失败检测导致PostgreSQL报告错误, 终止当前事务。设置`ignore_checksum_failure`的原因系统忽略失败 (但仍然报告一个警告),并且 继续处理。这种行为可能_造成死机,传播或隐藏的崩溃,或其他严重的问题_。 然而,如果块头仍然是清醒的,它可能允许你获取错误并且检索仍然完好无损出现在表中未处理元组 。 如果头部崩溃,即使启用这个选项也将报告一个错误。 默认设置为`off`,它只能由超级用户改变。 `zero_damaged_pages` (`boolean`) 如果侦测到一个损坏了的页面头通常会导致PostgreSQL报告一个错误,并且退出当前事务。 把`zero_damaged_pages`设置为 on 则令系统报告一个警告,把内存中损坏的页面填充零,然后继续处理。 这种行为会_破坏数据_,也就是所有在已经损坏页面上的行。 但是它允许你绕开坏页面然后从表中尚存的未损坏页面上继续检索数据行。 因此它在因为硬件或者软件错误导致的崩溃中进行恢复是很有用的。 通常你不应该把它设置为 on , 除非你已经彻底放弃从崩溃的页面中恢复数据。 零填充页面不强制到磁盘,所以建议重新创建表或再次关闭此参数之前的索引。 缺省的设置是`off`,并且只有超级用户可以改变它。