我们在ALTER TABLE几个小时前开始了一个查询,直到最近才意识到(通过pg_stat_activity)它正在等待锁定。我们发现另一个查询在我们想要更改的表上持有锁,并且不放手。
我们的查询是一个“简单”的查询(改变列数据类型),但它运行在一个庞大的表上。
我们决定与其杀死持有锁的进程,不如杀死ALTER TABLE.
我们没有将包装ALTER TABLE在交易中。
据我了解,我们的查询正在等待锁的事实意味着它一直在等待锁,并且从未改变任何东西。
这是真的?我们完全取消ALTER TABLE查询是否安全?或者查询是否可能已经修改了某些内容并取消它会使我们的数据库处于某种中间状态?
PS:计划是使用SELECT pg_cancel_backend(pid);. 如果这是一个坏主意,请告诉我。