postgresql - 从没有任何 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。
我也尝试重新启动我的数据库,但锁定仍然存在。
谁能帮我弄清楚如何摆脱这个锁?
谢谢
解决方案
以防万一,任何其他可怜的家伙陷入类似的境地。这就是最终对我有用的方法。
PS:我不知道为什么锁没有像问题评论中提到的那样随着重启而消失。
ROLLBACK PREPARED (SELECT gid FROM pg_prepared_xacts);
说明:由于某种原因,即使在 PID 终止并重新启动 RDS 服务器之后,准备好的事务也从未正确回滚(也许 RDS 做了一些有趣的重新启动而不是完整的数据库重新启动?)。在我手动回滚准备好的事务后,事务终于被移除,并且锁被释放。
Thomas CG de Vilhena在 Postgresql DROP TABLE 中提到的建议不起作用帮助我最终修复它。
推荐阅读
- salesforce - 使用 Trailhead 帐户登录 Salesforce android 应用程序
- r - 如何计算r中哪些行满足条件?
- r - R中的odbcConnect - 如何提取dsn文件信息?
- macos - when opening multiple files in vscode, only the first is actually loaded in memory
- powershell - Powershell Get-Content 文本中的特定内容
- html - 在 HTML/CSS 中创建一个左侧图像和右侧标题段落的容器
- python - CreateView 中的自己的方法
- python - 如何从 python 脚本运行 snscrape 命令?
- dialogflow-es - Dialogflow 正则表达式实体类似于@sys.any
- docker - Docker Compose 与 NGINX 代理通过不工作