遇到異常鏈接時,須要將對應鏈接殺掉,多是鏈接佔用了過多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
有時候網絡的socket會處於這種狀態:當pg作寫操做時,被中斷了。tcp
在這種狀態中,pg等待着來自客戶端的回覆,來確認客戶端已收到數據,或是經由操做系統將該網絡鏈接標記爲損壞的,中斷的。若是這些沒有發生,那麼pg就會一直等待直到收到客戶端中斷的命令。工具
此時能夠使用tcpkill中斷網絡鏈接,而後操做系統就會關閉network socket,這樣pg的鏈接也就自動退出了。阿里雲
命令以下:操作系統
tcpkill -i eth0 -9 port client_port
-i: 指定數據庫使用的是哪一個network interface
client_port: 鏈接數據庫鏈接的客戶端端口code
執行後,輸出下面的信息後,可確認執行完成:事務
[root@pg2 ~]# 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
這個命令執行完成,有時可能須要幾分鐘,因此要耐心等待一下。get
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