更新时间:2024-12-30 GMT+08:00

自动清理

系统自动清理进程(autovacuum)自动执行VACUUM和ANALYZE命令,回收被标识为删除状态的记录空间,并更新表的统计数据。

autovacuum不会阻塞用户发起的业务语句,且autovacuum和autoanalyze语句可以并行,不会有冲突,该功能仅在8.2.1.300以上版本支持。

autovacuum

参数说明:控制是否启动数据库自动清理进程(autovacuum)。自动清理进程运行的前提是将track_counts设置为on。

8.1.3及以上集群版本的自动清理功能已支持通过管理控制台操作,详情请参考智能运维概览章节,8.1.2及以下集群版本按照设置GUC参数的方式进行操作。

参数类型:SIGHUP

取值范围:布尔型

  • on表示开启数据库自动清理进程。
  • off表示关闭数据库自动清理进程。

默认值:on

如系统在故障恢复后,需具备自动清理两阶段事务的功能,请将autovacuum设置为on。
  • 当设置autovacuum为on,autovacuum_max_workers为0时,表示系统不会自动进行autovacuum,只会在故障恢复后,自动清理两阶段事务。
  • 当设置autovacuum为on,autovacuum_max_workers大于0时,表示系统不仅在故障恢复后,自动清理两阶段事务,并且还可以自动清理进程。
即使此参数设置为off,数据库也会在需要防止事务ID回卷时发起清理进程。对于CREATE/DROP DATABASE发生异常时,可能有的节点提交或回滚,有的节点未提交(prepared状态),此时系统不能自动修复,需要手动修复,修复步骤:
  1. 使用gs_clean工具(-N参数)查询出异常两阶段事务的xid以及处于prepared的节点。
  2. 登录事务处于prepared状态的节点,系统管理员连接一个可用的数据库(如gaussdb),执行语句SET xc_maintenance_mode = on。
  3. 根据事务全局状态提交或者回滚此两阶段事务(如提交语句、回滚语句)。
  4. 如果集群长时间保持autovacuum=off的配置状态时,如需修改为on,必须集群的关键系统表先执行一次VACUUM FULL。这些关键系统表包括但不限于pg_class、pg_attribute、pg_index、pg_type、pg_statistic、pg_statistic_ext、pg_proc、pg_partition、pg_constraint、pg_inherits、pg_rewrite、pg_description、pg_depend、pg_shdepend、pg_shdescription、pgxc_class、pg_jobs、pg_redaction_policy、pg_redaction_column、pg_object、pg_matview、pg_relfilenode_size。

autovacuum_mode

参数说明:该参数仅在autovacuum设置为on的场景下生效,它控制autoanalyze或autovacuum的打开情况。

参数类型:SIGHUP

取值范围:枚举类型

  • analyze表示只执行autoanalyze。
  • vacuum表示只执行autovacuum。
  • mix表示autoanalyze和autovacuum都执行。
  • none表示二者都不执行。

默认值:mix

autoanalyze_mode

参数说明:设置autoanalyze的模式。该参数仅8.2.0及以上集群版本支持。

参数类型:USERSET

取值范围:枚举类型

  • normal表示普通的autoanalyze。
  • light表示轻量化的autoanalyze。

默认值:

  • 若当前集群为低版本升级到8.2.0及以上集群版本,为保持和前向兼容,默认值为normal。
  • 若当前集群为新装的8.2.0及以上集群版本,默认值为light。

autoanalyze_cache_num

参数说明:设置轻量化autoanalyze最多缓存多少张表的统计信息,超过该值后会触发淘汰,淘汰清理前100张表统计信息。该参数仅8.2.0及以上版本支持。

参数类型:SIGHUP

取值范围:整型,100 ~ INT_MAX

默认值:10000

autoanalyze_timeout

参数说明:设置autoanalyze的超时时间。在对某张表做autoanalyze时,如果该表的analyze时长超过了autoanalyze_timeout,则自动取消该表此次analyze。

参数类型:SIGHUP

取值范围:整型,0~2147483,单位为秒(s)。

默认值:5min

analyze_stats_mode

参数说明:设置analyze计算统计信息的模式。

参数类型:USERSET

取值范围:枚举类型

  • memory表示强制使用内存计算统计信息,不计算多列统计信息。
  • sample_table表示强制使用临时采样表计算统计信息,临时表不支持使用该模式。
  • dynamic表示按内存maintenance_work_mem大小自适应选择统计信息计算模式,若maintenance_work_mem可放下样本,则使用内存方式,否则使用临时采样表方式。

