postgresql autovacuum作用与原理

什么是autovacuum

autovacuum是postgresql数据库是一个后台进程,随数据库自启动。

[postgres@lineqi ~]$ ps -ef |grep postgres
postgres   2626      1  0 09:17 pts/0    00:00:01 /usr/local/pgsql/bin/postgres -D /data/pg11.6
postgres   2627   2626  0 09:17 ?        00:00:00 postgres: logger   
postgres   2629   2626  0 09:17 ?        00:00:00 postgres: checkpointer   
postgres   2630   2626  0 09:17 ?        00:00:00 postgres: background writer   
postgres   2631   2626  0 09:17 ?        00:00:00 postgres: walwriter   
postgres   2632   2626  0 09:17 ?        00:00:00 postgres: autovacuum launcher   
postgres   2633   2626  0 09:17 ?        00:00:00 postgres: archiver   
postgres   2634   2626  0 09:17 ?        00:00:02 postgres: stats collector   
postgres   2635   2626  0 09:17 ?        00:00:00 postgres: TimescaleDB Background Worker Launcher  
postgres   2636   2626  0 09:17 ?        00:00:00 postgres: logical replication launcher   

autovacuum的作用

autovacuum作用如下:
1、清理表中的过期死元组
2、防止业务表膨胀
3、更新表的统计信息以供优化器使用
4、autovacuum launcher使用stats collector后台进程收集统计信息来确定autovacuum候选列表
这是一个非常频繁的操作,脏活、累活都让它给干了

如何开启autovacuum

默认情况下autovacuum是自动开启,但要正常工作还需要开启track_counts,该参数也是默认开启的。

lineqi=# 
select name,setting,short_desc  from pg_settings where name='track_counts'
union all
select name,setting,short_desc from pg_settings where name ='autovacuum';
     name     | setting |                short_desc
--------------+---------+-------------------------------------------
 track_counts | on      | Collects statistics on database activity.
 autovacuum   | on      | Starts the autovacuum subprocess.

提示:即使关闭该参数也会在需要防止事务ID回卷时发起清理进程,两上参数可以postgresql.conf中修改

autovacuum相关参数

lineqi=# select name,setting,short_desc  from pg_settings where name like 'autovacuum%';
                name                 |  setting   |                                        short_desc
-------------------------------------+------------+-------------------------------------------------------------------------------------------
 autovacuum                          | on         | Starts the autovacuum subprocess.
 autovacuum_analyze_scale_factor     | 0.05       | Number of tuple inserts, updates, or deletes prior to analyze as a fraction of reltuples.
 autovacuum_analyze_threshold        | 50         | Minimum number of tuple inserts, updates, or deletes prior to analyze.
 autovacuum_freeze_max_age           | 1200000000 | Age at which to autovacuum a table to prevent transaction ID wraparound.
 autovacuum_max_workers              | 5          | Sets the maximum number of simultaneously running autovacuum worker processes.
 autovacuum_multixact_freeze_max_age | 1400000000 | Multixact age at which to autovacuum a table to prevent multixact wraparound.
 autovacuum_naptime                  | 60         | Time to sleep between autovacuum runs.
 autovacuum_vacuum_cost_delay        | 0          | Vacuum cost delay in milliseconds, for autovacuum.
 autovacuum_vacuum_cost_limit        | 10000      | Vacuum cost amount available before napping, for autovacuum.
 autovacuum_vacuum_scale_factor      | 0.02       | Number of tuple updates or deletes prior to vacuum as a fraction of reltuples.
 autovacuum_vacuum_threshold         | 50         | Minimum number of tuple updates or deletes prior to vacuum.
 autovacuum_work_mem                 | 104448     | Sets the maximum memory to be used by each autovacuum worker process.

autovacuum触发条件

