PostgreSQL Vacuum 死锁运行手册
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/postgresql-vacuum-deadlock-runbook。
技能介绍
要解决什么问题
autovacuum 跟不上写入速度时,表里的死元组持续堆积,索引膨胀,查询计划越来越差;此时若再遇到一个持有旧快照的长事务,VACUUM 会被反复阻断,cleanup 无法推进,整张表陷入「越扫不完越膨胀」的循环。运维人员需要快速回答:哪些表膨胀最严重、是哪个会话在拖住 vacuum、该如何安全处理这个长事务。靠人工逐张翻 pg_stat_user_tables 和 pg_locks 排查,耗时且容易遗漏。
它如何工作
- 通过
pg_stat_user_tables汇总各表的死元组数量与膨胀趋势,圈定最需要关注的候选表 - 结合
pg_locks与pg_stat_activity,定位阻塞 vacuum 的长事务及其持有的锁 - 使用
pgstattuple扩展对候选表做实际空间测量,确认真实膨胀比例,避免误判 - 针对长事务冲突生成可执行的补救 SQL,而不是只给出诊断结论
适用边界
- 需要目标实例已安装
pgstattuple扩展,且运行账号具备相应权限 - 底层基于 node-postgres,要求环境中可使用
npm install pg;纯 JavaScript 实现,可选原生 libpq 绑定 - 它产出的是诊断与补救 SQL,最终变更仍需人工确认后执行;高峰期终止长事务前,应先评估回滚代价
使用场景
- autovacuum 跟不上写入导致死元组堆积,需定位膨胀最严重的表并确认真实膨胀比例
- 线上 VACUUM 被某个长事务反复阻断,需通过 pg_locks 和 pg_stat_activity 找出阻塞会话
- 查询计划突然变差怀疑索引膨胀,需用 pgstattuple 对关键表做实际空间测量
- 长事务冲突需要生成补救 SQL,但不想人工逐张翻阅系统视图来定位问题
适合人员
- 数据库管理员(DBA),负责线上 PostgreSQL 实例,需在 vacuum 故障时快速定位阻塞源并给出补救方案
- 后端工程师,维护 Node.js 服务背后的 PostgreSQL,需排查长事务引发的表膨胀与查询变慢
- 数据平台运维,负责多套 PostgreSQL 实例的稳定性,需要系统化排查 autovacuum 跟不上写入的问题
- SRE 工程师,处理数据库性能告警,需在长事务冲突场景下获得可执行的补救 SQL 而非仅诊断结论