现象描述
数据库一直提示如下信息
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表引起,进一步查看此表详细信息。
或者对该表进行copy备份导出,drop之后再恢复数据。
最终原因定位
大致可以定位数据库膨胀的原因是由event表引起,该表外键关联较多,同时没有进行vacuum手工处理,最终引起数据库告警提示信息。
vacuum建议
保持联系
本人组建了一个技术交流群:PG乐知乐享交流群。欢迎关注文章的小伙伴随缘加入,进群请加本人微信skypkmoon并备注PG乐知乐享。
