Heroku Postgres - 终止挂起查询(在事务中空闲)

ala*_*lan 93 postgresql heroku

我正在使用Heroku和Crane Postgres选项,当我的本地计算机崩溃时,我正从本地计算机上运行数据库查询.如果我跑

select * from pg_stat_activity
Run Code Online (Sandbox Code Playgroud)

其中一个条目有

<IDLE> in transaction
Run Code Online (Sandbox Code Playgroud)

在current_query_text列中.

因此,我无法删除被终止的查询写入的表.我尝试过使用pg_cancel_backend(N)并返回True,但似乎没有任何事情发生.

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

tob*_*xen 129

这是Postgres的一般答案,并非特定于heroku


通过运行此sql找到PID:

SELECT pid , query, * from pg_stat_activity
  WHERE state != 'idle' ORDER BY xact_start;
Run Code Online (Sandbox Code Playgroud)

(旧版本的Postgres使用procpid而不是pid).您将在第一个(左侧)列中找到pid,第一个(顶部)行可能是您要终止的查询.我假设pid是1234以下.

您可以通过SQL取消查询(即无需shell访问),只要它是您的或您具有超级用户访问权限:

select pg_cancel_backend(1234);
Run Code Online (Sandbox Code Playgroud)

这是"软"方式......查询不会立即消失.如果你赶时间,试试这个:

select pg_terminate_backend(1234);
Run Code Online (Sandbox Code Playgroud)

如果您具有shell访问权限以及root或postgres权限,则还可以从shell执行此操作:

kill -INT 1234
Run Code Online (Sandbox Code Playgroud)

如果这没有帮助,请使用:

kill 1234
Run Code Online (Sandbox Code Playgroud)

不要:

kill -9 1234
Run Code Online (Sandbox Code Playgroud)

...这通常会导致整个postgres服务器火上浇油,然后你也可以重新启动postgres.Postgres非常强大,因此数据不会被破坏,但我建议不要在任何情况下使用"kill -9";-)


持久的"事务中空闲"通常意味着事务没有以"提交"或"回滚"终止,这意味着应用程序存在错误或未正确设计以使用事务数据库.应该避免持久的"交易闲置",因为它也会导致严重的性能问题.


小智 36

试试这个:

select pg_terminate_backend(pid int)
Run Code Online (Sandbox Code Playgroud)

更多关于这一点,你可以找到这里.这应该是解决这个问题的"更清洁",而不是系统杀死进程.


dav*_*sco 19

您可以安装heroku-pg-extras附加组件并运行以下命令来获取PID:

heroku pg:locks --app <your-app>
Run Code Online (Sandbox Code Playgroud)

然后就做:

heroku pg:kill <pid> --app <your-app> 
Run Code Online (Sandbox Code Playgroud)

注意:--forceoption可用于发出pg_terminate_backend,它会丢弃该查询的整个连接.

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

有关更多信息,请访问:https:
//devcenter.heroku.com/articles/heroku-postgresql#pg-ps-pg-kill-pg-killall