基础知识

根据 MySQL 文档:

"The slow query log consists of SQL statements that took more than 
long_query_time seconds to execute and required at least min_examined_row_limit rows to be examined."

慢查询日志由执行时间超过 long_query_time 秒且至少需要检查 min_examined_row_limit 行的 SQL 语句组成。

要记录所有查询,我们可以将 long_query_time 的值设置为 0 。
long_query_time 的默认值为 10 秒,min_examined_row_limit 的默认值为 0。

在线开启慢查询日志

我们也可以在 MySQL 中启用慢查询日志,而不是重新启动 mysqld 服务。
要启用慢查询日志,我们可以动态设置slow_query_log=1,并且可以使用slow_query_log_file 设置文件名。
要指定日志目标,请使用 -log-output :

  1. 设置 LONG_QUERY_TIME 并验证值。
mysql> SET @@GLOBAL.LONG_QUERY_TIME=5;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @@GLOBAL.LONG_QUERY_TIME;
+--------------------------+
| @@GLOBAL.LONG_QUERY_TIME |
+--------------------------+
|                 5.000000 |
+--------------------------+
1 row in set (0.00 sec)
mysql> SELECT @@GLOBAL.LONG_QUERY_TIME;
+--------------------------+
| @@GLOBAL.LONG_QUERY_TIME |
+--------------------------+
|                5.000000 |
+--------------------------+
1 row in set (0.00 sec)
  1. 设置慢查询文件。
    默认情况下,它会在带有 hostname-slow 日志的数据目录中:
mysql> SELECT @@GLOBAL.slow_query_log_file;
+---------------------------------+
| @@GLOBAL.slow_query_log_file    |
+---------------------------------+
| /var/lib/mysql/server1-slow.log |
+---------------------------------+
1 row in set (0.00 sec)
mysql> SET @@GLOBAL.slow_query_log_file='/var/log/mysql/mysql-slow.log';
Query OK, 0 rows affected (0.00 sec)

验证日志文件的新位置:

mysql> SELECT @@GLOBAL.slow_query_log_file;
+-------------------------------+
| @@GLOBAL.slow_query_log_file  |
+-------------------------------+
| /var/log/mysql/mysql-slow.log |
+-------------------------------+
1 row in set (0.00 sec)
  1. 开启慢查询日志。
    默认情况下它是禁用的,如下所示:
mysql> SELECT @@GLOBAL.slow_query_log;
+-------------------------+
| @@GLOBAL.slow_query_log |
+-------------------------+
|                       0 |
+-------------------------+
1 row in set (0.00 sec)
mysql> SET @@GLOBAL.slow_query_log=1;
Query OK, 0 rows affected (0.01 sec)
mysql> SELECT @@GLOBAL.slow_query_log;
+-------------------------+
| @@GLOBAL.slow_query_log |
+-------------------------+
|                       1 |
+-------------------------+
1 row in set (0.00 sec)

在 MySQL 中启用慢查询日志

  1. 修改 /etc/my.cnf 的“mysqld”部分。
    以下示例显示将需要超过五秒的查询记录到“/var/lib/mysql/mysqld-slow.log”:
# vi /etc/my.cnf
[mysqld]
  long_query_time=5
  slow_query_log=1
  slow_query_log_file=/var/lib/mysql/mysqld-slow.log
  1. 完成上述更改后,重新启动 mysqld 服务。
# service mysqld restart
如何配置 mysqld 记录慢查询
www. On IT Road .com

检查确认

  1. 检查配置是否有效。
    检查“slow_query_log”参数(它应该是“ON”)。
mysql> show variables like '%slow%';
+---------------------+--------------------------------+
| Variable_name       | Value                          |
+---------------------+--------------------------------+
| log_slow_queries    | ON                             |
| slow_launch_time    | 2                              |
| slow_query_log      | ON                             |
| slow_query_log_file | /var/lib/mysql/mysqld-slow.log |
+---------------------+--------------------------------+
4 rows in set (0.00 sec)

2.检查参数“long_query_time”,它的时间应该是5秒。

mysql> show variables like '%long%';
+--------------------+----------+
| Variable_name      | Value    |
+--------------------+----------+
| long_query_time    | 5.000000 |
| max_long_data_size | 1048576  |
+--------------------+----------+
2 rows in set (0.00 sec)
  1. 验证查询是否已记录(我们必须执行一些长时间运行的查询才能在慢查询日志中查看它们):
mysql> SELECT SLEEP(6);
+----------+
| SLEEP(6) |
+----------+
|        0 |
+----------+
1 row in set (6.00 sec)
shell> sudo less /var/log/mysql/mysql-slow.log 
/usr/sbin/mysqld, Version: 8.0.3-rc-log (MySQL Community Server (GPL)). started with:
Tcp port: 3306  Unix socket: /var/lib/mysql/mysql.sock
Time                 Id Command    Argument
# Time: 2017-10-15T12:43:55.038601Z
# User@Host: root[root] @ localhost []  Id:     7
# Query_time: 2.000845  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
SET timestamp=1508071435;
SELECT SLEEP(6);
日期:2020-09-17 00:11:07 来源:oir作者:oir