加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

Mysql应用一次MySQL慢查询导致的故障

发布时间:2020-12-12 01:24:13 所属栏目:MySql教程 来源:网络整理
导读:《Mysql应用一次MySQL慢查询导致的故障》要点: 本文介绍了Mysql应用一次MySQL慢查询导致的故障,希望对您有用。如果有疑问,可以联系我们。 我们知道分析MySQL语句查询性能的方法除了使用EXPLAIN 输出执行计划,还可以让MySQL记录下查询超过指定时间的语句,

《Mysql应用一次MySQL慢查询导致的故障》要点:
本文介绍了Mysql应用一次MySQL慢查询导致的故障,希望对您有用。如果有疑问,可以联系我们。

我们知道分析MySQL语句查询性能的方法除了使用EXPLAIN 输出执行计划,还可以让MySQL记录下查询超过指定时间的语句,我们将超过指定时间的SQL语句查询称为“慢查询”.MYSQL实例

一、?起因
研发反应某台数据库僵死,后面的会话要么连接不上,要么要花费大量的时间返回结果,哪怕是一个简单的查询.MYSQL实例

二、?处理
首先去监控平台查看服务器以及数据库状态,发现这台数据库有大量的慢查询.继续看服务器监控,CPU 平均使用率较高,IO 读写平均值正常.登录到 MySQL,使用 SHOW PROCESSLIST 查看会话状态,总数居然有 600+,这是很不正常的.查看慢查询日志,发现出问题的 SQL 主要集中在几个,有 SUM、有 COUNT、有等值操作等等.这台 MySQL 服务器的 long_query_time 设置为 3秒,而一个简单的查询却要几十秒,这显然是有问题的.写脚本试着 kill 掉相关的会话,发现于事无补,仍然有大量的连接进来.此时使用 top 查看服务器状态,mysqld 进程占用内存和 CPU 居高不下.MYSQL实例

故障期间的慢查询数,如图:MYSQL实例

MYSQL实例

CPU 平均使用率,如图:MYSQL实例

MYSQL实例

接着使用 SHOW FULL PROCESSLIST 查看完整状态,在最上面居然发现几条 SQL.这些 SQL 操作使用子查询实现,TIME 列居然达到了 30000 秒,折算过来差不多 10 小时.EXPLAIN 这些语句,居然出现了 USING TEMPORY 和 USING FILESORT,可以看出这些语句是很糟糕的.于是跟开发确认,紧急把这些会话 kill 掉.稍等片刻,会话数立马降下来,只有 100+,top 查看 mysqld 进程,内存和 CPU 都呈现下降的趋势.接着分析开发说上午 9 时写了这些 SQL,发现有问题,注释掉了.新的代码虽然没有此类 SQL,但之前建立的连接并不会释放.解决问题和出现问题的时间差刚好可以和添加子查询的时间对应,就可以确认子查询是此次故障的罪魁祸首.MYSQL实例

三、?总结
通过这个故障,总结如下几点:MYSQL实例

  • MySQL 应该尽量避免使用子查询,即使使用,也要搞清楚大表和小表的关系;
  • 出现这类问题的排查步骤

第一,查看服务器监控和 MySQL 监控,分析服务器以及 MySQL 性能,找出异常;
第二,如果是慢查询导致,查看慢查询日志,找出出现问题的 SQL,试着优化,或者把结果缓存;
第三,分清主次,先解决大块问题,后解决细小问题. 把大块的异常解决,小问题就迎刃而解了.比如本文中的例子,把耗费时间长的会话 kill 掉后,后面的连接就正常了;
第四,总结分析.MYSQL实例

  • 高效的沟通会事半功倍;
  • DBA 需要定期给出 Top N SQL(类 Oracle 的说法),提供给开发,并协助优化;
  • 查看监控时,不管是服务器监控还是 MySQL 监控,需要做对比,比如和昨天甚至前天的同一时间对比,这会更加快速地定位问题.

四、?技巧
最后,附上一个快速kill 掉 MySQL 会话的方法:MYSQL实例

首先使用如下语句分析出有问题的 SQL:MYSQL实例

/usr/local/mysql/bin/mysql -uroot -p'XXX' -e "SHOW FULL PROCESSLIST;" | moreMYSQL实例

然后将 SHOW FULL PROCESSLIST 的结果保存到一个文件:MYSQL实例

/usr/local/mysql/bin/mysql -uroot -p'XXX'
-e "SHOW FULL PROCESSLIST;" |
grep "XXX" | awk '{print $1}' > mysql_slow.txt
MYSQL实例

最后使用如下简单的 Shell 脚本 kill 掉相关会话:MYSQL实例

SELECT concat('kill ',id,';')
FROM information_schema.processlist
WHERE info like 'XXX';

当然也可以使用如下 SQL 拼接 kill 语句:
MYSQL实例

SELECT concat('kill ',';')
FROM information_schema.processlist
WHERE info like 'XXX';

本文对MySQL慢查询导致故障的起因,处理方法,所需的技巧进行了全面分析,希望可以让大家更好的了解MySQL慢查询,对大家的.MYSQL实例

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读