1. 程式人生 > >pg資料庫殺掉連線

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