首先,我运行此查询以查看正在运行的查询:
select * from pg_stat_activity;
然后我运行此查询来阻止它们:
SELECT pg_cancel_backend(pid);
但是,当我再次运行pg_stat_activity时,它仍会显示所有查询!
为什么它没有杀死查询?
答案 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 -9
(SIGKILL
)PostgreSQL后端(postgres
进程)。它将导致整个PostgreSQL服务器紧急重启,以保护共享内存的安全。