热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

慢日志_MySQL慢日志功能分析及优化增强

篇首语:本文由编程笔记#小编为大家整理,主要介绍了MySQL慢日志功能分析及优化增强相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了MySQL慢日志功能分析及优化增强相关的知识,希望对你有一定的参考价值。



本文由  网易云 发布。

 

mysql慢日志(slow log)是MySQL DBA及其他开发、运维人员需经常关注的一类信息。使用慢日志可找出执行时间较长或未走索引等SQL语句,为进行系统调优提供依据。本文结合线上案例分析如何正确设置MySQL慢日志参数和使用慢日志功能,并介绍网易云RDS对MySQL慢日志功能增强。


 


MySQL参数组功能

 

网易云RDS实例提供了参数组管理功能,可通过参数管理界面查看绝大部分常用的MySQL系统参数,用户可以了解当前运行值和建议值,如下所示:

 

用户还可通过参数管理页面对所列的参数进行修改,点击“修改参数”按钮在线设置,点击“保存修改”即可一键完成MySQL主从节点的参数修改,如下图:

 

查看参数管理界面不难发现,与慢查询相关的参数较多,这些参数是如何起作用的呢,相互关系又是如何,满足什么条件的SQL语句才会记录到慢日志中?只有了解了这些才能更好地利用慢日志进行系统调优和问题定位。我们以一个线上案例为依托来介绍如何正确配置慢日志参数:用户报告他们使用的多个RDS 5.7版本实例慢日志异常,明明执行了一分多钟的SQL语句,却没有记录到慢日志中。还提供了用于复现的SQL语句。


 


慢日志参数正确配置姿势

 

首先,我们需确认该实例是否开启了慢日志功能,默认情况下,MySQL慢日志功能是关闭的。慢日志开关参数为slow_query_log,可在mysqld启动命令行或配置文件中显式指定,若指定slow_query_log=1或不指定值,则表示开启慢日志,赋值为0表示关闭。用户可以在运行时动态开启和关闭。网易云RDS实例默认开启慢日志功能,我们确认了该用户未关闭实例的慢日志开关。

 

接下来,需确认慢日志记录位置,MySQL使用log_output参数指定以文件(FILE)还是表(TABLE)的方式来保存慢日志,需要强调的是,仅指定log_output而将slow_query_log置为0并不会记录慢日志,也就是说slow_query_log才是慢日志的开关。若使用文件形式记录慢日志,则可通过slow_query_log_file指定文件名,如果用户没有显式指定slow_query_log_file,则MySQL将其初始化为host_name-slow.log,host_name即为运行mysqld的主机名,慢日志文件默认位于MySQL数据目录。网易云RDS实例不允许用户修改日志文件路径,但可以配置log_output参数,通过查询,确认该实例以文件方式记录慢日志,查看日志文件确认没有用户所述的SQL语句。

 

由于用户提供了复现语句,我们执行了其SQL语句,确实1分多钟才返回,通过explain命令发现其未走索引,扫描了较多的记录数,再次查看慢日志仍没有记录该SQL语句。MySQL会记录满足执行时间超过long_query_time秒,扫描记录数超过min_examined_row_limit行的SQL语句。long_query_time参数最小值和默认值分别为1和10s,该参数可以精确到微秒(ms)。如果选择将慢日志记录到文件中,那么所记录的时间精确到微秒,如果记录到慢日志表(mysql.slow_log)中,那么仅精确到秒,微秒部分被忽略。网易云RDS实例允许用户设置这两个参数值,那么是不是用户调整了上述两个阈值,导致无法满足记录条件呢,进一步查询发现也不是问题原因所在。

 

我们注意到MySQL还有个名为log_queries_not_using_indexes的参数用于控制是否记录未走索引的SQL查询,代码如下:

 

重点关注箭头所指内容,如果查询未走索引或者索引无效,且相关参数开启,那么warn_no_index设置为true,若同时满足扫描记录数超过阈值,也会像慢查询一样被记录,那么是不是该参数未开呢?结果仍是否定的。


 


问题原因之所在

 

