前言
数据库日志记录了用户对数据库的各种操作及数据库发生的各种事件。能帮助数据库管理员追踪、分析问题。MySQL提供了错误日志、二进制日志、查询日志、慢查询日志。
MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值(long_query_time,单位:秒)的SQL语句。默认情况下,MySQL不启动慢查询日志。本文简单介绍如何开启慢查询日志,如何用mysqldumpslow分析慢查询。
参数说明:
代码语言:javascript复制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.7.34
代码语言:javascript复制SELECT VERSION(); #查询版本号 或者 show variables like '%version%'
配置开启慢查询
编辑MySQL配置文件my.cnf 在【mysqld】字段下加入:
代码语言:javascript复制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 #慢查询日志记录文件
代码语言:javascript复制mysql> show variables like 'slow_query%';
--------------------- ---------------------------------
| Variable_name | Value |
--------------------- ---------------------------------
| slow_query_log | ON |
| slow_query_log_file | /var/lib/mysql/slow_queries.log |
--------------------- ---------------------------------
2 rows in set (0.00 sec)
mysql> SHOW VARIABLES LIKE 'long_query_time';
----------------- ----------
| Variable_name | Value |
----------------- ----------
| long_query_time | 1.000000 |
----------------- ----------
1 row in set (0.00 sec)
测试
代码语言:javascript复制mysql> select sleep(2);
----------
| sleep(2) |
----------
| 0 |
----------
1 row in set (2.02 sec)
代码语言:javascript复制[root@cs ~]# 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 命令的语法如下:
代码语言:javascript复制mysqladmin -uroot -p flush-logs
执行该命令后,命令行会提示输入密码。输入正确密码后,将执行删除操作。新的慢查询日志会直接覆盖旧的查询日志,不需要再手动删除。
数据库管理员也可以手工删除慢查询日志,删除之后需要重新启动 MySQL 服务。
注意:通用查询日志和慢查询日志都是使用这个命令,使用时一定要注意,一旦执行这个命令,通用查询日志和慢查询日志都只存在新的日志文件中。如果需要备份旧的慢查询日志文件,必须先将旧的日志改名,然后重启 MySQL 服务或执行 mysqladmin 命令。