【发布时间】:2023-02-22 01:14:31
【问题描述】:
我只是去运行我的生产数据库上的迁移。迁移是一个简单的 ALTER TABLE .. add a column 在一张小桌子上。我在本地测试过,不到一秒钟就跑完了。但是当我部署到生产环境并且迁移试图在那里运行时,它被阻止了。当我查询 pg_stat_activity 时,我可以看到它被这个查询阻止了:
592635 | idle in transaction | postgres_fdw | 00:51:42.589821 | CLOSE c9
谁能告诉我这是什么?我通过 postgres 外部数据包装器将此数据库安装到另一个数据库,因此它显然与此相关。但是这个查询具体是什么,CLOSE,什么东西?如果它“空闲”,为什么会阻塞?
发生这种情况时,我尝试 pg:kill 查询,但它不会被杀死。我改为终止了 ALTER TABLE 查询。
现在(第二天)我检查我的 pg:ps 并且这个 postgres_fdw 不再存在。但我想从这件事中吸取教训,这样我就可以避免在未来停工。
【问题讨论】:
-
有人创建了一个外部表链接到您的数据库和表。 idle in transaction 意味着事务已经开始,但还没有提交。
-
您在那里显示 pg_stat_activity 的哪些列?
-
某些东西创建了一个事务并且没有提交它。该事务中的一个语句占用了锁,这会阻止您。 CLOSE 没有获取锁,它只是在空闲之前在该事务中执行的最后一条语句。
-
至于
"CLOSE是什么见CLOSE。似乎 postgres_fdw 在幕后使用游标。
标签: postgresql heroku heroku-postgres