今天碰到一個特別詭異的問題,phpmyadmin登入之後有一個資料表一點就一直停在loading的畫面,但是上線中的機器又不能直接給他重啟,登入SSH下一個優化指令mysqlcheck -u root -p -oA --auto-repair
居然直接給他整個停住 ?
不死心再開一個SSH連線去MYSQLDUMP那個資料庫出來也是整個停住,但是除了這個資料庫之外其他都正常,WTF?!我的天,這是啥鬼情形啊… ?
後來經提醒後下指令檢查mysqladmin -u root -p processlist
才發現佔用MySQL的線程居然多到靠北 ? 一堆佔著矛坑不拉屎是哪招,動用大絕招終止運作太久的MySQL進程
1 |
mysql -e "show processlist" | awk '{ $6 = $6 +1; if ($6 >= 60 && $5 == "Query") system("mysqladmin kill "$1); print strftime("%c") "] query Killed. [Account: "$2"] [Database: "$4"] [query Runtime: "$6" seconds]"; }' >> /var/log/kill_mysql_proc.log |
再放上一個腳本交給crontab兄弟處理每日2點自動優化一次資料庫然後終止超時的MySQL進程,記得把OOXXOOXX改成MySQL的root密碼
OOXXOOXX0 2 * * * mysqlcheck -u root -p
-oA --auto-repair > /dev/null 2>&1
20 2 * * * sh /root/kill_mysql_maxtime.sh > /dev/null 2>&1
腳本內容如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#!/bin/bash ############### 你要修改的地方從這裡開始 ############### DB_HOST="localhost" DB_PORT=3306 DB_USER="root" DB_PASS="OOXXOOXX" maxtime="30" ############### 你要修改的地方從這裡結束 ############### # sql="SHOW PROCESSLIST" sss=$(/usr/bin/mysqladmin processlist|sed -e "s/s//g"|awk -F'|' '{print $2,$7,substr($9,1,6)}'|awk '{if($2>'"$maxtime"' && $3=="SELECT"){print $1}}') for pid in $(echo "$sss"); do /usr/bin/mysql -h$DB_HOST -P$DB_PORT -u$DB_USER -p$DB_PASS -e "kill $pid" done echo "$sss" date |
就這樣就搞定啦,一切又恢復正常,但出現這種問題也說明要來微調一下my.cnf了 ?