Postgresql 中文操作指南

20.17. Developer Options #

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

  • allow_in_place_tablespaces (boolean) #

    • 允许在 pg_tblspc 中将表空间创建为目录,当提供一个空位置字符串给 CREATE TABLESPACE 命令时。这旨在允许测试主备服务器在同一台机器上运行的复制场景。此类目录可能会混淆备份工具,该工具期望在该位置只找到符号链接。只有超级用户和具有相应 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 (使用配置选项 —​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_init(用于 WAL 文件)。

    • 某些操作系统和文件系统不支持直接 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 (boolean) #

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

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

    • log_btree_build_stats (boolean) #

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

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

    • wal_consistency_checking (string) #

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

  • 此设置的默认值为空字符串,它会禁用此功能。它可以设置为_all_来检查所有记录,也可以设置为资源管理器的逗号分隔列表,以仅检查源自这些资源管理器的记录。当前,受支持的资源管理器有_heap_、heap2btreehashgingistsequencespgistbrin_和_generic。扩展可以定义额外的资源管理器。只有超级用户和拥有相应_SET_权限的用户才能更改此设置。

    • wal_debug (boolean) #

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

    • ignore_checksum_failure (boolean) #

  • 仅当 data checksums 启用时有效。

  • 读取时检测到校验和失败,通常会导致 PostgreSQL 报告一个错误,中止当前事务。将 ignore_checksum_failure 设置为 on 会使系统忽略该故障(但仍报告一条警告),并继续处理。此行为可能 cause crashes, propagate or hide corruption, or other serious problems。但是,它可以让你绕过错误,并检索仍然存在于表中的未损坏元组(如果块头仍完好)。如果头损坏,即使启用此选项,也会报告错误。默认设置是 off。只有超级用户和具有适当 SET 权限的用户才能更改此设置。

    • zero_damaged_pages (boolean) #

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

    • ignore_invalid_pages (boolean) #

  • 如果在恢复期间将 off 设置为(默认值),则在检测到 WAL 记录引用无效页面时,会导致 PostgreSQL 引发 PANIC 级错误,中止恢复。将 ignore_invalid_pages 设置为 on 会使系统忽略 WAL 记录中的无效页面引用(但仍报告一条警告),并继续恢复。此行为可能 cause crashes, data loss, propagate or hide corruption, or other serious problems。但是,它可以让你绕过 PANIC 级错误,完成恢复并启动服务器。只能在服务器启动时设置该参数。它只在恢复或备用模式下起作用。

    • jit_debugging_support (boolean) #

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

    • jit_dump_bitcode (boolean) #

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

    • jit_expressions (boolean) #

  • 确定表达式是否被 JIT 编译,在 JIT 编译激活时(请参阅 Section 32.2)。默认值为 on

    • jit_profiling_support (boolean) #

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

    • jit_tuple_deforming (boolean) #

  • 确定元组变形是否被 JIT 编译,在 JIT 编译激活时(请参阅 Section 32.2)。默认值为 on

    • remove_temp_files_after_crash (boolean) #

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

    • send_abort_for_crash (boolean) #

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

    • send_abort_for_kill (boolean) #

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

    • debug_logical_replication_streaming (enum) #

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

  • 在发布服务器端, debug_logical_replication_streaming 允许在逻辑解码中立即流式传输或序列化更改。当设置为 immediate 时,如果启用 CREATE SUBSCRIPTIONstreaming 选项,则流式传输每个更改,否则序列化每个更改。当设置为 buffered 时,当 logical_decoding_work_mem 达到时,解码将流式传输或序列化更改。

  • 在订阅者端,如果 streaming 选项被设置为 parallel,则 debug_logical_replication_streaming 可用于指示引导应用工作进程将更改发送到共享内存队列或将所有更改序列化到文件。当设置为 buffered 时,引导将通过共享内存队列将更改发送到并行应用工作进程。当设置为 immediate 时,引导将所有更改序列化到文件,并在事务结束时通知并行应用工作进程读取和应用这些更改。