【问题标题】:How to find the queries that is blocking another query?如何找到阻止另一个查询的查询?
【发布时间】:2021-03-15 05:27:58
【问题描述】:

我正在尝试删除一个空表 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 的结果。

发生了什么事? 我怎样才能解决这个问题?

当我在本地尝试相同时,不会发生这种情况。工作得很好。

【问题讨论】:

  • pg 的哪个版本,这些是物理分区还是逻辑分区?
  • 分区表有relkind = 'p',因此您的查询没有返回任何内容也就不足为奇了。通常,检查pg_stat_activity 以查看会话是否被某些东西阻止会更容易。
  • 即使表格给我的结果为零,我仍然无法删除甚至获取表格描述:(

标签: sql postgresql sql-delete partitioning


【解决方案1】:

在运行DROP TABLE之前,执行

SELECT pg_backend_pid();

这将告诉您后端进程 ID。然后在同一个数据库会话中运行DROP TABLE

然后,当DROP TABLE 挂起时,开始一个新会话并运行

SELECT pg_blocking_pids(<backend PID>);

然后您就知道哪些会话正在阻止您,并且可以杀死它们或采取破坏性较小的措施来摆脱它们。

【讨论】:

  • 哇!谢谢我试图删除的表在另一个表上删除了级联。即使我当前的表是空的,它也会被级联表的更新所阻止。
  • 这真是个救星,调试很多其他场景我也可以用这个,谢谢
  • 尝试选择 pg_cancel_backend(pid);在进程被识别后杀死它。
  • 谢谢,我是通过另一个 SO 问题知道该查询的,并且确实做到了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-18
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多