PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

19.10. 清理与维护参数 #

19.10.1. 自动清理设置
19.10.2. 基于代价的清理延迟设置
19.10.3. 清理默认行为设置
19.10.4. 元组冻结与回卷防范参数

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

19.10.1. 自动清理设置 #

这些配置参数用于控制自动清理(autovacuum)特性的运行行为。有关详细技术说明请参阅 Section 24.1.6。请注意,其中许多配置可以在单表级别通过存储参数进行单独覆盖,详见 Storage Parameters。

autovacuum (boolean) #

控制服务器是否应运行 autovacuum 自动清理启动守护进程。该参数默认开启(on);但要使自动清理正常工作,还必须同时启用 track_counts 统计信息收集。该参数只能在 postgresql.conf 文件中或在服务器命令行中设置;不过,可以通过修改单表存储参数来单独禁用特定表的自动清理。

请注意,即使禁用了该参数,系统在必要时依然会自动强制启动 autovacuum 工作进程以防止事务 ID 回卷(Wraparound)。更多信息请参阅 Section 24.1.5。

autovacuum_worker_slots (integer) #

指定为 autovacuum 工作进程预留的后端槽位数量。默认通常为 16 个槽位,但如果操作系统内核参数不足以支撑该并发(在 initdb 期间检测),该数值可能会偏小。该参数只能在服务器启动时设置。

修改此数值时,请注意协同调整 autovacuum_max_workers。

autovacuum_max_workers (integer) #

指定在任何同一时刻允许并发运行的最大 autovacuum 工作进程数(不包括 launcher 守护进程)。默认值为 3。该参数只能在 postgresql.conf 配置文件中或在服务器命令行中设置。

请注意,将此参数设置得高于 autovacuum_worker_slots 是无效的,因为 autovacuum 工作进程是从该设置分配的槽位池中获取配额的。

autovacuum_naptime (integer) #

指定 autovacuum 在任何给定数据库上执行轮询的休眠等待间隔。在每一轮检查中,守护进程都会检查该数据库并在需要时对其中的表发起 VACUUM 和 ANALYZE 操作。若指定该值时不带单位,则按秒计算。默认值为 1 分钟(1min)。该参数只能在配置文件中或命令行中设置。

autovacuum_vacuum_threshold (integer) #

指定在任何单张表中触发 VACUUM 所需的最少被更新或删除的死元组数量基数。默认值为 50 个元组。该参数只能在配置文件中或命令行中设置;但可以通过修改表存储参数为单张表进行单独覆盖。

autovacuum_vacuum_insert_threshold (integer) #

指定在任何单张表中触发 VACUUM 所需的最少新增插入元组数量基数。默认值为 1000 个元组。若指定为 -1,autovacuum 将绝不依据插入元组数触发清理。该参数只能在配置文件中或命令行中设置;但可通过表级存储参数单独覆盖。

autovacuum_analyze_threshold (integer) #

指定在任何单张表中触发统计信息收集 ANALYZE 所需的最少插入、更新或删除的元组数量基数。默认值为 50 个元组。该参数只能在配置文件中或命令行中设置;但可通过表级存储参数单独覆盖。

autovacuum_vacuum_scale_factor (floating point) #

指定在判定是否触发 VACUUM 时,累加到 autovacuum_vacuum_threshold 之上的表总行数比例系数。默认值为 0.2(即表行数的 20%)。该参数只能在配置文件中或命令行中设置;但可通过表级存储参数单独覆盖。

autovacuum_vacuum_insert_scale_factor (floating point) #

指定在判定是否因插入而触发 VACUUM 时,累加到 autovacuum_vacuum_insert_threshold 之上的表中未冻结数据页比例。默认值为 0.2(即表中未冻结数据页的 20%)。该参数只能在配置文件中或命令行中设置;但可通过表级存储参数单独覆盖。

autovacuum_analyze_scale_factor (floating point) #

指定在判定是否触发 ANALYZE 时,累加到 autovacuum_analyze_threshold 之上的表行数比例。默认值为 0.1(即表行数的 10%)。该参数只能在配置文件中或命令行中设置;但可通过表级存储参数单独覆盖。

autovacuum_vacuum_max_threshold (integer) #

指定在任何单张表中触发 VACUUM 所需的最少被更新或删除元组数量的硬性上限值,即由 autovacuum_vacuum_threshold 与 autovacuum_vacuum_scale_factor 联合计算出的动态阈值的最大封顶值。默认值为 100,000,000 个元组。若指定为 -1,则不强制执行上限封顶。该参数只能在配置文件中或命令行中设置;但可通过表级存储参数单独覆盖。

