一、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定时任务定期清理数据库或者表。




