ITPub博客

首页 > 数据库 > > PostgreSQL Auto VACUUM 与最近的一点感悟

PostgreSQL Auto VACUUM 与最近的一点感悟

作者:liuaustin 时间:2019-06-28 07:56:49 0 删除 编辑


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,来查看到底有没有这样的东西。


而最近得感悟是,努力不可能会马上有回报,人生也是,付出的就算没有回报,也不会后悔,因为路在前面,没有必烦恼。

 

原文作者:;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2018-11-13

  • 博文量
    1980
  • 访问量
    518138