关闭

关于 MySQL 慢日志,你想知道的都在这

标签: 数据库mysql慢日志查询
1267人阅读 评论(0) 收藏 举报
分类:

作者介绍:邹鹏,现任职于腾讯云数据库团队,负责腾讯云数据库 MySQL 中间件研发,多年的数据库、网络安全研发经验,对云计算平台的网络、计算、存储、安全有着深入的了解,在 MySQL 的高可用、高可靠、中间件方面有丰富的经验。

正文

一、什么是慢日志?

MySQL 的慢查询日志是 MySQL 提供的一种日志记录,它用来记录在 MySQL 中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的 SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10s以上的语句。

默认情况下,MySQL 数据库并不启动慢查询日志,需要我们手动来设置这个参数,当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志或多或少会带来一定的性能影响。慢查询日志支持将日志记录写入文件,也支持将日志记录写入数据库表。

二、什么情况下产生慢日志?

manlog

看图说话,有很多开关影响着慢日志的生成,相关的参数后面会挨个说明。从上图可以看出慢日志输出的内容有两个,第一执行时间过长(大于设置的long_query_time阈值);第二未使用索引,或者未使用最优的索引。

这两种日志默认情况下都没有打开,特别是未使用索引的日志,因为这一类的日志可能会有很多,所以还有个特别的开关log_throttle_queries_not_using_indexes用于限制每分钟输出未使用索引的日志数量。

关键代码如下

sql1

Slow log 调用栈(MySQL 5.6.34 )

sql2

三、慢日志相关参数

canshulong

以上应该是最完整的和慢日志相关的所有参数,大多数参数都有前置条件,所以在使用的时候可以参照上面的流程图。

5.6官方文档:

  1. https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html
  2. https://dev.mysql.com/doc/refman/5.6/en/server-options.html

四、慢日志输出内容

sysout

第一行:标记日志产生的时间,准确说是 SQL 执行完成的时间点,改行记录每一秒只打印一条。

第二行:客户端的账户信息,两个用户名(第一个是授权账户,第二个为登录账户),客户端 IP 地址,还有mysqld的线程 ID。

第三行:查询执行的信息,包括查询时长,锁持有时长,返回客户端的行数,扫描行数。通常我需要优化的就是最后一个内容,尽量减少 SQL 语句扫描的数据行数。

第四行:通过代码看,貌似和第一行的时间没有区别。

第五话:最后就是产生慢查询的 SQL 语句。

--log-short-format=true

如果mysqld启动时指定了--log-short-format参数,则不会输出第一、第二行。

log-queries-not-using-indexes=on   
log_throttle_queries_not_using_indexes > 0 :

如果启用了以上两个参数,每分钟超过log_throttle_queries_not_using_indexes配置的未使用索引的慢日志将会被抑制,被抑制的信息会被汇总,每分钟输出一次。

格式如下

fomat

五、慢日志分析工具

  1. 官方自带工具:`mysqldumpslow
  2. 开源工具:mysqlsla
  3. percona-toolkit:工具包中的 pt-query-digest 工具可以分析汇总慢查询信息,具体逻辑可以看 SlowLogParser 这个函数。

总的来说,MySQL 的日志内容本身不复杂,上面 3 个工具都是用 perl 脚本实现,代码行数不超过 200 行,有兴趣的同学也可以自己尝试着解析下。

详情可以参阅下这篇文章:

以上工具可以支撑慢日志的常用统计,但是当我们需要做到 SQL 级别的统计时,我们还需要取解析 SQL 把参数提取出来。

六、慢日志的清理与备份

  • 删除:直接删除慢日志文件,执行flush logs(必须的)。
  • 备份:先用mv重命名文件(不要跨分区),然后执行flush logs(必须的)。

另外修改系统变量slow_query_log_file也可以立即生效;执行flush logs,系统会先close当前的句柄,然后重新openmv, rm日志文件系统并不会报错,具体的原因可以 Google 下 linux i_counti_nlink`。


转载声明:本文转自微信公众号「DBAplus社群」,关于 MySQL 慢日志,你想知道的都在这

2
0
查看评论

mysql 全日志 和 慢日志 开启

环境mysql5.6 win7操作系统  找到mysql的配置文件my.ini,如果在mysql的安装目录中没有找到这个配置文件,可以在ProgramData下面MySQL\MySQL Server 5.6找到这个文件,我的这个文件路径就在D:\ProgramData\MySQL\MySQ...
  • hellofmx1989
  • hellofmx1989
  • 2016-08-26 22:51
  • 600

