@[toc]
一、目的
开启 MySQL 的慢查询日志(Slow Query Log)可以帮助你分析和优化数据库中的慢查询语句。通过记录执行时间超过阈值的 SQL 查询,慢查询日志能够提供以下用途:
性能优化
: 慢查询日志能够帮助你找出执行时间较长的 SQL 查询语句,以及执行次数较多的查询。通过分析这些慢查询语句,你可以定位到导致性能瓶颈的代码块或者查询操作,进而对其进行优化,提高数据库的响应性能。发现问题查询
: 慢查询日志可以捕获执行时间较长的查询,帮助你发现潜在的性能问题、高查询负载或者设计不合理的查询语句。通过对慢查询日志的监控,你可以及时识别并修复这些问题,确保数据库的稳定性和可靠性。优化索引
: 慢查询日志可以揭示缺乏合适索引的查询语句。通过分析慢查询日志,你可以确定需要创建或优化的索引,提高查询的效率和性能。监控查询情况
: 通过定期分析慢查询日志,你可以了解数据库的查询模式和查询趋势。这有助于对系统性能进行长期监控,优化数据库设计和查询规划。
请注意,在生产环境中开启慢查询日志需要谨慎,因为它会产生额外的磁盘 I/O 和日志记录开销。你可以根据具体情况和需求来选择是否开启和设置合适的阈值。
二、注意点说明
- open_the_slow_sql_configuration_file.sh脚本就是开启MYSQL5.6版本的慢SQL功能的Shell脚本。
- 要想让此Shell脚本功能生效,必要前提就是生成慢SQL的日志存放路径文件夹必须先存在才行,比如脚本中配置slowSqlLogPath=/var/log/mysql,我必须先确保/var/log/mysql文件夹存在情况下,然后才能去重启网管服务让其生效。
- 单独只重启mysql服务不会生效,必须重启网管服务才可以。
- 该脚本一次只会固定产生一个类似叫slow_query_20230714.log日志文件,不会每天动态生成,所以如果想记录当天的慢SQL请在重启网管服务前有限执行一遍Shell脚本。
- 临时生效操作步骤只在当前已经启动中的mysql服务中生效,如果mysql服务重启了就失效了。
- 永久生效操作步骤,无论网管重启多少次都有效,但是不会每天动态创建一个对应日期的日志文件记录,只会存放于一个固定的日志名称中。
- 当前脚本只针对MySql5.6版本,不同版本脚本命令可能会有细微差别,需要定制化开发。
- linux修改配置文件为安装mysql下的配置文件叫my.cnf。
- windows服务器下和linux服务器下修改的文件名称不一样,我这个博客只针对需改Linux下mysql。
三、操作步骤
3.1 临时生效操作步骤
注意:不需要重启mysql服务,直接修改后生效。
第1步
:先在服务器创建存放慢SQL日志文件夹的路径,确保路径存在再执行第2步。
第2步
:执行sql,设置为 ON 表示启用慢查询日志。
set global slow_query_log=ON;
第3步
:执行sql,指定执行时间多少秒以上的查询将被视为慢查询。在上述示例中,查询时间超过 10 毫秒的查询将被记录。
set global long_query_time=0.01
第4步
:执行sql,指定日志文件的路径和名称。您可以根据实际需求更改路径和名称。
set global slow_query_log_file='/var/log/mysql/slow_query_20230713.log'
3.2 永久生效操作步骤
注意:需要重启mysql服务,但是生成的存放慢SQL的日志文件只有一个。
第1步
:先将慢SQL开启脚本open_the_slow_sql_configuration_file.sh上传服务器某个路径下,进入该路径,并执行授权命令:
chmod 777 open_the_slow_sql_configuration_file.sh
第2步
:先修改open_the_slow_sql_configuration_file.sh脚本中的日志存放路径slowSqlLogPath属性值。
第3步
:根据第2步的存放路径在服务器创建文件夹,确保路径文件夹存在情况下再执行第3步。
第4步
:重启网管服务让慢SQL功能生效。
3.3 按日期生成日志文件
注意:需要重启mysql服务,执行Shell脚本后需要重启网管,效果是重启后生成当天日期对应的日志文件。
第1步
:执行Sell脚本,进入存放的目录中执行命令:
./open_the_slow_sql_configuration_file.sh
第2步
:重启网管服务让慢SQL功能生效。
3.4 执行成功后验证功能是否开启
服务器连接登录mysql或者在数据库连接软件中执行相应sql,查看结果,如果结果都是你刚刚配置的,那就说明功能已开启且配置正确:
这是一个计数器,表示自 MySQL 服务器启动以来发生的慢查询数量。
show global status like '%slow_queries%';
这是一个计时器,表示自 MySQL 服务器启动以来所有慢查询执行所花费的总时间(以秒为单位)。
show global variables like 'long_query_time';
这是一个配置参数,表示被认为是慢查询的最小执行时间阈值。默认情况下,它的值是 10 秒,意味着执行时间超过 10 秒的查询将被记录为慢查询。您可以根据需求调整此值。
show variables like '%slow_query_log%';
四、慢SQL日志记录内容介绍
Tcp port: 18753 Unix socket: /home/ems/3rdparty/mysql/mysql.sock
Time Id Command Argument
# Time: 230714 14:11:08
# User@Host: herounms[herounms] @ [10.161.29.105] Id: 6
# Query_time: 0.306785 Lock_time: 0.020101 Rows_sent: 0 Rows_examined: 1393
use lte_ems;
SET timestamp=1689315068;
update lte_ems.monitor_sys_log
SET STATUS = 1
where PRODUCT = 'PLATFORM'
and STATUS = 0
and LOG_TYPE = 'start';
参数介绍:
- Time:代表sql的执行时间
- User:代表哪个用户在哪台服务器上执行的
- Query_time:慢查询语句的查询时间
- Lock_time:锁表时间
- Rows_sent:返回客户端的行数扫描过的行数
- Rows_examined:导致慢查询的sql_text
五、Shell脚本
open_the_slow_sql_configuration_file.sh
#!/bin/bash
# Open the slow sql configuration file
# Open slow SQL switch
sed -i "s|slow_query_log = .*|slow_query_log = ON|" /home/ems/3rdparty/mysql/my.cnf
echo "Configuration slow_query_log complete!"
# Set the current date to the log name
current_date=$(date +%Y%m%d)
slowSqlLogPath=/var/log/mysql
sed -i "s|slow_query_log_file = .*|slow_query_log_file = $slowSqlLogPath/slow_query_$current_date.log|" /home/ems/3rdparty/mysql/my.cnf
echo "Configuration slow_query_log_file complete!"
# Queries that take longer than a specified number of seconds to execute are considered slow
sed -i "s|long_query_time = .*|long_query_time = 0.01|" /home/ems/3rdparty/mysql/my.cnf
echo "Configuration long_query_time success!"
echo "Configuration Complete!"