我使用Heroku与Crane Postgres选项,我在我的本地机器上运行一个查询数据库,当我的本地机器崩溃。如果我跑
select * from pg_stat_activity
其中一个条目
<IDLE> in transaction
在current_query_text列中。
因此,我不能删除被终止的查询正在写入的表。我试过使用pg_cancel_backend(N),它返回True,但似乎没有发生。
如何终止此过程,以便我可以删除表?
更新:这个答案可能要求用户有超级用户访问,到postgres服务器或postgres数据库 – 所以它仍然是一个剩下的问题:有任何方式一个普通用户可以杀死自己的查询过程,除非要求他的DBA或sysadmin的帮助?
原文链接:https://www.f2er.com/postgresql/193670.html通过运行此sql查找PID:
select procpid,* from pg_stat_activity where current_query<>'<IDLE>' order by xact_start;
您会在第一个(左侧)列中找到procpid,第一个(上)行很可能是您要终止的查询。我会假设pid是1234以下。
您可以通过sql取消查询(即没有shell访问,但您可能需要超级用户访问数据库):
select pg_cancel_backend(1234);
这是“软”的方式…查询不会立即消失。如果你很匆忙,试试这个:
select pg_terminate_backend(1234);
如果你有shell访问,你也可以从shell:
kill 1234
这对我来说总是有效的,但我已经读过某个地方,正确的方法是:
kill -INT 1234
不要:
kill -9 1234
…这将导致整个postgres服务器在火焰中下降。 Postgres是相当鲁棒的,所以除了没有什么真的不好应该发生,但我建议不要使用“kill -9”在任何情况下;-)
“事务中空闲”意味着事务没有以“提交”或“回滚”终止,这意味着应用程序有错误或未正确设计为与事务数据库一起工作。应避免持久的“空闲事务”,因为它也可能导致主要的性能问题。