Skip to content

20.17. 开发者选项#

以下参数适用于开发者测试,切勿在生产数据库中使用。但是,其中一些参数可用于帮助恢复严重损坏的数据库。因此,它们已被排除在示例postgresql.conf文件中。请注意,其中许多参数都需要特殊的源编译标志才能正常工作。

allow_in_place_tablespaces (boolean) #

当向 CREATE TABLESPACE 命令提供空位置字符串时,允许在 pg_tblspc 内将表空间创建为目录。此操作旨在允许测试主服务器和备用服务器在同一台机器上运行的复制场景。此类目录可能会混淆备份工具,因为这些工具只期望在该位置找到符号链接。只有超级用户和具有适当 SET 权限的用户才能更改此设置。

allow_system_table_mods (boolean) #

允许修改系统表的结构以及对系统表执行其他某些有风险的操作。否则,即使对于超级用户也不允许这样做。不当使用此设置会导致不可挽回的数据丢失或严重损坏数据库系统。只有超级用户和具有适当 SET 权限的用户才能更改此设置。

backtrace_functions (string) #

此参数包含一个用逗号分隔的 C 函数名称列表。如果引发错误,并且发生错误的内部 C 函数的名称与列表中的值匹配,则会将回溯信息与错误消息一起写入服务器日志。这可用于调试源代码的特定区域。

并非所有平台都支持回溯,并且回溯的质量取决于编译选项。

只有超级用户和具有适当 SET 权限的用户可以更改此设置。

debug_discard_caches (integer) #

当设置为 1 时,每个系统目录缓存项都会在第一个可能的机会失效,无论是否真的发生了会使其失效的任何事情。结果是系统目录的缓存实际上被禁用,因此服务器将运行得非常慢。较高的值会递归运行缓存失效,这会更慢,并且仅对测试缓存逻辑本身有用。 0 的默认值选择正常的目录缓存行为。

在尝试触发涉及并发目录更改的难以重现的错误时,此参数可能非常有用,但其他情况下很少需要。有关详细信息,请参阅源代码文件 inval.cpg_config_manual.h

当在编译时定义 DISCARD_CACHES_ENABLED 时,支持此参数(在使用 configure 选项 --enable-cassert 时会自动发生)。在生产版本中,其值将始终为 0,并且尝试将其设置为另一个值将引发错误。

debug_io_direct (string) #

要求内核使用 O_DIRECT(大多数类 Unix 系统)、F_NOCACHE(macOS)或 FILE_FLAG_NO_BUFFERING(Windows)最小化关系数据和 WAL 文件的缓存效果。

可以将其设置为一个空字符串(默认值)以禁用直接 I/O 的使用,也可以将其设置为一个逗号分隔的操作列表,这些操作应该使用直接 I/O。有效选项包括主数据文件 data、WAL 文件 wal 以及在最初分配时用于 WAL 文件 wal_init

某些操作系统和文件系统不支持直接 I/O,因此非默认设置可能会在启动时被拒绝或导致错误。

目前此功能会降低性能,并且仅供开发人员测试使用。

debug_parallel_query (enum) #

即使在预期没有性能优势的情况下,也允许将并行查询用于测试目的。 debug_parallel_query 的允许值包括 off(仅在预期提高性能时使用并行模式)、on(对所有认为安全的查询强制并行查询)和 regress(与 on 类似,但具有如下所述的其他行为更改)。

更具体地说,将此值设为 on 将向任何查询计划的顶部添加一个 Gather 节点,该查询计划看上去是安全的,以便查询在并行工作器中运行。即使并行工作器不可用或无法使用,在并行查询上下文中禁止的操作,例如启动子事务,也会被禁止,除非计划器认为这会导致查询失败。如果在设置此选项时发生故障或意外结果,则查询使用的某些函数可能需要标记为 PARALLEL UNSAFE(或者可能是 PARALLEL RESTRICTED)。

将此值设为 regress 具有与将其设为 on 相同的效果,外加一些旨在促进自动化回归测试的其他效果。通常,来自并行工作器的信息包含指示这一点的上下文行,但 regress 设置会抑制此行,以便输出与非并行执行中的输出相同。此外,此设置添加到计划中的 Gather 节点在 EXPLAIN 输出中隐藏,以便输出与关闭此设置时获得的输出相匹配。

