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