↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18)
测试与开发版本: 19 / devel

19.10. 清理 #

这些参数控制清理的行为。有关清理的目的和职责的更多信息,请参阅第 24.1 节。

19.10.1. 自动清理 #

这些设置控制 autovacuum 特性的行为。详情请参考第 24.1.6 节。注意很多这些设置可以被针对每个表的设置所覆盖,参见存储参数。

autovacuum (boolean) #

控制服务器是否运行自动清理启动器后台进程。默认为开启,不过要使自动清理正常工作,还需要启用 track_counts。该参数只能在 postgresql.conf 文件或服务器命令行中设置,不过,通过更改表存储参数可以为表禁用自动清理。

注意即使该参数被禁用,系统也会在需要防止事务 ID 回卷时发起自动清理进程。详情请见第 24.1.5 节。

autovacuum_worker_slots (integer) #

指定为自动清理工作进程保留的后端槽位数。默认通常是 16 个槽位,但如果内核设置不支持(如 initdb 期间所判定),则可能少于此数。该参数只能在服务器启动时设置。

更改该值时,也应考虑调整 autovacuum_max_workers。

autovacuum_max_workers (integer) #

指定能同时运行的自动清理进程(除了自动清理启动器之外)的最大数量。默认值为 3。该参数只能在 postgresql.conf 文件或服务器命令行中设置。

请注意,如果该值被设置得高于 autovacuum_worker_slots,将不会产生任何效果,因为自动清理工作进程是从该设置建立的槽位池中获取的。

autovacuum_naptime (integer) #

指定自动清理在任意给定数据库上各次运行之间的最小间隔。在每一轮中后台进程检查数据库并根据需要为数据库中的表发出 VACUUM 和 ANALYZE 命令。如果指定值时没有单位,则以秒为单位。默认值为 1 分钟(1min)。该参数只能在 postgresql.conf 文件或在服务器命令行上设置。

autovacuum_vacuum_threshold (integer) #

指定能在一个表上触发 VACUUM 的被更新或被删除元组的最小数量。默认值为 50 个元组。该参数只能在 postgresql.conf 文件或在服务器命令行上设置。但是对个别表可以通过修改表存储参数来覆盖该设置。

autovacuum_vacuum_insert_threshold (integer) #

指定在任何一个表中触发 VACUUM 所需要插入的元组数。默认值为 1000 个元组。如果指定了 -1,则 autovacuum 不会根据插入数量在任何表上触发 VACUUM 操作。此参数只能在 postgresql.conf 文件或服务器命令行中设置;但可以通过更改表存储参数来覆盖单个表的设置。

autovacuum_analyze_threshold (integer) #

指定能在一个表上触发 ANALYZE 的被插入、被更新或被删除元组的最小数量。默认值为 50 个元组。该参数只能在 postgresql.conf 文件或在服务器命令行上设置。但是对个别表可以通过修改表存储参数来覆盖该设置。

autovacuum_vacuum_scale_factor (floating point) #

指定一个表尺寸的分数,在决定是否触发 VACUUM 时将它加到 autovacuum_vacuum_threshold 上。默认值为 0.2(表尺寸的 20%)。该参数只能在 postgresql.conf 文件或在服务器命令行上设置。但是对个别表可以通过修改表存储参数来覆盖该设置。

autovacuum_vacuum_insert_scale_factor (floating point) #

指定表中未冻结页面的比例,在决定是否触发 VACUUM 时,将由该比例计算出的数量加到 autovacuum_vacuum_insert_threshold 上。默认值为 0.2(表中未冻结页面的 20%)。该参数只能在 postgresql.conf 文件或服务器命令行中设置;但可以通过更改表存储参数为单个表覆盖该设置。

autovacuum_analyze_scale_factor (floating point) #