ignore_system_indexes (boolean) #

在读取系统表时忽略系统索引(但在修改表时仍更新索引)。在从损坏的系统索引中恢复时,这很有用。此参数在会话启动后无法更改。

post_auth_delay (integer) #

在执行身份验证过程后,启动新的服务器进程时延迟的时间量。目的是让开发人员有机会使用调试器附加到服务器进程。如果未指定单位,则此值将作为秒数。零值(默认值)会禁用延迟。此参数在会话启动后无法更改。

pre_auth_delay (integer) #

在新的服务器进程分叉后,在执行身份验证过程之前延迟的时间量。目的是让开发人员有机会使用调试器附加到服务器进程,以追踪身份验证中的错误行为。如果未指定单位,则该值将被视为秒。值为零(默认值)将禁用延迟。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

trace_notify (boolean) #

LISTENNOTIFY 命令生成大量调试输出。 client_min_messageslog_min_messages 必须分别为 DEBUG1 或更低,才能将此输出发送到客户端或服务器日志。

trace_recovery_messages (enum) #

启用对与恢复相关的调试输出的记录,否则不会记录这些输出。此参数允许用户覆盖 log_min_messages 的常规设置,但仅适用于特定消息。这旨在用于调试热备。有效值为 DEBUG5DEBUG4DEBUG3DEBUG2DEBUG1LOG。默认值 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 (布尔值) #

如果设置,在发生死锁超时时,转储有关所有当前锁的信息。

此参数仅在编译 PostgreSQL 时定义了 LOCK_DEBUG 宏时才可用。

log_btree_build_stats (布尔值) #

如果设置,记录各种 B 树操作的系统资源使用情况统计信息(内存和 CPU)。

此参数仅在编译 PostgreSQL 时定义 BTREE_BUILD_STATS 宏时可用。

wal_consistency_checking (字符串) #

此参数旨在用于检查 WAL 重做例程中的错误。启用后,与 WAL 记录结合修改的任何缓冲区的全页映像将添加到记录中。如果随后重放记录,系统将首先应用每条记录,然后测试记录修改的缓冲区是否与存储的映像匹配。在某些情况下(例如提示位),可以接受次要变体,并且将被忽略。任何意外差异都将导致致命错误,终止恢复。

此设置的默认值为空字符串,它禁用此功能。可以将其设置为 all 以检查所有记录,或将其设置为资源管理器以逗号分隔的列表,以仅检查来自这些资源管理器的记录。当前,受支持的资源管理器有 heapheap2btreehashgingistsequencespgistbringeneric。扩展可以定义其他资源管理器。只有超级用户和具有适当 SET 权限的用户才能更改此设置。

wal_debug (布尔值) #

如果打开,则发出与 WAL 相关的调试输出。仅当在编译 PostgreSQL 时定义了 WAL_DEBUG 宏时,此参数才可用。

ignore_checksum_failure (boolean) #

仅当数据校验和已启用时才有效。

在读取期间检测到校验和失败通常会导致 PostgreSQL 报告错误,中止当前事务。将 ignore_checksum_failure 设置为 on 会导致系统忽略该失败(但仍会报告警告),并继续处理。此行为可能会导致崩溃、传播或隐藏损坏,或其他严重问题。但是,它可能允许你绕过错误并检索表中可能仍然存在的未损坏元组(如果块头仍然正常)。如果头损坏,即使启用此选项,也会报告错误。默认设置为 off。只有超级用户和具有适当 SET 权限的用户才能更改此设置。

zero_damaged_pages (boolean) #

检测到损坏的页头通常会导致 PostgreSQL 报告错误,中止当前事务。将 zero_damaged_pages 设置为 on 会导致系统改为报告警告,将内存中的损坏页清零,并继续处理。此行为将破坏数据,即损坏页上的所有行。但是,它确实允许你绕过错误并从表中可能存在的任何未损坏页中检索行。如果由于硬件或软件错误导致损坏,则它对于恢复数据非常有用。通常,在你放弃从表的损坏页中恢复数据的希望之前,不应将其设置为 on。不会强制将清零的页写入磁盘,因此建议在再次关闭此参数之前重新创建表或索引。默认设置为 off。只有超级用户和具有适当 SET 权限的用户才能更改此设置。

