MySQL資料庫出現慢查詢的危害
1、MySQL資料庫當出現慢查詢,是比較危險的,一旦有其他的DDL操作,可能會造成整個資料庫的等待
可以分以下幾種情況:
當表是MyiSAM表,對錶有慢查詢,不阻塞Select,對該表的其他DML,DDL操作都會被阻塞,比如出現Wating for table level lock,資料庫中一定不能還存在MyiSAM表
當表是Innodb表,當表上有慢查詢,不阻塞Select 和DML,其他的DDL操作都會被阻塞,比如出現waiting for table metadata lock
綜上,當資料庫中存在慢查詢時,是比較危險的,當執行備份,create index ,alter table , flush table 等操作時就會造成資料庫的等待
解決辦法:
1、對資料庫中執行時間較長的Select進行監控,並及時警示
2、如果允許的話,寫指令碼,發現較長的select語句,直接kill,並記錄日誌中
-B, --batch Don't use history file. Disable interactive behavior.
-s, --silent Be more silent. Print results with a tab as separator,each row on new line.
-e, --execute=name Execute command and quit. (Disables --force and historyfile.)
#如果資料庫中當前有大量的select,可以過濾掉,只kill waiting的
cat killWaitSession.sh
#!/bin/bash
for i in `mysql -Bse 'show full processlist' | grep -i select |grep -i "Waiting | awk '{print $1}'`
do
mysql -Bse "kill $i"
done
show processlist的command的狀態有很多,其中Query代表正在執行的命令
Query : The thread is executing a statement.
cat killLongQuerySession.sh
#!/bin/bash
executetime=(`mysql -Bse 'show processlist'| grep 'Query'|awk '{print $6 " " $1}'|sort -rn|head -1`) #第6列是已耗用時間,第一列為session id
time=${executetime[0]}
id=${executetime[1]}
while :
do
maxtime=300
if [ $time -gt $maxtime ] ; then
echo $time $id >> /tmp/killqueryid.log
mysql -Bse "kill $id"
#else
# echo $time $id
fi
sleep 10 #睡眠10s
done
本文永久更新連結地址:https://www.bkjia.com/Linux/2018-03/151304.htm