默认值:

  • 若当前集群为低版本升级到8.2.0.100及以上集群版本,为保持和前向兼容,默认值为memory。
  • 若当前集群为新装的8.2.0.100及以上集群版本,默认值为dynamic。

analyze_sample_mode

参数说明:设置analyze时使用的采样模型。

参数类型:USERSET

取值范围:整型,0~2。

  • 0 表示使用默认蓄水池采样模型。
  • 1 表示使用优化的蓄水池采样模型。
  • 2 表示使用range采样模型。

默认值:0

autovacuum_io_limits

参数说明:控制autovacuum进程每秒触发IO的上限。该参数8.1.2版本中已废弃,为兼容历史版本功能保留该函数,当前版本设置无效。

参数类型:SIGHUP

取值范围:整型,-1~1073741823。其中-1表示不控制,而是使用系统默认控制组。

默认值:-1

autovacuum_max_workers

参数说明:设置能同时运行的自动清理线程的最大数量。

参数类型:SIGHUP

取值范围:整型,0~128 。其中0表示不会自动进行autovacuum。

默认值:4

该参数与autovacuum共同发挥作用,对系统表和用户表的清理规则如下:

  • autovacuum_max_workers = 0时,autovacuum被彻底关闭,不会对任何表做清理。
  • autovacuum_max_workers > 0和autovacuum = off,只对系统表和开了delta表的列存表做清理(如vacuum delta表,vacuum cudesc表和delta merge)。
  • autovacuum_max_workers > 0和autovacuum = on,会对所有表做清理。

autovacuum_naptime

参数说明:设置两次自动清理操作的时间间隔。

参数类型:SIGHUP

取值范围:整型,1~2147483 ,单位为秒(s)。

默认值:60s

autovacuum_vacuum_threshold

参数说明:设置触发VACUUM的阈值。当表上被删除或更新的记录数超过设定的阈值时才会对这个表执行VACUUM操作。

参数类型:SIGHUP

取值范围:整型,0~INT_MAX

默认值:50

autovacuum_analyze_threshold

参数说明:设置触发ANALYZE操作的阈值。当表上被删除、插入或更新的记录数超过设定的阈值时才会对这个表执行ANALYZE操作。

参数类型:SIGHUP

取值范围:整型,0~INT_MAX

默认值:

  • 若当前集群为低版本升级到8.1.3及以上集群版本,为保持和前向兼容,默认值为10000。
  • 若当前集群为新装的8.1.3及以上集群版本,默认值为50。

autovacuum_vacuum_scale_factor

参数说明:设置触发一个VACUUM时增加到autovacuum_vacuum_threshold的表大小的缩放系数。

参数类型:SIGHUP

取值范围:浮点型,0.0~100.0

默认值:0.2

autovacuum_analyze_scale_factor

参数说明:设置触发一个ANALYZE时增加到autovacuum_analyze_threshold的表大小的缩放系数。

参数类型:SIGHUP

取值范围:浮点型,0.0~100.0

默认值:

  • 若当前集群为低版本升级到8.1.3及以上集群版本,为保持和前向兼容,默认值为0.25。
  • 若当前集群为新装的8.1.3及以上集群版本,默认值为0.1。

autovacuum_freeze_max_age

参数说明:设置事务内的最大时间,使得表的pg_class.relfrozenxid字段在VACUUM操作执行之前被写入。

VACUUM也可以删除pg_clog/子目录中的旧文件;即使自动清理进程被禁止,系统也会调用自动清理进程来防止循环重复。

参数类型:SIGHUP

取值范围:整型,100 000~576 460 752 303 423 487

默认值:4000000000

autovacuum_vacuum_cost_delay

参数说明:设置在自动VACUUM操作里使用的开销延迟数值。

参数类型:SIGHUP

取值范围:整型,-1~100,单位为毫秒(ms)。其中-1表示使用常规的vacuum_cost_delay。

默认值:2ms

autovacuum_vacuum_cost_limit

参数说明:设置在自动VACUUM操作里使用的开销限制数值。

参数类型:SIGHUP

取值范围:整型,-1~10000。其中-1表示使用常规的vacuum_cost_limit。

默认值:-1

check_crossvw_write

参数说明:控制是否要开启跨VW写场景的检测。该参数仅9.1.0.100及以上集群版本支持。

参数类型:USERSET

