总字符数: 2.22K

代码: 1.43K, 文本: 0.48K

预计阅读时间: 8 分钟

前言

MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值(long_query_time,单位:秒)的SQL语句.默认情况下,MySQL不启动慢查询日志.本文简单介绍如何开启慢查询日志,如何用mysqldumpslow分析慢查询.

参数说明

1
2
3
4
5
slow_query_log #慢查询开启状态,ON开启,OFF关闭
slow_query_log_file #慢查询日志存放的位置(这个目录需要MySQL的运行帐号的可写权限,一般设置为MySQL的数据存放目录)
long_query_time #查询超过多少秒才记录 默认10s ,查询命令 SHOW VARIABLES LIKE 'long_query_time';
log_queries_not_using_indexes = 1 #表明记录没有使用索引的 SQL 语句
# 重点说明:开启慢日志版本要高,低版本无法支持,本次版本是:5.5.68-MariaDB
mdb_version
mdb_version

配置开启慢查询

编辑MySQL配置文件my.cnf如果不知道my.cnf文件在哪可以用find命令查找:find / -name my.cnf[mysqld]字段下加入:

1
2
3
4
long_query_time=1 #表示记录查询超过1s的sql
slow_launch_time=1 #表示如果建立线程花费了比这个值更长的时间,slow_launch_threads 计数器将增加
slow_query_log=ON #开启慢查询日志
slow_query_log_file=/var/lib/mysql/slow_queries.log #慢查询日志记录文件

注意:慢查询的日志记录文件对于mysql用户必须可写!!!

1
2
3
4
5
6
7
8
MariaDB [(none)]> show variables like 'slow_query%';
+---------------------+------------------------+
Variable_name Value
+---------------------+------------------------+
slow_query_log OFF
slow_query_log_file VM-8-7-centos-slow.log
+---------------------+------------------------+
2 rows in set (0.01 sec)

测试

1
2
3
4
5
6
7
MariaDB [(none)]> select sleep(2);
+----------+
sleep(2)
+----------+
0
+----------+
1 row in set (2.00 sec)
1
2
3
4
5
6
7
8
9
[root@VM-8-7-centos ~]# cat  /var/lib/mysql/slow_queries.log
/usr/sbin/mysqld, Version: 5.7.34-log (MySQL Community Server (GPL)). started with:
Tcp port: 0 Unix socket: /var/lib/mysql/mysql.sock
Time Id Command Argument
# Time: 2021-08-20T10:01:18.841053Z
# User@Host: root[root] @ localhost [] Id: 3
# Query_time: 2.023306 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0
SET timestamp=1629453678;
select sleep(2);

删除慢查询日志

慢查询日志的删除方法与通用日志的删除方法是一样的.可以使用mysqladmin命令来删除.也可以使用手工方式来删除.mysqladmin 命令的语法如下mysqladmin -uroot -p flush-logs 执行该命令后,命令行会提示输入密码.输入正确密码后,将执行删除操作.新的慢查询日志会直接覆盖旧的查询日志,不需要再手动删除. 数据库管理员也可以手工删除慢查询日志,删除之后需要重新启动MySQL服务.

通用查询日志和慢查询日志都是使用这个命令,使用时一定要注意,一旦执行这个命令,通用查询日志和慢查询日志都只存在新的日志文件中.如果需要备份旧的慢查询日志文件,必须先将旧的日志改名,然后重启MySQL服务或执行mysqladmin命令