pg数据库杀掉连接

Posted xiaotengyi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pg数据库杀掉连接相关的知识,希望对你有一定的参考价值。

遇到异常连接时,需要将对应连接杀掉,可能是连接占用了过多CPU或是IO,影响了业务,或是时间过长的空闲事务.

pg对于杀掉连接提供了专门的命令,一般情况下使用pg_cancel_backend就可以,不过操作取消不掉,可以使用pg_terminate_backend,如果pg_terminate_backend命令,仍然无法将连接杀掉,此时可以使用tcpkill,将连接的网络通信连接直接杀掉。

有时候,出现使用pg_terminate_backend也杀不掉的连接,通常是网络的问题,诸如misrouted packets,retransmissions,blocked sockets,timeouts,stalls此类的网络问题,都在等待客户端和pg通信的中断。

有时候网络的socket会处于这种状态:当pg做写操作时,被中断了。

在这种状态中,pg等待着来自客户端的回复,来确认客户端已收到数据,或是经由操作系统将该网络连接标记为损坏的,中断的。如果这些没有发生,那么pg就会一直等待直到收到客户端中断的命令。

此时可以使用tcpkill中断网络连接,然后操作系统就会关闭network socket,这样pg的连接也就自动退出了。

命令如下:

tcpkill -i eth0 -9 port client_port

-i: 指定数据库使用的是哪个network interface
client_port: 连接数据库连接的客户端端口

执行后,输出下面的信息后,可确认执行完成:

[[email protected] ~]# tcpkill -i eth0 -9 port 60988
tcpkill: listening on eth0 [port 60988]
172.16.3.94:60988 > 172.16.3.95:1921: R 1241262920:1241262920(0) win 0
172.16.3.94:60988 > 172.16.3.95:1921: R 1241263157:1241263157(0) win 0
172.16.3.94:60988 > 172.16.3.95:1921: R 1241263631:1241263631(0) win 0
172.16.3.94:60988 > 172.16.3.95:1921: R 1241264342:1241264342(0) win 0
172.16.3.94:60988 > 172.16.3.95:1921: R 1241265290:1241265290(0) win 0
172.16.3.94:60988 > 172.16.3.95:1921: R 1241266475:1241266475(0) win 0
172.16.3.94:60988 > 172.16.3.95:1921: R 1241267897:1241267897(0) win 0
172.16.3.94:60988 > 172.16.3.95:1921: R 1241269556:1241269556(0) win 0
172.16.3.94:60988 > 172.16.3.95:1921: R 1241271452:1241271452(0) win 0
172.16.3.95:1921 > 172.16.3.94:60988: R 4254183996:4254183996(0) win 0
172.16.3.95:1921 > 172.16.3.94:60988: R 4254184253:4254184253(0) win 0
172.16.3.95:1921 > 172.16.3.94:60988: R 4254184767:4254184767(0) win 0
172.16.3.95:1921 > 172.16.3.94:60988: R 4254185538:4254185538(0) win 0
172.16.3.95:1921 > 172.16.3.94:60988: R 4254186566:4254186566(0) win 0
172.16.3.95:1921 > 172.16.3.94:60988: R 4254187851:4254187851(0) win 0

这个命令执行完成,有时可能需要几分钟,所以要耐心等待一下。

tcpkill命令是网络嗅探工具包dsniff中的一个工具,如果要使用tcpkill,要先安装好dsniff。

使用源码安装不太容易,常报错,推荐使用yum安装,这里使用的是阿里云的yum源。

这个文件的安装走的是epel.repo部分。

 wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
 yum clean all
 yum makecache

以上是关于pg数据库杀掉连接的主要内容,如果未能解决你的问题,请参考以下文章

如何迅速杀掉数据库里inactive的会话

MySQL 循环执行kill语句杀掉连接

sequelize 和 pg 共享一个数据库连接池

来自python的pg8000 postgres连接问题

启动应用程序时使用 pg-promise 验证数据库连接

MySQL大招---循环执行kill语句杀掉连接