MySQL 支持 4种 不同类型的日志文件,

  1. - 查询日志
  2. - 慢查询日志
  3. - 错误日志
  4. - 二进制日志

充分掌握这些日志文件,能够帮助数据库维护人员更好的了解 MySQL 数据库的运行情况、SQL 语句的执行情况、以及 MySQL 服务器运行过程中出现的错误信息等。

1. 查询日志

MySQL 中的查询日志保存在文本文件中,能够记录 MySQL 中的所有数据库操作。

可以通过 show variables like '%general%' 命令来查看 MySQL 的查询日志是否开启和日志文件所在位置

show variables like '%general%'

+------------------+-----------------------------------------------------------------------+
| Variable_name    | Value                                                                 |
+------------------+-----------------------------------------------------------------------+
| general_log      | OFF                                                                    |
| general_log_file | D:\Tools\phpstudy_pro\Extensions\MySQL5.7.26\data\DESKTOP-TF6324F.log |
+------------------+-----------------------------------------------------------------------+

注意:log 日志中记录了所有数据的操作,对于访问频繁的系统,次日志对系统性能的影响较大,建议一般情况下关闭

1.1 开启查询日志

MySQL 默认情况下没有开启查询日志,如果需要开启查询日志,则需要在 my.cnf 文件或 my.ini 文件的 [mysqld] 选项下进行配置。

[mysqld]
general_log=1
general_log_file=/data/mysql/log/general_log/general_statement.log
log_output=FILE

配置项说明:

  • general_log:表示是否开启查询日志。此项设置为 1 或者不带任何值,都可以开启查询日志;设置为 0 或者在 my.cnf 文件或 my.ini 文件中没有配置此项,则不会开启查询日志。
  • general_log_file:查询日志的文件目录,这里配置的是日志的完整路径。
  • log_output:表示日志的存储方式,可以有 3 种取值;TABLE 表示将查询日志存储到数据库表中;FILE 表示将查询日志保存到文件中;NONE 表示不保存日志信息到数据表和文件中。

注意:开启查询日志时,如果没有显示指定 general_log_file 选项和 log_output 选项的值,则 MySQL 会将查询日志保存到 DATADIR 选项指定的目录下 (也就是数据库中的数据目录),默认的文件名为 host_name.log ,其中 host_name 为 MySQL 的主机名。

注意:开启查询日志配置完成后,需要重启 MySQL 服务才能生效。

还可以通过 MySQL 命令行中指定开启 MySQL 的查询日志

mysql> SET GLOBAL general_log = 1;
Query OK, 0 rows affected (0.01 sec)
mysql> SET GLOBAL general_log_file = /data/mysql/log/general_log/general_statement.log;
Query OK, 0 rows affected (0.01 sec)
mysql> SET GLOBAL log_output = 'file';
Query OK, 0 rows affected (0.01 sec)

当开启查询日志配置完成后,MySQL 会自动创建 general_log_file 选项指定的日志文件。

1.2 查看查询日志

如果 log_output 选项配置的是将查询日志保存到文件中,则日志文件的格式为纯文本格式,可以直接查看日志文件中的内容。
下面为查询日志中的内容:

D:\Tools\phpstudy_pro\COM\..\Extensions\MySQL5.7.26\\bin\mysqld.exe, Version: 5.7.26-log (MySQL Community Server (GPL)). started with:
TCP Port: 3306, Named Pipe: (null)
Time                 Id Command    Argument
2021-08-24T09:01:18.433869Z        2 Connect    root@localhost on  using TCP/IP
2021-08-24T09:01:18.433993Z        2 Query    SET NAMES utf8mb4
2021-08-24T09:01:18.434150Z        2 Init DB    demo
2021-08-24T09:01:18.434209Z        2 Query    SET PROFILING = 1
2021-08-24T09:01:18.434333Z        2 Query    SHOW STATUS
2021-08-24T09:01:18.437647Z        2 Query    SHOW STATUS
2021-08-24T09:01:18.440877Z        2 Query    select * from actor
2021-08-24T09:01:18.444913Z        3 Connect    root@localhost on  using TCP/IP
2021-08-24T09:01:18.445078Z        3 Query    SET NAMES utf8mb4
2021-08-24T09:01:18.445130Z        3 Init DB    demo
2021-08-24T09:01:18.445164Z        3 Init DB    demo
2021-08-24T09:01:18.445285Z        3 Query    SELECT * FROM `demo`.`actor` LIMIT 0
2021-08-24T09:01:18.446290Z        3 Init DB    demo
2021-08-24T09:01:18.446379Z        3 Query    SHOW COLUMNS FROM `demo`.`actor`
2021-08-24T09:01:18.446756Z        2 Query    SHOW STATUS
2021-08-24T09:01:18.450075Z        2 Query    SELECT QUERY_ID, SUM(DURATION) AS SUM_DURATION FROM INFORMATION_SCHEMA.PROFILING GROUP BY QUERY_ID
2021-08-24T09:01:18.450479Z        2 Query    SELECT STATE AS `Status`, ROUND(SUM(DURATION),7) AS `Duration`, CONCAT(ROUND(SUM(DURATION)/0.000783*100,3), '') AS `Percentage` FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID=2 GROUP BY SEQ, STATE ORDER BY SEQ

如果 log_output 配置为 TABLE 则在 mysql 数据库下的 general_log 表中可以查看

1.3 删除/刷新 查询日志

查询日志以纯文本文件的格式保存在服务器磁盘上。可以直接删除查询日志文件

可以在 MySQL 命令行中执行如下命令刷新查询日志:

mysql> FLUSH LOGS;
Query OK, 0 rows affected (0.02 sec)
也可以在服务器命令行中执行如下命令刷新日志
[root@root ~]# mysqladmin -uroot -p flush-logs
Enter password:

日志刷新成功后,再次查看日志目录下的文件,就会发现一级重新创建了查询日志文件了。

注意,如果直接删除文件,需要执行刷新命令后才会重新生成日志文件。如果只是删除了日志中的内容,则不需要执行刷新命令。

1.4 关闭查询日志

关闭查询日志比较简单,需要在 my.cnfmy.ini 文件的 [mysqld] 选项下将 general_log 选项删除 或者设置为 general_log=0 就可以了,重启 MySQL 后就可以生效了。

也可以通过 MySQL 命令行 执行如下命令来关闭查询日志

mysql> SET GLOBAL general_log = 0;
Query OK, 0 rows affected (0.02 sec)
关闭查询日志后,删除查询日志,在执行刷新日志的操作,MySQL就不再重新创建查询日志文件了。