MySQL 支持 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.cnf
或 my.ini
文件的 [mysqld]
选项下将 general_log
选项删除 或者设置为 general_log=0
就可以了,重启 MySQL 后就可以生效了。
也可以通过 MySQL 命令行 执行如下命令来关闭查询日志
mysql> SET GLOBAL general_log = 0;
Query OK, 0 rows affected (0.02 sec)
关闭查询日志后,删除查询日志,在执行刷新日志的操作,MySQL就不再重新创建查询日志文件了。