如何在PostqreSQL中停止运行查询?

时间:2017-01-01 02:43:13

标签: sql postgresql

首先,我运行此查询以查看正在运行的查询:

select * from pg_stat_activity;

然后我运行此查询来阻止它们:

SELECT pg_cancel_backend(pid);

但是,当我再次运行pg_stat_activity时,它仍会显示所有查询!

为什么它没有杀死查询?

2 个答案:

答案 0 :(得分:0)

我应该使用pg_terminate_backend(pid)而不是pg_cancel_backend(pid)。

答案 1 :(得分:0)

许多可能的解释:

  • 您没有查看活动查询,查询文本只是在当前空闲的后台运行的最后一个查询。在这种情况下,pg_cancel_backend将不执行任何操作,因为没有任何内容可以取消。查看state中的pg_stat_activity字段。

  • 活动查询在扩展代码中运行,在执行任何操作期​​间都不会CHECK_FOR_INTERRUPTS()。当您运行某些使用自己的库,套接字等执行大量CPU,I / O或网络活动的扩展时,通常会出现这种情况。特别是PL / Perl,PL / Python等等。 / p>

  • 活动查询在PostgreSQL后端代码中运行,该代码在长时间运行的循环或类似循环中不检查中断。这是一个错误;如果你发现这种情况,请报告。

  • 后端卡在等待阻塞的操作系统调用,通常是磁盘I / O或网络套接字写入。在阻塞操作结束之前,它可能无法响应取消消息,但如果它接收到SIGTERM,则其信号处理程序通常会导致它挽救,但并非总是如此。

一般情况下,使用pg_terminate_backend作为更大的锤子是安全的#34;由SIGTERM发送的pg_terminate_backend()通常会(但不总是)导致后端无法响应取消退出。

kill -9SIGKILL)PostgreSQL后端(postgres进程)。它将导致整个PostgreSQL服务器紧急重启,以保护共享内存的安全。