autovacuum_freeze_max_age (integer) #

指定某张表的 pg_class.relfrozenxid 字段在被强制执行 VACUUM 操作以防止表内事务 ID 回卷前所允许达到的最大事务年龄(以事务数为单位)。请注意,即便系统整体禁用了 autovacuum,为了防止事务回卷灾难,系统依然会自动强制启动 autovacuum 进程。

执行清理还允许系统安全删除并回收 pg_xact 子目录中的陈旧提交状态文件,这也是为何默认值被设定在相对保守的 2 亿笔事务的原因。该参数只能在服务器启动时设置,但可以通过表存储参数为特定表单独调小该阈值。更多信息请参阅 Section 24.1.5。

autovacuum_multixact_freeze_max_age (integer) #

指定某张表的 pg_class.relminmxid 字段在被强制执行 VACUUM 操作以防止 MultiXact ID 回卷前所允许达到的最大多事务年龄。请注意,即使禁用了常规自动清理,系统仍会强制启动进程以避免回卷。

清理 MultiXact 还允许系统安全清理回收 pg_multixact/members 和 pg_multixact/offsets 子目录下的过期物理文件,这也是默认值设定为相对较低的 4 亿个 multixact 的原因。该参数只能在服务器启动时设置。更多信息请参阅 Section 24.1.5.1。

autovacuum_vacuum_cost_delay (floating point) #

指定在执行自动 VACUUM 操作时采用的休眠延迟代价参数值。若指定为 -1,则使用常规的 vacuum_cost_delay 值。若不带单位按毫秒计算。默认值为 2 毫秒。该参数只能在配置文件中或命令行中设置;但可通过表级存储参数单独覆盖。

autovacuum_vacuum_cost_limit (integer) #

指定在执行自动 VACUUM 操作时采用的单轮累积代价上限阈值。若指定为 -1(默认值),则使用常规的 vacuum_cost_limit。请注意,如果有多个 autovacuum 工作进程并发运行,该代价上限会在它们之间等比例分摊,使所有工作进程的代价总和不超过该变量的值。该参数可在配置文件中或命令行中设置;亦可通过表存储参数单独覆盖。

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) #

清理一个在共享缓冲区缓存中找到的缓冲区的估计代价。 它表示锁定缓冲区池、查找共享哈希表以及扫描页面内容的代价。 默认值为 1。

vacuum_cost_page_miss (integer) #

清理一个必须从磁盘读取的缓冲区的估计代价。 它表示锁定缓冲区池、查找共享哈希表、从磁盘读入所需的块以及 扫描其内容的开销。 默认值为 2。

vacuum_cost_page_dirty (integer) #

当清理修改一个之前干净的块时所收取的估计代价。 它表示把脏块再次刷出磁盘所需的额外 I/O。 默认值为 20。

vacuum_cost_limit (integer) #

这是导致清理进程睡眠 vacuum_cost_delay 的累积代价。 默认值为 200。

Note

某些操作持有临界锁,因此应当尽快完成。 在这样的操作期间不会发生基于代价的清理延迟。 因此,代价有可能累积到远高于指定限制的水平。 为了避免在这种情况下出现无益的过长延迟, 实际延迟按 vacuum_cost_delay * accumulated_balance / vacuum_cost_limit 计算, 最大值为 vacuum_cost_delay * 4。

19.10.3. 清理默认行为设置 #

vacuum_truncate (boolean) #

启用或禁用清理尝试截断表末尾的任何空页面。 默认值为 true。 如果为 true,VACUUM 和自动清理会执行截断,被截断页面的磁盘空间会归还给操作系统。 注意,截断需要表上的一个 ACCESS EXCLUSIVE 锁。 如果指定了 VACUUM 的 TRUNCATE 参数, 它会覆盖这个参数的值。 该设置也可以通过更改表存储参数为单个表覆盖。

19.10.4. 元组冻结与回卷防范参数 #

为了即使在事务 ID 回绕之后也保持正确性, PostgreSQL 会把足够老的行标记为冻结。 这些行对所有人可见;其他事务不需要检查它们的插入 XID 来确定可见性。 VACUUM 负责把行标记为冻结。 以下设置控制 VACUUM 的冻结行为,应当根据系统的 XID 消耗率和主要工作负载的数据访问 模式进行调优。 有关事务 ID 回绕以及调优这些参数的更多信息, 请参见 Section 24.1.5。

vacuum_freeze_table_age (integer) #

