Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql Heroku Postgres-终止挂起查询(事务中空闲)_Postgresql_Heroku - Fatal编程技术网

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

Postgresql Heroku Postgres-终止挂起查询(事务中空闲),postgresql,heroku,Postgresql,Heroku,我正在使用带有Crane Postgres选项的Heroku,当本地机器崩溃时,我正在本地机器上运行一个数据库查询。如果我跑 select * from pg_stat_activity 其中一个条目已被删除 <IDLE> in transaction 事务中的 在“当前查询”文本列中 因此,我无法删除被终止的查询正在写入的表。我尝试过使用pg_cancel_backend(N),它返回True,但似乎什么也没发生 我怎样才能终止这个过程,这样我就可以删除这个表了?这是一个一般

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

select * from pg_stat_activity
其中一个条目已被删除

<IDLE> in transaction
事务中的

在“当前查询”文本列中

因此,我无法删除被终止的查询正在写入的表。我尝试过使用pg_cancel_backend(N),它返回True,但似乎什么也没发生

我怎样才能终止这个过程,这样我就可以删除这个表了?

这是一个一般的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);
如果您具有shell访问权限和root或postgres权限,您也可以从shell中执行此操作。要“取消”,可以执行以下操作:

kill -INT 1234
以及“终止”,简单地说:

不要:

kill -9 1234
。。。这通常会导致整个postgres服务器崩溃,然后您也可以重新启动postgres。Postgres非常健壮,因此数据不会被破坏,但我建议在任何情况下都不要使用“kill-9:-)


持久的“事务中空闲”通常意味着事务没有通过“提交”或“回滚”终止,这意味着应用程序有缺陷,或者没有正确设计以使用事务数据库。应避免长时间的“事务中空闲”,因为它也会导致严重的性能问题。

尝试以下方法:

select pg_terminate_backend(pid int)
你可以找到更多关于这个的信息。这应该是比按系统终止进程更“干净”的解决方案。

您可以安装附加组件并运行以下命令以获得PID:

heroku pg:locks --app <your-app>
heroku pg:锁--应用程序 那么就做:

heroku pg:kill <pid> --app <your-app> 
heroku pg:kill--app 注意
--force
选项可用于发出pg_terminate_后端,该后端会断开该查询的整个连接

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

有关更多信息,请查看:

我们可以使用以下方法在单个查询中实现:

SELECT pg_cancel_backend(pid), pg_terminate_backend(pid) FROM pg_stat_activity WHERE state != 'idle';

我试过pg_cancel_后端,但没用。我没有shell访问权限,而且我不是超级用户,所以我无法使用pg_terminate_backend发送SIGKILL您使用的是哪个版本的postgres?(提示:
选择版本()
)。使用
pg_cancel_backend
时是否收到任何错误消息?我自己尝试使用pg_cancel_backend,因此收到错误消息“必须是超级用户才能向其他服务器进程发出信号”。。。这意味着显然您需要在服务器上进行root访问,或者通过某个postgres超级用户(即postgres用户)进行db访问,以终止您自己的查询。这似乎有点糟糕:-(结果是进程被pg_cancel_后端取消了,但查询仍然会在pg_stat_活动中显示一段时间,这是特定于Heroku的。据我所知,在普通postgres下,确实需要超级用户才能杀死卡住的进程(我正在使用“select pg_sleep(3600)”进行测试)在第8.4页,我得到了“错误:必须是超级用户才能向其他服务器进程发出信号”)。不过,同样的,“事务中空闲”也不完全相同。也许问题应该改为“当既没有根用户访问postgres服务器,也没有超级用户访问数据库时,如何终止我自己的查询”。这似乎确实是一个很好的问题…我不知道答案。谢谢。我仍然无法终止事务/PID…但我的计算机在导入期间硬件冻结,我无法终止PID。:(请添加如何将您的pid添加到您的答案中,这将终止所有正在运行的查询,然后您也可以重新启动postgres。按xact_开始和限制1排序,我可以同意……但是,我还是希望在盲目终止之前查看列表。这是怎么回事?
选择pid,pg_取消_后端(pid)从pg_stat_activity,其中state!=“idle”和(now()-query_start)>间隔“5分钟”;
SELECT pg_cancel_backend(pid), pg_terminate_backend(pid) FROM pg_stat_activity WHERE state != 'idle';