Hi,大家好!我是白日梦。
今天我要跟你分享的话题是:“聊聊什么是慢查、如何监控?如何排查?”
一、 推荐阅读方式
首发地址:https://mp.weixin.qq.com/s/tXTLMCiVpEnnmhUclYR19Q
使用推荐阅读,有更好的阅读体验
二、什么是慢查?
慢查,顾名思义就是很慢的查询。SQL的执行总是有一个执行时间的,通过long_query_time
参数告诉MySQL,当SQL的执行时间超过该参数的指定值后就将这条SQL记录在慢查日志中。
默认的long_query_time
默认值为10s
三、怎么调整界定慢查的时间?
设置全局慢查时间为0.2秒。
注意:long_query_time属于dynamic类型的参数。意思是像上面这样在会话A中通过命令行的方式设置全局 long_query_time为0.2秒后,再打开一个新的会话B查看该变量会发现 long_query_time=0.2
但是在会话A中查看session级别的long_query_time依然为默认的10s
四、慢查日志像binlog那样是真实的日志文件吗?
在MySQL5.1之前确实慢查日志确实是以文件的形式存在。但是MySQL5.1之后MySQL允许我们可以将慢查日志放入一个数据表中,便于我们查看分析。
现在公司使用的一般都是5.6~5.7版本。当然即使5.1版本之后支持了将数据放入Table中,默认配置依然是File。
当然你也可以通过下面的命令将慢查输出类型改成Table
五、慢查有什么危害?
研发同学都知道:对于Linux操作系统来说,一个进程能打开的Socket文件句柄是上限的。即使我们可以动态的调整它的大小,但是也做不到无限大。
通过命令: 查看进程被限制的使用各种资源的量
Copyulimit -a
core file size: 进程崩溃是转储文件大小限制
man loaded memort 最大锁定内存大小
open file 能打开的文件句柄数
大量的慢查占据MySQL连接(Linux操作系统会为每一条连接创建socket文件),慢查累积到一定程度还会导致正常的SQL得不到连接执行从而变成慢查SQL,最终有可能导致MySQL的连接全部被耗光而夯死。这就是生产级别的事故了。
六、如何监控慢查?
查看曾经执行完成的慢查
如果你需要编写一个监控程序探测MySQL的慢查询。那完全可以探测分析MySQL的slow.log
如果你还不知道slow.log在哪里,可以像下面这样定位到它。slow.log中记录的就是曾经执行过的慢查信息。
这是你可以尝试使用select sleep(2);
模拟一条慢查SQL
然后去慢查sql中查看具体的慢查详情。
查看正在进行的慢查SQL
我在A Session中发起SQL,select sleep(60);
然后在B Session中通过下图的方式可以看到当前正在进行的慢查情况。大家在看的时候注意:Command的类型为Query
MySQL也为用户提供了一些原生的慢查工具。比如:查看执行时间最长的10条SQL
mysqldumpslow -s a1 -n 10 mysql.slow_log
了解即可
七、线上出慢查了如何处理?
首先你得知道通常情况下每个公司都有自己监控系统,或者是监控脚本,具体的监控逻辑就是上节讲述的思路。故一旦出现报警,DBA同学会在第一时间接到消息。
DBA同学一般都会去联系业务同学,由业务同学去处理这个慢查。(相信已经工作的同学深有这个体会)
(更多内容欢迎关注白日梦的公众号阅读)
关注我看更多内容,每早推送,可以在地铁、班车上、上班前阅读! ......
查看MySQL专题110篇文章大纲:https://mp.weixin.qq.com/s/HTw-Z-SyprYA8bCBZ4NpGQ
参考:https://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html
八、关注我
为大家带来MySQL面试专题!本文是第二篇、全文110篇!
以问答的方式,由浅入深的帮你应对各类MySQL面试题的狂轰滥炸!当然也不乏会分享一些高阶读写分离数据库中间件原理及落地的技术实现,为你揭开数据库中间件神秘的面纱!
面试官都关注了!你还在犹豫什么呢?