ITPub博客

首页 > 数据库 > PostgreSQL > PostgreSQL生产环境vacuum问题分析处理

PostgreSQL生产环境vacuum问题分析处理

PostgreSQL 作者:u_aa03cac0d7fc 时间:2024-04-06 10:21:28 0 删除 编辑

现象描述

数据库一直提示如下信息

xxx CST [5643] HINT:  To avoid a database shutdown, execute a database-wide VACUUM in that database.
	You might also need to commit or roll back old prepared transactions, or drop stale replication slots.

进一步查看详细日志信息,事务ID清理没执行成功,只剩不到一千万,触发了告警信息。
这个问题较常见,也比较容易复现。

处理方法一

当数据库事务ID剩余量小于100万时只能进入单用户模式进行操作。

关闭数据库服务
$ pg_ctl stop -mi -D $PGDATA
进入PG单用户模式,vacuum实际的数据库,这里连接默认的postgres数据库
$ postgres --single -D $PGDATA postgres
backend> vacuum freeze verbose;

处理方法二

当数据库事务ID剩余量大于100万时,可以进入数据库手工进行vacuum操作。

实际处理过程

1.关闭自动vacuum

autovacuum=off

2.修改表强制freeze参数,改为最小值十万

autovacuum_freeze_max_age=10 0000

前面两步修改需要重启数据库服务

3.根据服务器内存临时调大maintenance_work_mem的值,

 set maintenance_work_mem = '4GB';

4.查询数据库及表的膨胀情况

select datname,datfrozenxid,age(datfrozenxid) from pg_database;
select relname,age(relfrozenxid)
from pg_class  
where relkind in ('t','r') 
order by age(relfrozenxid) desc limit 5;

5.对膨胀最大的单表逐个进行vacuum

postgres=# vacuum freeze verbose event;

这里发现数据库主要是一张event表引起,进一步查看此表详细信息。

  • 表数据量并不是特别大,有一百多万行
  • 索引比较多,超过5个
  • 外键关联表多

或者对该表进行copy备份导出,drop之后再恢复数据。

最终原因定位

大致可以定位数据库膨胀的原因是由event表引起,该表外键关联较多,同时没有进行vacuum手工处理,最终引起数据库告警提示信息。

vacuum建议

  • 频繁更新的表或大表设置不同的vacuum年龄因子
  • 选择时间窗口,手工调度vacuum
  • 做好数据库及表的年龄监控
  • 关注长事务状态
  • 尽量减少外键关联表的使用

保持联系

本人组建了一个技术交流群:PG乐知乐享交流群。欢迎关注文章的小伙伴随缘加入,进群请加本人微信skypkmoon并备注PG乐知乐享。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69978456/viewspace-3011547/ ,如需转载,请注明出处,否则将追究法律责任。

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

注册时间:2018-06-12

  • 博文量
    102
  • 访问量
    50362