我将Heroku与Crane Postgres选项一起使用,当本地计算机崩溃时,我正在从本地计算机上对数据库运行查询。如果我跑步
select * from pg_stat_activity
其中一项具有
<IDLE> in transaction
在current_query_text列中。
结果,我无法删除已终止查询所写入的表。我试过使用pg_cancel_backend(N),它返回True,但似乎什么也没有发生。
如何终止此过程,以便可以删除表?
我将Heroku与Crane Postgres选项一起使用,当本地计算机崩溃时,我正在从本地计算机上对数据库运行查询。如果我跑步
select * from pg_stat_activity
其中一项具有
<IDLE> in transaction
在current_query_text列中。
结果,我无法删除已终止查询所写入的表。我试过使用pg_cancel_backend(N),它返回True,但似乎什么也没有发生。
如何终止此过程,以便可以删除表?
Answers:
这是Postgres的一般答案,并非特定于heroku
(对这个问题的简单愚蠢的答案可能是……只是重新启动postgresql。假设这是不希望的或不是一个选择……)
通过运行以下sql查找PID:
SELECT pid , query, * from pg_stat_activity
WHERE state != 'idle' ORDER BY xact_start;
(查询可能需要根据postgres的版本进行修改-最终,只需从pg_stat_activity中选择*)。您会在第一列(左)中找到该pid,而第一列(顶部)很可能是您要终止的查询。我假设pid是下面的1234。
您可以通过SQL取消查询(即没有shell访问权限),只要它是您自己的,或者您具有超级用户访问权限即可:
select pg_cancel_backend(1234);
这是取消1234查询的“友好”请求,幸运的是,它会在一段时间后消失。最终,这会更有效:
select pg_terminate_backend(1234);
如果您具有外壳程序访问权限以及root或postgres权限,则也可以从外壳程序执行此操作。要“取消”,可以执行以下操作:
kill -INT 1234
并“终止”,只需:
kill 1234
不要:
kill -9 1234
...这通常会导致整个postgres服务器瘫痪,那么您最好重启postgres。Postgres非常强大,因此数据不会被破坏,但是无论如何我建议不要使用“ kill -9” :-)
持久的“事务中的空闲状态”通常意味着事务没有以“提交”或“回滚”终止,这意味着该应用程序存在错误或未正确设计为可与事务数据库一起使用。应该避免持久的“交易闲置”,因为这也会导致严重的性能问题。
select version()
。使用时是否收到任何错误消息pg_cancel_backend
?
您可以安装heroku-pg-extras
加载项并运行以下命令来获取PID:
heroku pg:locks --app <your-app>
然后做:
heroku pg:kill <pid> --app <your-app>
注意:--force
选项可用于发出pg_terminate_backend,它会删除该查询的整个连接。
如果heroku pg:locks
未列出任何内容,请尝试heroku pg:ps
。
有关更多信息,请查看:https :
//devcenter.heroku.com/articles/heroku-postgresql#pg-ps-pg-kill-pg-killall
我们可以使用以下内容在单个查询中实现:
SELECT pg_cancel_backend(pid), pg_terminate_backend(pid) FROM pg_stat_activity WHERE state != 'idle';
SELECT pid, pg_cancel_backend(pid) FROM pg_stat_activity WHERE state != 'idle' AND (now() - query_start) > interval '5 minutes';