由于数据库实例中可能有较多不走索引的SQL语句,若开启log_queries_not_using_indexes,则存在日志文件或表容量增长过快的风险,此时可通过设置log_throttle_queries_not_using_indexes来限制每分钟写入慢日志中的不走索引的SQL语句个数,该参数默认为0,表示不开启,也就是说不对写入SQL语句条数进行控制。启用后,系统会在第一条不走索引的查询执行后开启一个60s的窗口,在该窗口内,仅记录最多log_throttle_queries_not_using_indexes条SQL语句。超出部分将被抑制,在时间窗结束时,会打印该窗口内被抑制的慢查询条数以及这些慢查询一共花费的时间。下一个统计时间窗并不是马上创建,而是在下一条不走索引的查询执行后开启。对应到该线上问题,log_throttle_queries_not_using_indexes被设置为10,在日志文件中看到周期性打印了如下内容:

 

确实符合上面描述的现象,用户的慢日志应该是被抑制了,汇总到了359里面去。我们尝试将log_throttle_queries_not_using_indexes设置为0,再执行对应的SQL语句,果然在日志文件中记录了相应的SQL语句。这个线上问题似乎已经定位到了,就是系统产生的不走索引的慢日志太多,而设置的log_throttle_queries_not_using_indexes太小,导致无法正常记录用户未走索引的慢日志。但还有一个疑惑点没有解决,那就是log_throttle_queries_not_using_indexes为0时,每分钟并没有打印超过10条慢日志,更没有throttle提示的359条这么多,那么设置为10的时候用户提供的那条SQL语句应该被记录到慢日志中才对啊,为何没有记录,原因何在?其实,仔细看下MySQL记录不走索引的日志的代码逻辑可以找到答案:

 

上图是记录慢日志的主逻辑,是否记录日志由函数log_slow_applicable控制,该函数先前已分析了一部分,我们进一步看该函数的其他相关内容,见下图红框:

 

suppress_logging是个决定性的变量,只有它为false,该SQL语句才可能被记录。其结果就跟log_throttle_queries_not_using_indexes相关,我们进一步看下log_throttle_qni.log相关实现,如下图:

 

eligible即为warn_no_index,inc_log_count()函数在1分钟内不走索引的语句总数超过log_throttle_queries_not_using_indexes时返回值为true,只有warn_no_index和inc_log_count()返回值都为true,suppress_current才为true,而suppress_current即为suppress_logging。

 

通过对上述2个截图内容进行分析,可以解答之前的疑惑点:log_throttle_queries_not_using_indexes统计的是所有不走索引的语句,其中有些语句因为不满足扫描记录数的约束而不会记录到慢日志中,这就是为什么该值为10的时候,慢日志文件中并没有10条记录。因为这10条中有8条SQL语句由于扫描记录数太少并没有被记录。

 

这也解惑了上图中359这个数字,它这个时间窗内不走索引的SQL语句总数。所以,log_throttle_queries_not_using_indexes是个很关键的参数,设置不当会无法正常记录不走索引的慢查询,导致慢日志功能部分失效。


 


InnoSQL慢日志功能增强

 

还有部分RDS实例用户问我们,为什么我的SQL语句执行时间没有超过所设置的long_query_time,而且走了索引,但还是被记录到慢日志中,是不是出Bug了?其实这不是Bug,而是因为网易云RDS使用的InnoSQL(网易维护的MySQL开源分支)版本对慢日志做了优化,除了考察SQL语句的执行时间外,还关注该查询所需的磁盘页面(Disk Page)数,因为所需的页面数目过多,也可能会对系统负载造成较大影响。为了能够量化统计,我们收集了SQL查询所需读取的总页面数和这些页面中实际进行IO的次数,分别记录为logical_reads和physical_reads,前者包括命中InnoDB Buffer Pool和未命中需要进行IO的页面请求。通过引入slow_query_type和long_query_io两个参数为用户提供该功能。前者可设置为0/1/2/3。1表示启用基于执行时间来记录慢日志,2表示基于搜索总页面数来记录慢日志,3是1和2的合集。所以在InnoSQL中,SQL查询只需满足执行时间够长或所需总页面数够多即可记录到慢日志中。代码实现片段如下:

 

页面数阈值通过long_query_io参数来衡量,用户可动态设置,如果总页面数m_logical_reads超过了该值,即使执行时间未超标,也会被记录。相应的,RDS实例慢日志表结构和慢日志文件输出内容也增加了新的字段。

 

