本文實例講述了MYSQL鎖表問題的解決方法。,具體如下:
很多時候!一不小心就鎖表!這里講解決鎖表終極方法!
案例一
| mysql>show processlist; |
參看sql語句
一般少的話
| mysql>kill thread_id; |
就可以解決了
kill掉第一個鎖表的進程, 依然沒有改善. 既然不改善, 咱們就想辦法將所有鎖表的進程kill掉吧, 簡單的腳本如下.
| #!/bin/bashmysql - u root - e " show processlist " | grep - i " Locked " >> locked_log . txtfor line in ` cat locked_log.txt | awk '{print $1 }' `doecho " kill $line ; " >> kill_thread_id . sqldone |
現在kill_thread_id.sql的內容像這個樣子
| kill 66402982 ;kill 66402983 ;kill 66402986 ;kill 66402991 ;..... |
好了, 我們在mysql的shell中執行, 就可以把所有鎖表的進程殺死了.
| mysql > source kill_thread_id . sql |
當然了, 也可以一行搞定
| for id in `mysqladmin processlist | grep -i locked | awk '{print $1}'`domysqladmin kill ${id}done |
案例二
如果大批量的操作能夠通過一系列的select語句產生,那么理論上就能對這些結果批量處理。
但是mysql并沒用提供eval這樣的對結果集進行分析操作的功能。所以只能現將select結果保存到臨時文件中,然后再執行臨時文件中的指令。
具體過程如下:
| mysql> SELECT concat('KILL ',id,';') FROM information_schema.processlist WHERE user='root';+------------------------+| concat('KILL ',id,';')+------------------------+| KILL 3101; | KILL 2946; +------------------------+2 rows IN SET (0.00 sec)mysql> SELECT concat('KILL ',id,';') FROM information_schema.processlist WHERE user='root' INTO OUTFILE '/tmp/a.txt';Query OK, 2 rows affected (0.00 sec)mysql> source /tmp/a.txt;Query OK, 0 rows affected (0.00 sec) |
案例三
MySQL + PHP的模式在大并發壓力下經常會導致MySQL中存在大量僵死進程,導致服務掛死。為了自動干掉這些進程,弄了個腳本,放在服務器后臺通過crontab自動執行。發現這樣做了以后,的確很好的緩解了這個問題。把這個腳本發出來和大家Share.
根據自己的實際需要,做了一些修改:
SHELL腳本:mysqld_kill_sleep.sh
| #!/bin/shmysql_pwd="root的密碼"mysqladmin_exec="/usr/local/bin/mysqladmin"mysql_exec="/usr/local/bin/mysql"mysql_timeout_dir="/tmp"mysql_timeout_log="$mysql_timeout_dir/mysql_timeout.log"mysql_kill_timeout_sh="$mysql_timeout_dir/mysql_kill_timeout.sh"mysql_kill_timeout_log="$mysql_timeout_dir/mysql_kill_timeout.log"$mysqladmin_exec -uroot -p"$mysql_pwd" processlist | awk '{ print $12 , $2 ,$4}' | grep -v Time | grep -v '|' | sort -rn > $mysql_timeout_logawk '{if($1>30 && $3!="root") print "'""$mysql_exec""' -e " "/"" "kill",$2 "/"" " -uroot " "-p""/"""'""$mysql_pwd""'""/"" ";" }' $mysql_timeout_log > $mysql_kill_timeout_shecho "check start ...." >> $mysql_kill_timeout_logecho `date` >> $mysql_kill_timeout_logcat $mysql_kill_timeout_sh |