如果表的 pg_class.relfrozenxid 字段达到了这个设置指定的年龄, VACUUM 会执行一次积极的扫描。 积极扫描与常规 VACUUM 的区别在于它会访问每一个可能包含未冻结 XID 或 MXID 的页面,而不仅仅是可能包含死元组的那些页面。 默认值为 1.5 亿个事务。 虽然用户可以把这个值设置为零到二十亿之间的任何数, 但 VACUUM 会静默地把有效值限制为 autovacuum_freeze_max_age 的 95%,这样周期性的手动 VACUUM 就有机会在该表启动防回绕自动清理之前运行。 更多信息请参见 Section 24.1.5。

vacuum_freeze_min_age (integer) #

指定 VACUUM 用来决定是否触发对含有更老 XID 的页面进行冻结的截止年龄 (以事务计)。 默认值为 5000 万个事务。 虽然用户可以把这个值设置为零到十亿之间的任何数, 但 VACUUM 会静默地把有效值限制为 autovacuum_freeze_max_age 的一半,这样强制自动清理之间的时间就不会不合理地过短。 更多信息请参见 Section 24.1.5。

vacuum_failsafe_age (integer) #

指定表的 pg_class.relfrozenxid 字段可以达到的最大年龄(以事务计), 超过之后 VACUUM 会采取非常措施以避免系统范围的事务 ID 回绕失败。 这是 VACUUM 的最后一招。失败保险通常在防止事务 ID 回绕的自动清理已经运行了一段时间之后触发, 但它也可能在任何 VACUUM 期间触发。

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

默认值为 16 亿个事务。 虽然用户可以把这个值设置为零到 21 亿之间的任何数, 但 VACUUM 会静默地把有效值调整为不小于 autovacuum_freeze_max_age 的 105%。

vacuum_multixact_freeze_table_age (integer) #

如果表的 pg_class.relminmxid 字段达到了这个设置指定的年龄, VACUUM 会执行一次积极的扫描。 积极扫描与常规 VACUUM 的区别在于它会访问每一个可能包含未冻结 XID 或 MXID 的页面,而不仅仅是可能包含死元组的那些页面。 默认值为 1.5 亿个多事务 ID。 虽然用户可以把这个值设置为零到二十亿之间的任何数, 但 VACUUM 会静默地把有效值限制为 autovacuum_multixact_freeze_max_age 的 95%,这样周期性的手动 VACUUM 就有机会在该表启动防回绕之前运行。 更多信息请参见 Section 24.1.5.1。

vacuum_multixact_freeze_min_age (integer) #

指定 VACUUM 用来决定是否触发对含有更老多事务 ID 的页面进行冻结的截止 年龄(以多事务 ID 计)。 默认值为 500 万个多事务 ID。 虽然用户可以把这个值设置为零到十亿之间的任何数, 但 VACUUM 会静默地把有效值限制为 autovacuum_multixact_freeze_max_age 的一半,这样强制自动清理之间的时间就不会不合理地过短。 更多信息请参见 Section 24.1.5.1。

vacuum_multixact_failsafe_age (integer) #

指定表的 pg_class.relminmxid 字段可以达到的最大年龄(以多事务 ID 计), 超过之后 VACUUM 会采取非常措施以避免系统范围的多事务 ID 回绕失败。 这是 VACUUM 的最后一招。失败保险通常在防止事务 ID 回绕的自动清理已经运行了一段时间之后触发, 但它也可能在任何 VACUUM 期间触发。

当失败保险被触发时,任何生效中的基于代价的延迟将不再被应用, 并且进一步的非必要维护任务(例如索引清理)将被绕过。

默认值为 16 亿个多事务 ID。 虽然用户可以把这个值设置为零到 21 亿之间的任何数, 但 VACUUM 会静默地把有效值调整为不小于 autovacuum_multixact_freeze_max_age 的 105%。

vacuum_max_eager_freeze_failure_rate (floating point) #

指定 VACUUM 在禁用积极扫描之前可以扫描并未能在 可见性映射中设置全冻结的页面的最大数量 (以关系中总页数的比例表示)。 值为 0 会完全禁用积极扫描。默认值为 0.03(3%)。

注意,当积极扫描被启用时,只有冻结失败才计入上限, 成功的冻结不计入。 成功的页面冻结在内部被限制为关系中全可见但非全冻结页面的 20%。 限制成功的页面冻结有助于把开销摊到多次常规清理中, 并限制那些在下次积极清理之前再次被修改的页面被浪费的积极冻结 可能带来的坏处。

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