MySQL慢日志说明

简介

MySQL 的慢查询日志是MySQL 提供的一种日志记录,它用来记录在 MySQL 中响应时间超过阈值的语句,具体指运行时间超过 long_query_time 值的 SQL 语句,则会被记录到慢查询日志中

官方文档:https://dev.mysql.com/doc/refman/8.0/en/slow-query-log.html

配置参数详解

slow_query_log=1     # 启用慢日志
long_query_time=5    # 定义慢SQL语句记录的阈值
log_queried_not_using_indexes=1     # 未使用索引的SQL语句也会被记录到慢日志中
slow_query_log_fie=/var/log/mysql/mysql-slow.log  # 慢日志记录的路径及名称,如果不指定名称,默认使用 host_name-slow.log,路径如果不指定,服务器会在数据目录下创建该文件

永久配置启用慢日志

$ vim /etc/my.cnf
[mysqld]
#slow-log
slow_query_log=1
long_query_time=5
log_queries_not_using_indexes=on
slow_query_log_file=/var/log/mysql/mysql_slow.log

$ systemctl restart mysqld

查看MySQL慢日志变量

mysql> show variables like '%quer%';
+----------------------------------------+-------------------------------+
 Variable_name                           Value                         
+----------------------------------------+-------------------------------+
 log_queries_not_using_indexes           ON                            
 log_throttle_queries_not_using_indexes  0                             
 long_query_time                         5.000000                      
 slow_query_log                          ON                            
 slow_query_log_file                     /var/log/mysql/mysql_slow.log 
+----------------------------------------+-------------------------------+

查询截止目前已经产生了多少条慢查询记录

mysql> show global status like '%slow_queries%';
+---------------+-------+
 Variable_name  Value 
+---------------+-------+
 Slow_queries   0     
+---------------+-------+
1 row in set (0.00 sec)

mysql> select sleep(20);
+-----------+
 sleep(20) 
+-----------+
         0 
+-----------+
1 row in set (20.00 sec)

mysql> show global status like '%slow_queries%';
+---------------+-------+
 Variable_name  Value 
+---------------+-------+
 Slow_queries   1     
+---------------+-------+

# 查看慢日志文件记录详情
cat /var/log/mysql/mysql_slow.log 
/opt/mysql/bin/mysqld, Version: 8.0.23 (MySQL Community Server - GPL). started with:
Tcp port: 3306  Unix socket: /var/log/mysql/mysql.sock
Time                 Id Command    Argument
/opt/mysql/bin/mysqld, Version: 8.0.23 (MySQL Community Server - GPL). started with:
Tcp port: 3306  Unix socket: /var/log/mysql/mysql.sock
Time                 Id Command    Argument
# Time: 2021-08-07T16:11:25.752426+08:00
# User@Host: root[root] @ localhost []  Id:     8
# Query_time: 20.000175  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 1
SET timestamp=1628323865;
select sleep(20);         # SQL语句

# 参数说明
1. Time      //记录该日志记录的时间
2. User@Host //记录MySQL登录的用户和登录的主机地址
3 Query_time一行  //记录第一个时间是查询的时间、第二个是锁表的时间、第三个是返回的行数、第四个是扫描的行数
4.SET timestamp  //这一个是MySQL查询的时间
5.sql语句     //这一行就很明显了,表示的是我们执行的sql语句

慢日志重命名

方法一:要在服务器上创建新文件,请在刷新之前重命名当前日志文件

shell> cd mysql-data-directory
shell> mv mysql.log mysql.old
shell> mv mysql-slow.log mysql-slow.old
shell> mysqladmin flush-logs

方法二:假如有些情况下服务器不允许重新启动,但是有此情况下又需要对日志重新命名,以便继续备份或者日志切割

# 先禁用日志功能
mysql> SET GLOBAL slow_query_log = 'OFF';

# 在服务器上重命名日志文件
$ mv mysql-slow.log mysql-slow-new.log

# 再次启用日志功能并刷新日志
mysql> SET GLOBAL slow_query_log = 'ON';

MySQL慢日志说明
http://www.qiqios.cn/2021/08/07/mysql慢日志说明/
作者
一亩三分地
发布于
2021年8月7日
许可协议