ignore_invalid_pages (boolean) #

如果设置为 off(默认值),在恢复期间检测到对无效页面的引用时,PostgreSQL 会引发 PANIC 级错误,中止恢复。将 ignore_invalid_pages 设置为 on 会导致系统忽略 WAL 记录中的无效页面引用(但仍会报告警告),并继续恢复。此行为可能会 导致崩溃、数据丢失、传播或隐藏损坏,或其他严重问题。但是,它可能会让你绕过 PANIC 级错误,完成恢复,并启动服务器。该参数只能在服务器启动时设置。它仅在恢复期间或备用模式下有效。

jit_debugging_support (boolean) #

如果 LLVM 具有所需功能,则使用 GDB 注册生成函数。这使得调试变得更加容易。默认设置为 off。此参数只能在服务器启动时设置。

jit_dump_bitcode (boolean) #

将生成的 LLVM IR 写入文件系统,位于 data_directory 中。这仅对处理 JIT 实现的内部有用。默认设置为 off。只有超级用户和具有适当 SET 权限的用户才能更改此设置。

jit_expressions (boolean) #

确定在激活 JIT 编译时是否对表达式进行 JIT 编译(请参阅 第 32.2 节)。默认值为 on

jit_profiling_support (boolean) #

如果 LLVM 具有所需功能,则发出允许 perf 对 JIT 生成的函数进行分析所需的数据。这会将文件写入 ~/.debug/jit/;用户负责在需要时执行清理。默认设置为 off。此参数只能在服务器启动时设置。

jit_tuple_deforming (boolean) #

确定元组变形是否 JIT 编译,当 JIT 编译被激活时(参见 第 32.2 节)。默认值为 on

remove_temp_files_after_crash (boolean) #

当设置为 on(默认值)时,PostgreSQL 将在后端崩溃后自动删除临时文件。如果禁用,文件将被保留,例如用于调试。但是,重复崩溃可能会导致无用文件累积。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

send_abort_for_crash (boolean) #

默认情况下,在后端崩溃后,主控进程将通过向它们发送 SIGQUIT 信号来停止剩余的子进程,允许它们以或多或少优雅的方式退出。当此选项设置为 on 时,将改为发送 SIGABRT。这通常会导致为每个此类子进程生成一个核心转储文件。这有助于在崩溃后调查其他进程的状态。它还可能在重复崩溃时消耗大量磁盘空间,因此请勿在您没有仔细监控的系统上启用此功能。请注意,不存在自动清理核心文件(s) 的支持。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

send_abort_for_kill (boolean) #

默认情况下,在尝试使用 SIGQUIT 停止子进程后,主控进程将等待五秒钟,然后发送 SIGKILL 以强制立即终止。当此选项设置为 on 时,将发送 SIGABRT 而不是 SIGKILL。这通常会导致为每个此类子进程生成一个核心转储文件。这有助于调查“卡住”子进程的状态。它还可能在重复崩溃时消耗大量磁盘空间,因此请勿在您没有仔细监控的系统上启用此功能。请注意,不存在自动清理核心文件(s) 的支持。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

debug_logical_replication_streaming (enum) #

允许的值为 bufferedimmediate。默认值为 buffered。此参数旨在用于测试大事务的逻辑解码和复制。debug_logical_replication_streaming 对发布者和订阅者的影响不同

在发布者方面,debug_logical_replication_streaming 允许在逻辑解码中立即流式传输或序列化更改。当设置为 immediate 时,如果启用了 streaming 选项,则流式传输每个更改,否则序列化每个更改。当设置为 buffered 时,当达到 logical_decoding_work_mem 时,解码将流式传输或序列化更改。

在订阅者方面,如果 streaming 选项设置为 parallel,则可以使用 debug_logical_replication_streaming 指示领导应用工作器将更改发送到共享内存队列或将所有更改序列化到文件。当设置为 buffered 时,领导者通过共享内存队列将更改发送到并行应用工作器。当设置为 immediate 时,领导者将所有更改序列化到文件,并通知并行应用工作器在事务结束时读取并应用它们。