终止挂起的查询(事务中空闲)

我正在使用 Heroku 和 Crane Postgres 选项,当我的本地机器崩溃时,我正在对数据库进行查询。如果我逃跑

select * from pg_stat_activity

其中一个条目

<IDLE> in transaction

在 current _ query _ text 列中。

As a result, I can't drop the table that was being written to by the query that was terminated. I have tried using pg_cancel_backend(N) and it returns True but nothing seems to happen.

如何终止此进程以便删除表?

67816 次浏览

这是一个通用的 PostgreSQL 答案,并不特定于 Heroku


(这个问题的简单-愚蠢的答案可能是... 只是重新开始后。假设这不是我们想要的或者不是一个选择... ...)

通过运行 sql 查找 PID:

SELECT pid , query, * from pg_stat_activity
WHERE state != 'idle' ORDER BY xact_start;

(查询可能需要根据 postgres 的版本进行修补——最终,只需从 pg _ stat _ activity 中选择 *)。您将在第一(左)列中找到 pid,并且第一(上)行很可能是您想要终止的查询。我假设 pid 在1234以下。

You may cancel a query through SQL (i.e. without shell access) as long as it's yours or you have super user access:

select pg_cancel_backend(1234);

这是一个取消1234-查询的“友好”请求,如果运气好的话,它会在一段时间后消失。如果需要,以下更像是一个“硬终止”命令,可能会导致它更快地取消:

select pg_terminate_backend(1234);

如果您拥有 shell 访问权限和 root 或 postgres 权限,也可以从 shell 进行此操作。“取消”一个人可以做的事情:

kill -INT 1234

以及“终结”,简单地说:

kill 1234

不要:

kill -9 1234

... that will often result in the the whole postgres server going down in flames, then you may as well restart postgres. Postgres is pretty robust, so the data won't be corrupted, but I'd recommend against using "kill -9" in any case :-)


持久的“事务中的空闲”通常意味着事务没有以“提交”或“回滚”结束,这意味着应用程序存在错误或者没有正确设计来处理事务性数据库。应该避免长期的“事务中的闲置”,因为它也可能导致重大的性能问题。

试试这个:

select pg_terminate_backend(pid int)

更多关于这一点,你可以找到 给你。这应该是’干净’的解决方案,这个问题比杀死进程的系统。

You can install the heroku-pg-extras add-on and run the following command to get the PID:

heroku pg:locks --app <your-app>

那就做吧:

heroku pg:kill <pid> --app <your-app>

注意 : --force选项可用于发出 pg _ finally _ backend,该选项将删除该查询的整个连接。

如果 heroku pg:locks没有列出任何内容,请尝试 heroku pg:ps

欲了解更多信息,请点击:
Https://devcenter.heroku.com/articles/heroku-postgresql#pg-ps-pg-kill-pg-killall

To terminate all running queries:

SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE state = 'active';

给你