ITPub博客

首页 > 数据库 > MySQL > MySQL数据库出现慢查询的危害!

MySQL数据库出现慢查询的危害!

原创 MySQL 作者:熊猫咪咪 时间:2019-07-27 18:24:13 0 删除 编辑

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

fisleep 10 #睡眠10s

done

按MySQL中执行时间反向排序

mysqladmin processlist --verbose |grep 'Query'|awk -F "|" '{print $7 $2 $9}'|sort -rn -k1


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69937474/viewspace-2651982/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2019-07-27

  • 博文量
    8
  • 访问量
    2534