指定一个表尺寸的分数,在决定是否触发 ANALYZE 时将它加到 autovacuum_analyze_threshold 上。默认值为 0.1(表尺寸的 10%)。该参数只能在 postgresql.conf 文件或在服务器命令行上设置。但是对个别表可以通过修改表存储参数来覆盖该设置。

autovacuum_vacuum_max_threshold (integer) #

指定在任意一个表上触发 VACUUM 所需更新或删除元组数的最大值,也就是对 autovacuum_vacuum_threshold 和 autovacuum_vacuum_scale_factor 计算结果所施加的上限。默认值为 100,000,000 个元组。如果指定为 -1,自动清理将不会对触发 VACUUM 所需的更新或删除元组数强制施加最大值。该参数只能在 postgresql.conf 文件中或服务器命令行上设置;但可以通过更改表存储参数覆盖单个表的该设置。

autovacuum_freeze_max_age (integer) #

指定在必须强制执行 VACUUM 以防止表内事务 ID 回卷之前,一个表的 pg_class.relfrozenxid 字段可以达到的最大年龄(以事务计)。注意即使自动清理被禁用,系统也会启动自动清理进程来防止回卷。

清理也允许从 pg_xact 子目录中移除旧文件,这也是为什么默认值被设置为较低的 2 亿事务。该参数只能在服务器启动时设置,但是对于个别表可以通过修改表存储参数来降低该设置。详见第 24.1.5 节。

autovacuum_multixact_freeze_max_age (integer) #

指定在必须强制执行 VACUUM 以防止表内多事务 ID 回卷之前,一个表的 pg_class.relminmxid 字段可以达到的最大年龄(以多事务计)。注意即使自动清理被禁用,系统也会启动自动清理进程来防止回卷。

清理多事务也允许从 pg_multixact/members 和 pg_multixact/offsets 子目录中移除旧文件,这也是为什么默认值被设置为较低的 4 亿个多事务。该参数只能在服务器启动时设置,但是对于个别表可以通过修改表存储参数来降低该设置。详见第 24.1.5.1 节。

autovacuum_vacuum_cost_delay (floating point) #

指定用于自动 VACUUM 操作中的代价延迟值。如果指定-1,则使用 vacuum_cost_delay 值。如果指定值时没有单位,则以毫秒为单位。默认值为 2 毫秒。该参数只能在 postgresql.conf 文件或在服务器命令行上设置。但是对个别表可以通过修改表存储参数来覆盖该设置。

autovacuum_vacuum_cost_limit (integer) #

指定用于自动 VACUUM 操作中的代价限制值。如果指定 -1(默认值),则使用 vacuum_cost_limit 值。注意该值被按比例地分配到运行中的自动清理工作进程上(如果有多个),因此每一个工作进程的限制值之和不会超过这个变量中的值。该参数只能在 postgresql.conf 文件或在服务器命令行上设置。但是对个别表可以通过修改表存储参数来覆盖该设置。

19.10.2. 基于代价的清理延迟 #

执行 VACUUM 和 ANALYZE 命令期间,系统维护一个内部计数器,记录已执行的各种 I/O 操作的估算代价。当累计代价达到上限(由 vacuum_cost_limit 指定)时,执行该操作的进程会休眠一小段时间,时长由 vacuum_cost_delay 指定。随后重置计数器并继续执行。

此功能让管理员能够降低这些命令对并发数据库活动的 I/O 影响。在许多情况下,VACUUM 和 ANALYZE 等维护命令是否快速完成并不重要,但避免它们显著干扰系统执行其他数据库操作的能力通常很重要。基于代价的清理延迟为管理员提供了实现这一点的方法。

对于手动执行的 VACUUM 命令,此功能默认禁用。要启用它,将 vacuum_cost_delay 变量设为非零值。

vacuum_cost_delay (floating point) #

超过代价上限后,进程将休眠的时长。如果未指定单位,则以毫秒为单位。默认值为 0,表示禁用基于代价的清理延迟功能。正值会启用基于代价的清理。

