我们有一个任务卡住了,所以我用SELECT pg_cancel_backend(<pid of the process>)
取消了任务。但是,任务保持的锁并没有消失,现在我的桌子之一已被锁定。
我正在尝试在表上运行COPY
命令,但该命令卡在wait_event_type = Lock
上。
正在使用的系统:
服务器:AWS RDS db.m4.xlarge
DB:PostgreSQL 9.6.6
从pg_locks中选择*;
locktype | database | relation | page | tuple | virtualxid | transactionid | classid | objid | objsubid | virtualtransaction | pid | mode | granted | fastpath
--------------+----------+----------+------+-------+------------+---------------+---------+-------+----------+--------------------+-------+------------------+---------+----------
relation | 16390 | 19694 | | | | | | | | -1/24019935 | | RowExclusiveLock | t | f
transactionid | | | | | | 24019935 | | | | -1/24019935 | | ExclusiveLock | t | f
从pg_prepared_xacts中选择*,其中transaction = 24019935;
transaction | gid | prepared | owner | database
------------+------------------------------+------------------------------+----------+----------
24019935 | PGDIRTY:dirty_state::9994733 | 2018-06-27 13:40:12.88981-08 | postgres | pg
我已经尝试过执行Remove locks without a pid in postgres中建议的步骤,但是它没有显示任何pgid。
我也尝试过重新启动数据库,但是锁仍然存在。
任何人都可以帮助我弄清楚如何摆脱这种锁定吗?
谢谢
答案 0 :(得分:2)
以防万一,其他可怜的家伙陷入了类似的情况。这是最终对我有用的东西。
PS:我不知道为什么问题注释中提到的重新启动后锁不会消失。
ROLLBACK PREPARED (SELECT gid FROM pg_prepared_xacts);
说明:出于某种原因,即使在PID终止并重新启动RDS服务器之后,准备好的事务也从未正确回滚(也许RDS会进行一些有趣的重新启动而不是完全db重新启动?) 。在我手动回滚准备好的事务之后,该事务最终被删除,并释放了锁。
Thomas C. G. de Vilhena在Postgresql DROP TABLE doesn't work中提到的建议最终帮助我解决了这个问题。