Heroku Postgres – 终止挂起查询(闲置交易)

我用Crane Postgres选项使用Heroku,当我的本地机器崩溃时,我从本地机器上运行数据库查询。 如果我跑

select * from pg_stat_activity 

其中一个条目有

 <IDLE> in transaction 

在current_query_text列中。

因此,我不能删除被终止的查询写入的表。 我曾尝试使用pg_cancel_backend(N),它返回True,但似乎没有发生。

我怎样才能终止这个过程,以便我可以放弃这个表?

这是一个普遍的答案,并不特定于heroku。 一般来说,取消查询可能需要用户拥有超级用户访问权限,无论是postgres服务器还是postgres数据库 – 看起来像一个普通用户不会要求他的DBA或系统pipe理员寻求帮助


通过运行这个SQL查找PID:

 SELECT procpid,* from pg_stat_activity WHERE current_query<>'<IDLE>' ORDER BY xact_start; 

您会在第一个(左)列中findprocpid,第一个(顶部)行可能是您想要终止的查询。 我会假设pid是1234以下。

你可以通过SQL取消查询(即没有shell访问,但是你可能需要超级用户访问数据库):

 select pg_cancel_backend(1234); 

这是“软”的方式…查询不会立即消失。 如果你很急,试试这个:

 select pg_terminate_backend(1234); 

如果你有shell访问权限,你也可以从shell执行它:

 kill -INT 1234 

如果没有帮助,请使用:

 kill 1234 

不要:

 kill -9 1234 

…这往往会导致整个postgres服务器火热,那么你可以重新启动postgres。 Postgres非常强大,所以数据不会被破坏,但是我build议不要在任何情况下使用“kill -9”;-)


“闲置在事务中”意味着事务没有以“提交”或“回滚”而终止,这意味着应用程序有问题或者没有正确devise用于事务数据库。 应该避免长时间的“闲置交易”,因为这也会造成重大的性能问题。

尝试这个:

 select pg_terminate_backend(pid int) 

更多关于这个你可以在这里find。 这应该是比通过系统查杀过程更“清洁”的解决scheme。

您可以安装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