使用基于代价的清理时,vacuum_cost_delay 的合适值通常很小,可能不到 1 毫秒。虽然 vacuum_cost_delay 可以设为以毫秒为单位的小数值,但较旧的平台可能无法准确计量这种延迟。在这些平台上,若要让 VACUUM 的资源用量超过延迟设为 1ms 时的水平,需要调整其他清理代价参数。尽管如此,仍应将 vacuum_cost_delay 设为平台能够稳定计量的尽可能小的值;较大的延迟没有帮助。

vacuum_cost_page_hit (integer) #

清理在共享缓冲区缓存中找到的缓冲区时所计入的估算代价。它表示锁定缓冲池、查找共享 hash 表和扫描页内容的代价。默认值为 1。

vacuum_cost_page_miss (integer) #

清理必须从磁盘读取的缓冲区时所计入的估算代价。它表示锁定缓冲池、查找共享 hash 表、从磁盘读取所需数据块并扫描其内容所需的工作量。默认值为 2。

vacuum_cost_page_dirty (integer) #

清理操作修改原本干净的数据块时所计入的估算代价。它表示再次将脏块刷盘所需的额外 I/O。默认值为 20。

vacuum_cost_limit (integer) #

会使清理进程休眠 vacuum_cost_delay 指定时长的累计代价。默认值为 200。

注意

某些操作持有关键的锁,因此应尽快完成。这些操作期间不会发生基于代价的清理延迟,所以累计代价可能远超指定上限。为避免此时出现无益的长时间延迟,实际延迟按 vacuum_cost_delay * accumulated_balance / vacuum_cost_limit 计算,但最大不超过 vacuum_cost_delay * 4。

19.10.3. 默认行为 #

vacuum_truncate (boolean) #

启用或禁用 vacuum 尝试截断表末尾的空页。默认值为 true。如果为 true,则 VACUUM 和 autovacuum 会执行截断,并将这些页面占用的磁盘空间返还给操作系统。请注意,截断需要获取表上的 ACCESS EXCLUSIVE 锁。如果在 VACUUM 中指定了 TRUNCATE 参数,它将覆盖该参数的值。也可以通过修改表存储参数来为单个表覆盖此设置。

19.10.4. 冻结 #

为了在事务 ID 回卷后仍保持正确性,PostgreSQL 会将足够旧的行标记为已冻结。这些行对所有事务都可见;其他事务不必检查插入这些行的 XID 就能确定其可见性。VACUUM 负责将行标记为已冻结。以下设置控制 VACUUM 的冻结行为,应根据系统的 XID 消耗速率以及主要工作负载的数据访问模式进行调整。有关事务 ID 回卷和这些参数的调优,详见第 24.1.5 节。

vacuum_freeze_table_age (integer) #

如果表的 pg_class.relfrozenxid 字段达到此设置指定的年龄,VACUUM 就会执行一次激进扫描。激进扫描与常规 VACUUM 不同,它会访问每一个可能包含未冻结 XID 或 MXID 的页面,而不仅仅是那些可能包含死元组的页面。默认值为 1.5 亿个事务。尽管用户可以将该值设置在 0 到 20 亿之间,VACUUM 仍会悄悄将其有效值限制为不超过 autovacuum_freeze_max_age 的 95%,以便在针对该表启动防回卷自动清理之前,周期性手工 VACUUM 仍有机会运行。详见第 24.1.5 节。

vacuum_freeze_min_age (integer) #

指定 VACUUM 在决定是否冻结带有较旧 XID 的页面时应采用的截止年龄(以事务数计)。默认值为 5000 万个事务。尽管用户可以将该值设置在 0 到 10 亿之间,VACUUM 仍会悄悄将其有效值限制为不超过 autovacuum_freeze_max_age 的一半,以避免强制自动清理之间的间隔过短。详见第 24.1.5 节。