autovacuum会做两件事件:一是vacuum,二是analyze。触发条件如下:
vacuum:autovacuum_vacuum_scale_factor* num of tuples per table + autovacuum_vacuum_threshold
analyze:autovacuum_analyze_scale_factor* num of tuples per table + autovacuum_analyze_threshold
例如:test表上有1000条记录,当对这个表进行dml操作达到以下阀值是就会进行autovacuum候选列表,等待执行autovacuum操作。
vacuum=10000.02+50=70个tuple
analyze=1000
0.05+50=100个tuple

autovacuum案例

create table test (userid int ,username varchar(100),crt_time timestamp(6) without time zone)
insert into test select id,'username'||id,now() from generate_series(1,1000) as id

select * from pg_stat_user_tables where relname=‘test’
在这里插入图片描述
场景一:update更新大于70条小于100条记录,查看是否自动执行autovacuum操作
2020-11-05 15:30:40.491624+08
update test set username=‘aa’ where userid<80
在这里插入图片描述
结论:autovacuum_naptime 1分钟以内只执行autovacuum操作,而没有执行autoanalzye操作。
场景二:update更新大于100条记录,查看是否自动执行autovacuum、autoanalyze操作
2020-11-05 15:49:48.756724+08
update test set username=‘cc’ where userid<110
在这里插入图片描述
结论:autovacuum_naptime 1分钟以内两个操作都执行了。

场景三 :delete更新大于100条记录,查看是否自动执行autovacuum、autoanalyze操作
2020-11-05 16:25:48.263717+08
delete from test where userid<430 ;
在这里插入图片描述
结论:这里测试过三次,每次都是删除100条以下的记录,都会同时执行autovacuum和autoanalyze操作 ,但这里统计信息显示不及时,主要表现在查询pg_stat_user_tables没有及时显示出来。

场景四:delete更新大于70条小于100条记录,查看是否自动执行autovacuum操作
2020-11-05 16:36:20.818849+08
delete from test where userid<520 ;
在这里插入图片描述
结论:这里删除了90条记录,结果没有执行autovacuum操作。

autovacuum内部原理

参考资料

postgresql自动清理:http://www.postgres.cn/docs/12/runtime-config-autovacuum.html

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,您提供的代码片段似乎是C语言的代码。根据您的问题,您遇到了编译错误。要解决这个问题,您可以尝试以下几个步骤: 1. 检查代码中是否存在拼写错误或语法错误。编译错误通常是由于代码中的错误导致的。请确保您的代码中没有任何拼写错误,并且所有的语法都是正确的。 2. 检查是否缺少头文件。在C语言中,您需要包含所需的头文件来使用特定的函数和库。请确保您的代码中包含了所需的头文件,并且这些头文件的路径是正确的。 3. 检查是否缺少库文件。有时候,编译错误可能是由于缺少所需的库文件而引起的。请确保您的代码中包含了所需的库文件,并且这些库文件的路径是正确的。 4. 检查编译命令是否正确。编译C语言代码时,您需要使用正确的编译命令来编译代码。请确保您使用的编译命令是正确的,并且所有的参数都是正确的。 以下是一个示例的C语言代码,用于创建和读取共享内存: 创建共享内存: ```c #include <stdio.h> #include <stdlib.h> #include <sys/shm.h> int main(int argc, char* argv[]) { key_t key = ftok(argv[1], 1); if (-1 == key) { perror("ftok err"); return 1; } int shmid = shmget(key, atoi(argv[2]), IPC_CREAT | 0644); if (-1 == shmid) { perror("shmget err"); return 1; } printf("shmid:%d\n", shmid); return 0; } ``` 读取共享内存: ```c #include <stdio.h> #include <stdlib.h> #include <sys/shm.h> int main(int argc, char* argv[]) { int shmid = atoi(argv[1]); if (-1 == shmctl(shmid, IPC_RMID, NULL)) { perror("shmctl err"); return 1; } return 0; } ``` 请注意,这只是一个示例代码,您需要根据您的具体需求进行修改和适应。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值