首页 > 解决方案 > 从没有任何 PID 的 postgres 9.6.6 中删除 pg_lock

问题描述

我们有一个任务被卡住了,所以我过去常常SELECT pg_cancel_backend(<pid of the process>)杀死这个任务。然而,任务持有的锁并没有消失,现在我的一张桌子被锁定了。

我试图COPY在桌子上运行一个命令,但它卡在了wait_event_type = Lock.


正在使用的系统:

服务器:AWS RDS db.m4.xlarge
数据库: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


select * from pg_prepared_xacts where transaction=24019935;

transaction |             gid              |           prepared           |  owner   | database
------------+------------------------------+------------------------------+----------+----------
24019935    | PGDIRTY:dirty_state::9994733 | 2018-06-27 13:40:12.88981-08 | postgres | pg


我已经尝试执行在 postgres 中删除没有 pid 的锁中建议的步骤,但它没有显示任何 pgid。

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

谁能帮我弄清楚如何摆脱这个锁?

谢谢

标签: postgresqlamazon-rdspostgresql-9.6

解决方案


以防万一,任何其他可怜的家伙陷入类似的境地。这就是最终对我有用的方法。

PS:我不知道为什么锁没有像问题评论中提到的那样随着重启而消失。

ROLLBACK PREPARED (SELECT gid FROM pg_prepared_xacts);

说明:由于某种原因,即使在 PID 终止并重新启动 RDS 服务器之后,准备好的事务也从未正确回滚(也许 RDS 做了一些有趣的重新启动而不是完整的数据库重新启动?)。在我手动回滚准备好的事务后,事务终于被移除,并且锁被释放。

Thomas CG de Vilhena在 Postgresql DROP TABLE 中提到的建议不起作用帮助我最终修复它。


推荐阅读