vacuum_failsafe_age (integer) #

指定表的 pg_class.relfrozenxid 字段在 VACUUM 采取非常措施以避免系统范围事务 ID 回卷失败之前所允许达到的最大年龄(以事务数计)。这是 VACUUM 的最后手段。失效保护通常会在为防止事务 ID 回卷而启动的自动清理已经运行一段时间后触发,但也可能在任何一次 VACUUM 期间触发。

当触发失效保护时,当前生效的任何基于代价的延迟都将不再应用,进一步的非关键维护任务(例如索引清理)会被跳过,并且正在使用的任何缓冲区访问策略都会被禁用,从而使 VACUUM 可以自由使用全部共享缓冲区。

默认值为 16 亿个事务。尽管用户可以将该值设置在 0 到 21 亿之间,VACUUM 仍会悄悄将其有效值调整为不低于 autovacuum_freeze_max_age 的 105%。

vacuum_multixact_freeze_table_age (integer) #

如果表的 pg_class.relminmxid 字段达到此设置指定的年龄,VACUUM 就会执行一次激进扫描。激进扫描与常规 VACUUM 不同,它会访问每一个可能包含未冻结 XID 或 MXID 的页面,而不仅仅是那些可能包含死元组的页面。默认值为 1.5 亿个多事务。尽管用户可以将该值设置在 0 到 20 亿之间,VACUUM 仍会悄悄将其有效值限制为不超过 autovacuum_multixact_freeze_max_age 的 95%,以便在针对该表启动防回卷清理之前,周期性手工 VACUUM 仍有机会运行。详见第 24.1.5.1 节。

vacuum_multixact_freeze_min_age (integer) #

指定 VACUUM 在决定是否冻结带有较旧多事务 ID 的页面时应采用的截止年龄(以多事务计)。默认值为 500 万个多事务。尽管用户可以将该值设置在 0 到 10 亿之间,VACUUM 仍会悄悄将其有效值限制为不超过 autovacuum_multixact_freeze_max_age 的一半,以避免强制自动清理之间的间隔过短。详见第 24.1.5.1 节。

vacuum_multixact_failsafe_age (integer) #

指定表的 pg_class.relminmxid 字段在 VACUUM 采取特别措施避免系统范围的多事务 ID 回卷故障之前,所能达到的最大年龄(以多事务计)。这是 VACUUM 的最后手段。失效保护通常会在防止事务 ID 回卷的自动清理已经运行一段时间后触发,但也可能在任何 VACUUM 期间触发。

触发失效保护后,任何正在生效的基于代价的延迟都将不再应用,后续非必要的维护任务(例如索引清理)也会被跳过。

默认值为 16 亿个多事务。虽然用户可以将此值设置为 0 到 21 亿之间的任意值,VACUUM 仍会将实际生效值自动调整为不低于 autovacuum_multixact_freeze_max_age 的 105%。

vacuum_max_eager_freeze_failure_rate (floating point) #

指定 VACUUM 在急切扫描模式下可以扫描但未能在可见性映射中设置为 all-frozen 的页面数量占整个关系总页面数的比例,超过该比例后就会禁用急切扫描。值 0 表示完全禁用急切扫描。默认值为 0.03(3%)。

请注意,当急切扫描启用时,只有冻结失败才会计入上限,成功的冻结不会计入。成功冻结的页面在内部会被限制为关系中所有 all-visible 但未 all-frozen 页面数的 20%。对成功冻结页面设置上限有助于将成本分摊到多次常规清理中,并限制在下次激进清理之前页面再次被修改时急切冻结可能带来的浪费。

这个参数只能在 postgresql.conf 文件中或服务器命令行上设置;但也可以通过修改对应的表存储参数为单个表覆盖该设置。关于调整清理冻结行为的更多信息,见第 24.1.5 节。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。英文原文本身的问题请通过上游文档表单反馈给 PostgreSQL 文档维护者。