暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

postgresql/opengauss中自动清理任务

原创 _ All China Database Union 2024-04-16
1246

一、autovacuum功能

autovacuum的功能包括自动执行VACUUM和ANALYZE命令,以对具有大量插入、更新或删除元组的表进行检查和维护。它由多个进程组成,其中包括持久的守护进程autovacuum launcher,负责为所有数据库启动autovacuum worker进程。这些worker进程会定期检查每个数据库中的表,并根据需要执行VACUUM和/或ANALYZE操作。autovacuum还会根据表中的元组变化情况自动执行ANALYZE操作,以更新查询规划器使用的数据统计信息。

具体功能如下

  • 恢复或重用已更新或删除的行占用的磁盘空间。
  • 更新PostgreSQL查询规划器使用的数据统计信息
  • 更新可见性映射以加快仅索引扫描
  • 防止由于事务ID环绕或多事务ID环绕而导致非常旧数据丢失

启动器将跨时间分配工作,尝试每隔autovacuum_naptime秒在每个数据库中启动一个工作线程。

最多允许同时运行autovacuum_max_workers工作进程。

如果有多个数据库要处理,则第一个工作程序完成后将立即处理下一个数据库。每个工作进程将检查其数据库中的每个表并根据需要执行VACUUM和/或ANALYZE。

可以设置log_autovacuum_min_duration来监视 autovacuum 工作进程的活动。

二、autovacuum控制参数

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

  • autovacuum

控制数据库自动清理线程(autovacuum)的启动。自动清理线程运行的前提是将track_counts设置为on。

说明:
如果希望系统在故障恢复后,具备自动清理两阶段事务的功能,请将autovacuum设置为on;
当设置autovacuum为on,autovacuum_max_workers为0时,表示系统不会自动进行autovacuum,只会在故障恢复后,自动清理两阶段事务;
当设置autovacuum为on,autovacuum_max_workers大于0时,表示系统不仅在故障恢复后,自动清理两阶段事务,并且还可以自动清理线程。

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

默认值:on

  • autovacuum_mode

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

analyze表示只做autoanalyze。
vacuum表示只做autovacuum。
mix表示autoanalyze和autovacuum都做。
none表示二者都不做。

默认值:mix

  • autoanalyze_timeout

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

取值范围:整型,单位是s,0~2147483。

默认值:5min(即300s)

  • autovacuum_io_limits

控制autovacuum进程每秒触发IO的上限。

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

  • log_autovacuum_min_duration

当自动清理的执行时间大于或者等于某个特定的值时,向服务器日志中记录自动清理执行的每一步操作。设置此选项有助于追踪自动清理的行为。

将log_autovacuum_min_duration设置为250ms,记录所有运行大于或者等于250ms的自动清理命令的相关信息。

取值范围:整型,最小值为-1,最大值为2147483647,单位为毫秒。

当参数设置为0时,表示所有的自动清理操作都记录到日志中。
当参数设置为-1时,表示所有的自动清理操作都不记录到日志中。
当参数设置为非-1时,当由于锁冲突的存在导致一个自动清理操作被跳过,记录一条消息。
默认值:-1

  • autovacuum_max_workers

设置能同时运行的自动清理线程的最大数量,该参数的取值上限与GUC参数max_connections和job_queue_processes大小有关。

取值范围:整型,最小值为0(表示不会自动进行autovacuum),理论最大值为262143,实际最大值为动态值,计算公式为

262143 - max_inner_tool_connections - max_connections - job_queue_processes - max_concurrent_autonomous_transactions - 辅助线程数 – autovacuum的launcher线程数 - 1

其中辅助线程数和autovacuum的launcher线程数由两个宏来指定,当前版本的默认值分别为20和2。

默认值:3

  • autovacuum_naptime

设置两次自动清理操作的时间间隔。

取值范围:整型,单位为s,最小值为1,最大值为2147483。

默认值:10min(即600s)

  • autovacuum_vacuum_threshold

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

取值范围:整型,最小值为0,最大值为2147483647。

默认值:50

  • autovacuum_analyze_threshold

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

取值范围:整型,最小值为0,最大值为2147483647。

