在没有任何PID的情况下从postgres 9.6.6删除pg_lock

时间:2018-07-27 11:11:18

标签: postgresql amazon-rds postgresql-9.6

我们有一个任务卡住了,所以我用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。

我也尝试过重新启动数据库,但是锁仍然存在。

任何人都可以帮助我弄清楚如何摆脱这种锁定吗?

谢谢

1 个答案:

答案 0 :(得分:2)

以防万一,其他可怜的家伙陷入了类似的情况。这是最终对我有用的东西。

PS:我不知道为什么问题注释中提到的重新启动后锁不会消失。

  

ROLLBACK PREPARED (SELECT gid FROM pg_prepared_xacts);

说明:出于某种原因,即使在PID终止并重新启动RDS服务器之后,准备好的事务也从未正确回滚(也许RDS会进行一些有趣的重新启动而不是完全db重新启动?) 。在我手动回滚准备好的事务之后,该事务最终被删除,并释放了锁。

Thomas C. G. de VilhenaPostgresql DROP TABLE doesn't work中提到的建议最终帮助我解决了这个问题。