欢迎您光临本站,如有问题请及时联系我们。

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

  一、什么是慢日志?

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

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

  5.6官方说明:https://dev.mysql.com/doc/refman/5.6/en/slow-query-log.html

  5.7官方说明:https://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html

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

慢日志

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

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

  关键代码如下:

代码

  Slow log调用栈(MySQL 5.6.34 ):

Slow log

  三、慢日志相关参数

参数

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

  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

  四、慢日志输出内容

慢日志

  第一行:标记日志产生的时间,准确说是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配置的未使用索引的慢日志将会被抑制,被抑制的信息会被汇总,每分钟输出一次。

  格式如下:

  五、慢日志分析工具

  官方自带工具: mysqldumpslow

  开源工具:mysqlsla

  percona-toolkit:工具包中的pt-query-digest工具可以分析汇总慢查询信息,具体逻辑可以看SlowLogParser这个函数。

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

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

  《MySQL 慢查询设置和分析工具 》:

  https://flyerboy.github.io/2016/12/23/mysql_slow/

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

  六、慢日志的清理与备份

  删除:直接删除慢日志文件,执行flush logs(必须的)。

  备份:先用mv重命名文件(不要跨分区),然后执行flush logs(必须的)。

  另外修改系统变量slow_query_log_file也可以立即生效;

  执行flush logs,系统会先close当前的句柄,然后重新open;mv , rm日志文件系统并不会报错,具体的原因可以Google下linux i_count i_nlink ;

  一、什么是慢日志?

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

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

  5.6官方说明:https://dev.mysql.com/doc/refman/5.6/en/slow-query-log.html

  5.7官方说明:https://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html

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

慢日志

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

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

  关键代码如下:

代码

  Slow log调用栈(MySQL 5.6.34 ):

Slow log

  三、慢日志相关参数

参数

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

  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

  四、慢日志输出内容

慢日志

  第一行:标记日志产生的时间,准确说是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配置的未使用索引的慢日志将会被抑制,被抑制的信息会被汇总,每分钟输出一次。

  格式如下:

  五、慢日志分析工具

  官方自带工具: mysqldumpslow

  开源工具:mysqlsla

  percona-toolkit:工具包中的pt-query-digest工具可以分析汇总慢查询信息,具体逻辑可以看SlowLogParser这个函数。

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

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

  《MySQL 慢查询设置和分析工具 》:

  https://flyerboy.github.io/2016/12/23/mysql_slow/

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

  六、慢日志的清理与备份

  删除:直接删除慢日志文件,执行flush logs(必须的)。

  备份:先用mv重命名文件(不要跨分区),然后执行flush logs(必须的)。

  另外修改系统变量slow_query_log_file也可以立即生效;

  执行flush logs,系统会先close当前的句柄,然后重新open;mv , rm日志文件系统并不会报错,具体的原因可以Google下linux i_count i_nlink ;


来源:本文由E8运维原创撰写,欢迎分享本文,转载请保留出处和链接!