MySQL資料庫出現慢查詢的危害

來源:互聯網
上載者:User

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

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.