pg_cancel_backend
和 pg_terminate_backend
函数
当你从 pg_stat_activity 确认了一个慢查询的时候,你可以获取这个慢查询所在的 pid。然后,你就可以使用 pg_cancel_backend
或者 pg_terminate_backend
来终止这个慢查询。这两个函数的使用方法如下:
这两个函数的参数都是 pid,返回值是 true 或者 false,表示向进程发送信号是否成功。
这两个函数的区别如下:pg_cancel_backend
是终止当前这次的查询,连接依旧被保持,其发送的是 SIGINT 信号。pg_terminate_backend
会终止连接,其发送的是 SIGTERM 信号。
示例
我们可以构造一个例子来看一下他们的区别。这个例子需要启用三个 psql,分别命名为 A, B, Manage。
psql A 中执行如下语句,启动一个事务,然后锁住一些行:
此时,因为还没有提交事务,所以 psql A 锁住了这一行。
psql B 执行如下语句:
然后该查询就会挂起等待。
可以通过 psql Manage 来查询:
其中 pid 为 37159 的连接所执行的查询,正在等待锁。这个时候我们就可以用 pg_cancel_backend
来取消这次查询:
此时,在 psql B中,可以看到:
此时,在 psql Manage 中查看 pg_stat_activity
可以看到 psql B 的连接还在,pid 不变,但是连接已经处于 idle 状态:
接下来来测试另外一个函数,同样在 psql B 中执行如下语句来触发挂起:
然后,在 psql Manage 中执行:
在 psql B 中可以看到:
表明,连接已经断开了。此时,再次查看 pg_stat_activity
可以发现 pid 已经变了,变成了 39248: