现象描述
数据库一直提示如下信息
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
- 做好数据库及表的年龄监控
- 关注长事务状态
- 尽量减少外键关联表的使用
保持联系
从2019年12月开始写第一篇文章,分享的初心一直在坚持,本人现在组建了一个PG乐知乐享交流群,欢迎关注我文章的小伙伴进群吹牛唠嗑,交流技术,互赞文章。
如果群二维码失效可以加我微信。
最后修改时间:2022-10-23 10:37:59
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
文章被以下合辑收录
评论

2年前

评论
👍🏻
2年前

评论
相关阅读
外国CTO也感兴趣的开源数据库项目——openHalo
小满未满、
1619次阅读
2025-04-21 16:58:09
9.9 分高危漏洞,尽快升级到 pgAdmin 4 v9.2 进行修复
严少安
386次阅读
2025-04-11 10:43:23
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
372次阅读
2025-04-15 14:48:05
转发有奖 | PostgreSQL 16 PGCM高级认证课程直播班招生中!
墨天轮小教习
182次阅读
2025-04-14 15:58:34
中国PostgreSQL培训认证体系新增PGAI应用工程师方向
开源软件联盟PostgreSQL分会
181次阅读
2025-05-06 10:21:13
PG生态赢得资本市场青睐:Databricks收购Neon,Supabase融资两亿美元,微软财报点名PG
老冯云数
139次阅读
2025-05-07 10:06:22
SQL 优化之 OR 子句改写
xiongcc
136次阅读
2025-04-21 00:08:06
告别老旧mysql_fdw,升级正当时
NickYoung
119次阅读
2025-04-29 11:15:18
PostgreSQL中文社区亮相于第八届数字中国峰会
PostgreSQL中文社区
102次阅读
2025-05-07 10:06:20
PostgreSQL的dblink扩展模块使用方法
szrsu
102次阅读
2025-04-24 17:39:30