
PostgreSQL 的 Vacuum 是数据库维护中很重要的一块,看了不少 帖子questions 都是围绕着表膨胀,而为什么会表膨胀无法收缩,和怎么收缩的答案还是不少,但我始终很少找到关于怎么监控vacuum的帖子,今天就不知羞耻的,来谈谈关于监控 POSTGRESQL vacuum的问题。
其实对比 SQL SERVER 和 MYSQL 来说 POSTGRESQL 的管理一点都不复杂,相对某些数据库还是简单的。
例如下面这句话,我们就可以简单的从这一句话,来获得
SELECT relname,round(n_dead_tup /(n_live_tup + n_dead_tup)::numeric,2) as dead_row_percent,last_autovacuum,last_autoanalyze,seq_scan,idx_scan,n_tup_ins,n_tup_upd,n_tup_del FROM pg_stat_user_tables;
通过这一句话,其实你就获得了对一个表的维护的必要的,可以说是大部分信息。

1 你可以获得dead_rows 占整个表的tup的百分比
2 你可以获知上一次做autovacuum 的时间
3 你可以对你的表的CRUD 的操作的频度有一个了解
另外一点,对于一个表的大小,其实也是需要监控的,如果在某一段时间表的数据量大量的增加,而实际上你看插入的数据并不多,这时间就要警惕是不是 vacuum 产生了问题。
SELECT
relname AS "table_name",
pg_size_pretty(pg_table_size(C.oid)) AS "table_size"
FROM
pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE nspname NOT IN ('pg_catalog', 'information_schema') AND nspname !~ '^pg_toast' AND relkind IN ('r')
ORDER BY pg_table_size(C.oid)
DESC ;

在监控完毕后,在空闲期间我们也可以手动来进行一些 vacuum的工作。
直接对某些表进行vacuum 并打印相信的信息。

到目前为止,可能大家并不觉得 vacuum是一个问题,而自动的auto vacuum 不工作可能有很多原因
1 自动的vacuum 在数据库中被禁用
2 自动的vacuum 被某些表禁用
3 长事务引起的无法进行vacuum
4 锁冲突造成的问题,无法进行vacuum
查看到底auto-vacuum 到底运行没有,的工作
1 看看进程到底在不在

2 查看自动auto vacuum 到底开没开

3 有的时候auto vacuum 开了但是还是不工作,可能和你的统计分析的开启没开启有关

或者是不是有单表不进行vacuum 是由于单表本身关闭了vacuum,可以打开这个设置
ALTER TABLE address SET (autovacuum_enabled = true);
我们可以做一个演示,看看到底什么样的操作会引起 vacuum 不能进行
1 启动一个事务
begin;

2 打开另一个session 我们进行 vacuum

3 可以看一下当前的vacuum 是否在等待的状态,果不其然,是在等待的状态

4 后面直接进行rollback

5 马上vacuum 进行了工作

所以看有些帖子里面抱怨POSTGRESQL Vacuum 奇葩,不如自己看看是不是自己那些地方没有做到,引起的问题,抱怨解决不了问题,只有掌握知识,才能更好的找出问题的根源,解决。
最后还有类似长时间的事务,可以通过最简单的 pg_stat_activity,来查看到底有没有这样的东西。
而最近得感悟是,努力不可能会马上有回报,人生也是,付出的就算没有回报,也不会后悔,因为路在前面,没有必烦恼。
原文作者:;如有侵权,请联系管理员删除。