mysql too many connections問題,kill掉所有鎖表進程

說明:
因爲線上mysql實例太多,也就經常會遇到Too many connections的問題。出現這種問題的時候業務已經出現問題。此時最重要的還是先恢復業務。這裏可以先獲取show innodb status和show full processlist的信息以便等會分析原因。當然要先能連得進mysql。可以通過臨時將連接數稍微調大,讓自己能登陸上去,一般這種情況下登陸的時候也會出現Too many connections的提示,那麼該如何做呢?這時候可以在主上面寫一個死循環不停的連接主mysql以保證自己能正常登錄,如:while true;do mysql -uroot -ppassword -S /tmp/mysql_3306.sock;done

實現:
1.手動清除鎖表進程
mysql> show processlist; //進到mysql後,可以看到一大堆sleep進程沒有一千也有幾百條,而且時間都很長。
| 106089637 | test | 192.168.2.8:44449 | TEST | Lock | 134 |
| 106089638 | test | 192.168.2.8:44451 | TEST | Lock | 4123 |
……
出來好幾屏幕的, , 查詢語句把表鎖住了,.
mysql> kill thread_id; // kill掉第一個鎖表進程, 依然沒有改善. 既然不改善, 咱們就想辦法將所有鎖表的進程kill掉吧, 簡單的腳本如下.

2.shell腳本批量清除鎖表進程

#!/bin/bash
mysql -uroot -e "show processlist" | grep -i "Locked" >> locked_log.txt

for line in `cat locked_log.txt | awk '{print $1}'`
do 
echo "kill $line;" >> kill_thread_id.sql
done
現在kill_thread_id.sql的內容像這個樣子
kill 66402982;
kill 66402983;
kill 66402986;
kill 66402991;
…..

好了, 我們在mysql的shell中執行, 就可以把所有鎖表的進程殺死了.
mysql> source kill_thread_id.sql

當然了, 也可以一行搞定

#!/bin/bash
for id in `mysqladmin processlist | grep -i locked | awk '{print $1}'`
do
mysqladmin kill ${id}
done
附錄:
當然,可以通過限制用戶連接mysql的連接數也可以一直程度上緩存mysql實例多導致的鎖表多問題。
# mysql -uroot -p
mysql> grant all on username.*to’databasename’@’localhost’ with MAX_USER_CONNECTIONS 4 MAX_CONNECTIONS_PER_HOUR 1000;  //WITH MAX_USER_CONNECTIONS 4,限制最大連接數;MAX_CONNECTIONS_PER_HOUR 1000,限制每小時最大連接數
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章