如何找到阻止另一个查询的查询?
我正在尝试删除drop table temp;查询永远运行的空表
。
因此,我试图找到可能阻止当前查询的其他查询。这是我尝试过的:
SELECT *
FROM pg_locks l
JOIN pg_class t ON l.relation = t.oid AND t.relkind = 'r'
WHERE t.relname = 'temp';
此查询返回零结果
SELECT database, gid FROM pg_prepared_xacts;
这也没有给出任何结果。
该表是一个分区表,附加在该表上的分区已经被成功删除。
我什至无法获得d temp.
发生了什么事?我怎样才能解决这个问题?
当我在本地尝试相同时,这不会发生。工作得很好。
回答
运行前DROP TABLE,执行
SELECT pg_backend_pid();
这将告诉您后端进程 ID。然后DROP TABLE 在同一个数据库会话中运行。
然后,当DROP TABLE挂起时,启动一个新会话并运行
SELECT pg_blocking_pids(<backend PID>);
然后您就知道哪些会话在阻止您,并且可以杀死它们或采取较少破坏性的措施来摆脱它们。