学会读懂 MySql 的慢查询日志

在前边的博客《何时、如何开启 MySql 日志?》中,我们了解到了如何启用 MySql 的慢查询日志。今天我们来看一下如何去读懂这些慢查询日志。在跟踪慢查询日志之前,首先你得保证最少发生过一次慢查询。如果你没有可以自己制造一个:root@server# mysql -e 'SELECT SL...
  • defonds
  • defonds
  • 2015-07-14 15:21
  • 2749

mysql 慢日志开启 及explain 分析sql语句

mysql 慢日志开启  在默认情况下,mysql是不会记录慢查询,需要我们指定启用慢查询日志,才会把执行速度慢的sql语句放入到日志. 启动方式: {%bin%}/mysqld.exe  --safe-mode  --slow-query-log 注:在默认情况下...
  • u011341352
  • u011341352
  • 2015-08-31 16:10
  • 412

MySQL 慢日志解析推送

背景 方案确定 搭建 配置文件 部署 问题 背景之前有用 pt-query-digest 做的慢日志分析的方案,定期将所有机器的慢日志的收集起来,传到中心机上用 pt-query-digest 分析一遍,最后展示出来。 基于 pt 分析展示的结果比较详细,有 SQL 排行,占比等,但是用户体验不是...
  • shuxiang1990
  • shuxiang1990
  • 2016-11-30 23:30
  • 326

Activity跳转Flag你想知道的都在这了

Android 的一个特色就是 application A 的 activity 可以启动 application B 的 activity,尽管 A 和 B 是毫无干系的,而在用户看来,两个场景紧密联系,视觉上二者构成了一个整体。Android 就是把这种误觉定义为 Task,它既不是 class...
  • zhanglixiang2015
  • zhanglixiang2015
  • 2016-06-21 16:24
  • 3632

logstash 通过mysql 慢日志了解(?m)

# User@Host: zjzc_app[zjzc_app] @ [10.171.243.55] Id: 1621705 # Query_time: 10.666552 Lock_time: 0.000392 Rows_sent: 15 Rows_examined: 24829551 SE...
  • zhaoyangjian724
  • zhaoyangjian724
  • 2016-10-13 14:07
  • 828

吐血推荐:数据库你想知道的都在这

如果有人问你数据库的原理,叫他看这篇文章            一提到关系型数据库,我禁不住想:有些东西被忽视了。关系型数据库无处不在,而且种类繁多,从小巧实用的 SQLite 到强大的 Teradata 。但很少有文章讲解数据库是...
  • huuuuuuuu
  • huuuuuuuu
  • 2017-02-26 13:13
  • 574

关于MySQL的慢日志分析工具

今天我们看看关于MySQL慢日志的阅读。我们知道,如果我们的语句不够优化,那么首先MySQL的慢日志是进一步优化的离线证据,虽然里面有好多“伪慢语句”!先不说怎么优化,如果你的日志有一条语句赌住了,那么会有不计其数的慢语句填充到MySQL的满日志里面。那么首先提炼出这些语句就非常头疼。今天主要介绍两...
  • yueliangdao0608
  • yueliangdao0608
  • 2010-05-08 18:31
  • 6121

mysql 慢查询日志设置

慢查询日志相关参数 MySQL 慢查询的相关参数解释: slow_query_log    :是否开启慢查询日志,1表示开启,0表示关闭。 log-slow-queries  :旧版(5.6以下版本)MySQL数据库慢查询日志存储路径。...
  • shukebai
  • shukebai
  • 2017-04-11 17:26
  • 1951

查看mysql慢日志的路径

执行下面sql即可:show variables like '%query%';
  • Time888
  • Time888
  • 2016-11-18 18:02
  • 290
    个人资料
    • 访问:957420次
    • 积分:12879
    • 等级:
    • 排名:第1271名
    • 原创:258篇
    • 转载:85篇
    • 译文:11篇
    • 评论:954条
    博主的 GitHub 账号
    GitHub : Charies Gavin

        鉴于 CSDN 糟糕的用户体验,博主会将一些优质的文章迁移到 Charies Gavin's Blog  欢迎大家在 GitHub 上 Follow 博主,以及 Fork、Star、Watch 博主的项目。


      青春不老 奋斗不止


      好学若饥虚心若愚
    博客专栏