如何在postgresql中停止/终止查询?

And*_*han 132 postgresql

这个问题是postmaster在后台运行你的查询,如何杀死或阻止它?

例如,您的shell或任何前端可能由于网络问题而断开连接,您不能使用ctrl-D来终止它,但后台postmaster仍在运行您的查询.怎么杀了?

And*_*han 345

我所做的是首先检查运行过程是什么

SELECT * FROM pg_stat_activity WHERE state = 'active';
Run Code Online (Sandbox Code Playgroud)

找到要杀死的进程,然后键入:

SELECT pg_cancel_backend(<pid of the process>)
Run Code Online (Sandbox Code Playgroud)

如果该过程无法被杀死,请尝试:

SELECT pg_terminate_backend(<pid of the process>)
Run Code Online (Sandbox Code Playgroud)

  • `pg_cancel_backend`确实有效,但需要一段时间(如果它返回true,就像优雅的清理一样).pg_terminate_backend更像是"硬杀",请参阅/sf/answers/790448851/ (10认同)
  • 要取消除自身之外的所有请求,请使用:`SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE state = 'active' and pid &lt;&gt; pg_backend_pid();` (7认同)
  • 根据[文档](https://www.postgresql.org/docs/current/functions-admin.html#FUNCTIONS-ADMIN-SIGNAL),`pg_cancel_backend`将停止该进程中的当前查询,但是`pg_terminate_backend`将在该过程中完成会话。连接的应用程序可以从失败的查询中恢复,但要从关闭的会话中恢复,需要打开一个新游标。明智地使用两者。 (3认同)
  • 如果这两个都取消不了,还有别的办法吗? (3认同)
  • 通过在https://wiki.postgresql.org/wiki/Lock_Monitoring页面上运行"阻止和阻止活动的隐藏"查询,可以找到阻止pid. (2认同)