取值范围:整型,-1、1。

  • -1表示兼容9.0.3版本能力。对于v3表vacuum,只清理所有epoch的非最后一个文件。
  • 1表示检查是否为跨VW写场景。对于v3表vacuum,若检查为非跨VW写的场景,清理所有epoch的非最后一个文件,清理当前epoch的最后一个文件,清理小于当前epoch的最后一个文件。若检查为跨VW写的场景,CN节点会获取所有DN节点的epoch信息包装成epochList下发给元数据VW,v3表vacuum会清理所有epoch的非最后一个文件,清理小于max{epochList}且不在epochList中的epoch最后一个文件。

默认值:1

global_colvacuum_tuple_scale_factor

参数说明:控制是否要开启v3表跨VW文件清理的global autovacuum。该参数仅9.1.0.200及以上集群版本支持。

参数类型:SIGHUP

取值范围:整型,-1~100。

  • -1表示不开启global autovacuum。autovacuum只会清理所有epoch的非最后一个文件。
  • 0表示开启global autovacuum。触发global autovacuum的阈值为分区表dead tuple阈值和该表所在节点数之积。
  • 1-100表示开启global autovacuum,触发global autovacuum的阈值为分区表dead tuple阈值的倍数。

默认值:0

colvacuum_threshold_scale_factor

参数说明:控制列存vacuum重写中,重写文件最低dead tuple的比例值。当autovacuum发现列存表dead tuple总数大于RelDefaultFullCuSize(60000)时,且该总数占all_tuple的比例大于该值的1/2,才会发起对该列存表的vacuum操作。当文件中的dead tuple占(all_tuple - null_tuple)的比例大于此值,该文件才会被重写。

参数类型:SIGHUP

取值范围:整型,-2~100。

  • -2表示不会执行vacuum重写,也不会执行vacuum清理。
  • -1表示不会执行vacuum重写,只会执行vacuum清理。
  • 0-100为dead tuple的比例值。

默认值:70

enable_pg_stat_object

参数说明:控制auto vacuum是否更新PG_STAT_OBJECT系统表。该参数仅8.2.1及以上集群版本支持。

参数类型:USERSET

取值范围:布尔型

  • on表示auto vacuum更新PG_STAT_OBJECT系统表。
  • off表示auto vacuum不更新PG_STAT_OBJECT系统表。

默认值:on

enable_col_index_vacuum

参数说明:控制是否允许autovacuum清理列存索引脏数据。列存索引脏数据的清理能避免索引空间持续膨胀,优化带索引表的入库性能。该参数仅8.2.1.100及以上集群版本支持。

参数类型:SIGHUP

取值范围:布尔型

  • on表示开启autovacuum清理列存索引脏数据功能。
  • off表示关闭autovacuum清理列存索引脏数据功能。

默认值:on

新安装集群默认开启,老集群升级后默认关闭。

enable_table_level_oldestxmin

参数说明:控制是否开启表级oldestxmin特性。打开此开关,各表拥有各自的oldestxmin,在VACUUM时不受与表本身无关的长事务的影响,能够及时清理,空间复用更加有效。该参数仅8.3.0及以上集群版本支持。

参数类型:SIGHUP

取值范围:布尔型

  • on表示开启表级oldestxmin特性。
  • off表示关闭表级oldestxmin特性。

默认值:off

  • 长事务指的是运行大于某一时间后还未提交的事务,具体请参考old_txn_threshold
  • 表级oldestxmin对系统表不生效,系统表依然使用全局oldestxmin,受所有长事务的影响。

old_txn_threshold

参数说明:计算表级oldestxmin时,运行超过此参数的事务被认定为长事务。该参数仅8.3.0及以上集群版本支持。

参数类型:SIGHUP

取值范围:整型,1 ~ 1000000,单位为秒。

默认值:600

  • 表级oldestxmin的计算规则:
    • 事务运行时长的计算是以获取快照的时间为开始时间。
    • 在获得快照后,如果事务运行时间短于old_txn_threshold设置的值,则不会算作长事务,会影响所有的表的oldestxmin的计算。
    • 在获取快照后,如果事务运行时间大于old_txn_threshold设置的值,则算作长事务。对于与这个事务不相关的表,计算oldestxmin时不会将此事务算作活跃事务;与这个事务相关的表,计算oldestxmin时会将此事务作为活跃事务计算到oldestxmin中。
  • old_txn_threshold取值应根据实际运行情况进行调整:在一个事务中,当一个快照使用时间超过old_txn_threshold后,打开一个之前未曾打开的表(或分区)时,会报错“Snapshot is invalid”。如果出现此报错,可以适当调大old_txn_threshold的值。