上图即为InnoSQL版的slow_log表结构,其中,logical_reads和physical_reads为InnoSQL增加字段。同样的,慢日志文件的输出内容也增加了两个字段,如下所示:

 

除了以上详细描述的内容外,MySQL慢日志模块还有如下几个特性值得关注:



  1. 进行慢日志统计及慢日志中所记录的时间并不包括该SQL语句开始执行前获取锁所需等待的时间;

  2. MySQL在SQL语句执行完且所持有的锁均已释放后才将其写入慢日志中,所以慢日志中的SQL语句记录顺序并不能准确反映这些SQL语句的实际执行顺序;

  3. 每条慢日志都包含一个时间戳,若写入文件中,log_timestamps 参数用于将慢日志时间戳转化为指定时区的时间。但该参数对于mysql.slow_log表中的慢日志不起作用;

  4. 可通过设置log_slow_slave_statements来开启MySQL从库的慢日志功能;ALTER TABLE, ANALYZE TABLE, CHECK TABLE, CREATE INDEX, DROP INDEX, OPTIMIZE TABLE, and REPAIR TABLE等表管理操作也能够被记录到慢日志中,可通过log_slow_admin_statements选项开启。

 

了解 网易云 :
网易云官网:https://www.163yun.com/
新用户大礼包:https://www.163yun.com/gift
网易云社区:https://sq.163yun.com/

 



推荐阅读
  • 基于iSCSI的SQL Server 2012群集测试(一)SQL群集安装
    一、测试需求介绍与准备公司计划服务器迁移过程计划同时上线SQLServer2012,引入SQLServer2012群集提高高可用性,需要对SQLServ ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 在CentOS上部署和配置FreeSWITCH
    在CentOS系统上部署和配置FreeSWITCH的过程涉及多个步骤。本文详细介绍了从源代码安装FreeSWITCH的方法,包括必要的依赖项安装、编译和配置过程。此外,还提供了常见的配置选项和故障排除技巧,帮助用户顺利完成部署并确保系统的稳定运行。 ... [详细]
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • 在ElasticStack日志监控系统中,Logstash编码插件自5.0版本起进行了重大改进。插件被独立拆分为gem包,每个插件可以单独进行更新和维护,无需依赖Logstash的整体升级。这不仅提高了系统的灵活性和可维护性,还简化了插件的管理和部署过程。本文将详细介绍这些编码插件的功能、配置方法,并通过实际生产环境中的应用案例,展示其在日志处理和监控中的高效性和可靠性。 ... [详细]
  • 如何在Oracle ASM_Diskgroup中重命名现有磁盘
    如何在Oracle ASM_Diskgroup中重命名现有磁盘 ... [详细]
  • HBase在金融大数据迁移中的应用与挑战
    随着最后一台设备的下线,标志着超过10PB的HBase数据迁移项目顺利完成。目前,新的集群已在新机房稳定运行超过两个月,监控数据显示,新集群的查询响应时间显著降低,系统稳定性大幅提升。此外,数据消费的波动也变得更加平滑,整体性能得到了显著优化。 ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
  • MySQL 8.0 MGR 自动化部署与配置:DBA 和开源工具的高效解决方案
    MySQL 8.0 MGR 自动化部署与配置:DBA 和开源工具的高效解决方案 ... [详细]
  • Syncnavigator激活工具及破解方法详解
    本文详细介绍了Syncnavigator激活工具的使用方法及其破解技巧。用户可以通过访问官方网站www.SyncNavigator.CN获取相关资源,并通过客服QQ 1793040获得技术支持和帮助。此外,文章还提供了详细的步骤说明和常见问题解答,以确保用户能够顺利激活并使用Syncnavigator软件。 ... [详细]
  • 本文探讨了利用Python编程语言开发自动化脚本来实现文件的全量和增量备份方法。通过详细分析不同备份策略的特点,文章介绍了如何使用Python标准库中的os和shutil模块来高效地管理和执行备份任务。此外,还提供了示例代码和最佳实践,帮助读者快速掌握自动化备份技术,确保数据的安全性和完整性。 ... [详细]
author-avatar
null5269
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有