默认值:50

  • autovacuum_vacuum_scale_factor

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

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

默认值:0.2

  • autovacuum_analyze_scale_factor

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

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

默认值:0.1

  • autovacuum_freeze_max_age

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

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

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

默认值:4000000000

  • autovacuum_vacuum_cost_delay

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

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

默认值:20ms

  • autovacuum_vacuum_cost_limit

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

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

默认值:-1

  • defer_csn_cleanup_time

用来指定本地回收时间间隔。

取值范围:整型,0~2147483647,单位为毫秒(ms)。

默认值:5s(即5000ms)

三、vacuum命令

有两种变体VACUUM:标准型VACUUM和VACUUM FULL。
VACUUM FULL可以回收更多的磁盘空间,但运行速度要慢得多。此外,标准形式VACUUM可以与生产数据库操作并行运行。 (诸如SELECT、INSERT、UPDATE和 之类的命令DELETE将继续正常运行,但无法使用诸如ALTER TABLE在清理表时之类的命令来修改表的定义。)VACUUM FULL需要ACCESS EXCLUSIVE对其正在处理的表进行锁定,并且因此不能与该表的其他使用并行进行。因此,一般来说,应该尽量使用标准VACUUM并避免VACUUM FULL)

VACUUM会产生大量 I/O 流量,这可能会导致其他活动会话的性能不佳。可以调整一些配置参数来减少后台清理对性能的影响

VACUUM是常规的清理操作,用于删除表和索引中的死行版本并标记空间以供将来重用,但不会将空间归还给操作系统,除非在表的末尾的一个或多个页面完全空闲并且可以轻松获得独占表锁的特殊情况下。相比之下,VACUUM FULL会主动压缩表,通过写入一个完整的新版本的表文件来消除死空间,从而最小化表的大小,但可能需要很长时间。它还需要额外的磁盘空间来存储表的新副本,直到操作完成。通常,管理员应该努力使用标准的VACUUM并避免使用VACUUM FULL。

四、手工执行

[postgres@db01 ~]$ vacuumdb --help
vacuumdb cleans and analyzes a PostgreSQL database.

Usage:
  vacuumdb [OPTION]... [DBNAME]

Options:
  -a, --all                       vacuum all databases
  -d, --dbname=DBNAME             database to vacuum
      --disable-page-skipping     disable all page-skipping behavior
  -e, --echo                      show the commands being sent to the server
  -f, --full                      do full vacuuming
  -F, --freeze                    freeze row transaction information
      --force-index-cleanup       always remove index entries that point to dead tuples
  -j, --jobs=NUM                  use this many concurrent connections to vacuum
      --min-mxid-age=MXID_AGE     minimum multixact ID age of tables to vacuum
      --min-xid-age=XID_AGE       minimum transaction ID age of tables to vacuum
      --no-index-cleanup          don't remove index entries that point to dead tuples
      --no-process-toast          skip the TOAST table associated with the table to vacuum
      --no-truncate               don't truncate empty pages at the end of the table
  -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available
  -q, --quiet                     don't write any messages
      --skip-locked               skip relations that cannot be immediately locked
  -t, --table='TABLE[(COLUMNS)]'  vacuum specific table(s) only
  -v, --verbose                   write a lot of output
  -V, --version                   output version information, then exit
  -z, --analyze                   update optimizer statistics
  -Z, --analyze-only              only update optimizer statistics; no vacuum
      --analyze-in-stages         only update optimizer statistics, in multiple
                                  stages for faster results; no vacuum
  -?, --help                      show this help, then exit

Connection options:
  -h, --host=HOSTNAME       database server host or socket directory
  -p, --port=PORT           database server port
  -U, --username=USERNAME   user name to connect as
  -w, --no-password         never prompt for password
  -W, --password            force password prompt
  --maintenance-db=DBNAME   alternate maintenance database

Read the description of the SQL command VACUUM for details.

Report bugs to <pgsql-bugs@lists.postgresql.org>.
PostgreSQL home page: <https://www.postgresql.org/>

vacuumdb -d t1 -f -z -v -p 4

opengauss/postgresql均存在该命令,在生产中可以关闭autovacuum,使用crontab定时任务定期清理数据库或者表。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论