You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL12给50万行表加非空布尔列长时间运行被阻塞如何解决

阻塞原因
  • PostgreSQL中PID为0的阻塞源对应两阶段提交产生的悬停预备事务,这类事务完成本地执行后就脱离了普通会话进程的管理,因此不会在pg_stat_activity视图中展示,你无法通过查询该视图找到对应的阻塞进程。
  • 你执行的ALTER TABLE加列操作需要获取目标表的排他锁,只要存在未提交/回滚的预备事务持有该表的相关锁,DDL语句就会一直处于等待状态。由于预备事务是持久化存储的,即便重启数据库也不会自动释放,所以会出现长时间无结果的情况。
解决步骤
  1. 执行以下语句查询当前节点所有存续的预备事务:
SELECT * FROM pg_prepared_xacts;
  1. 确认这些预备事务无业务侧需要保留的必要后,逐一执行回滚操作,将语句中的gid值替换为上一步查询结果里对应事务的gid字段内容:
ROLLBACK PREPARED '替换为实际gid值';
  1. 所有预备事务回滚完成后,持有的表锁会自动释放,你就可以正常执行加列的DDL语句了。

补充优化提示:你要添加的是无默认值的非空boolean列,PostgreSQL要求现有行必须有该列的有效值,你可以先加可空的boolean列,批量更新完所有行的字段值后,再将列修改为非空属性,能减少DDL操作的锁表时长。

内容的提问来源于stack exchange,提问作者Kevin V

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 06:36:07