MySQL丨日志1

前言

任何一种数据库,都会拥有各种各样的日志,用来记录数据库的运行情况、日常操作和错误等信息,可以帮助我们诊断数据库出现的各种问题。
MySQL 也不例外,它有不同类型的日志文件,各自存储了不同类型的日志。这些日志文件存储在系统文件层。
MySQL体系架构

日志文件分类

在 MySQL 中,日志可以分为错误日志、通用查询日志、二进制日志和慢查询日志。

错误日志(Error Log):顾名思义,就是记录一些严重的错误、警告信息(启动、运行或停止 mysql 时出现的问题);默认是开启的;使用 show variables like '%log_error%'; 查看。
错误日志
MySQL 5.7 新增的 log_error_verbosity 参数,它有三个可选值:

  • log_error_verbosity=1:记录错误信息;
  • log_error_verbosity=2:记录错误信息和告警信息;(推荐)
  • log_error_verbosity=3(默认值):记录错误信息、告警信息和通知信息。

通用查询日志(General Query Log):该日志记录 MySQL 服务器的启动和关闭信息、客户端的连接信息、更新、查询数据记录的 SQL 语句等。使用 show variables like '%general%'; 查看,从下图可以知道默认是关闭的(OFF)。
通用查询日志
general_log_file 变量指定了通用查询日志文件所在的位置。

二进制日志(Binary Log):以二进制的形式记录了对 MySQL 数据库执行的更改操作,并且记录了语句的发生时间、执行时长等相关信息;但是不记录 select、show 等不修改数据库的查询语句。主要用于数据库恢复和主从复制。使用 show variables like '%log_bin%'; 查看是否开启了日志,从下图可知是关闭的。
二进制日志
因为是关闭的,所以使用 show binary logs; 无法查看日志文件:
关闭状态
使用 show variables like '%binlog%'; 查看 binlog 参数:
日志参数

慢查询日志(Slow Query Log):记录所有执行时间超过 10秒 (默认超时)的所有查询或不使用索引的查询操作。使用 show variables like '%slow_query%'; 可以查看是否开启了,从下图可知是开启了(ON)。
慢查询日志
关于超时的时长参数(long_query_time)的信息,可以使用 show variables like '%long_query_time%'; 查询,从下图可知是 10 秒。
10秒超时
使用 set long_query_time=15; 可以将超时的时长更改为 15 秒:
设置超时参数

日志文件操作

错误日志

在 MySQL 数据库中,默认开启错误日志功能。一般情况下,错误日志存储在 MySQL 数据库的数据文件夹下,通常名称为 hostname.err。其中,hostname 表示 MySQL 服务器的主机名。
在 MySQL 中,通过 SHOW 命令可以查看错误日志文件所在的目录及文件名信息。

mysql> SHOW VARIABLES LIKE 'log_error';
+---------------+------------------+
| Variable_name | Value            |
+---------------+------------------+
| log_error     | .\WIN11-ROOT.err |
+---------------+------------------+
1 row in set, 1 warning (0.01 sec)

可以看到,WIN11-ROOT 这个就是主机名,省略了具体路径,那么就是 C:\ProgramData\MySQL\MySQL Server 5.7\Data 这个目录。
错误日志以文本文件的形式存储,直接使用普通文本工具就可以查看。
注意:错误日志中记录的并非全是错误信息,例如 MySQL 如何启动 InnoDB 的表空间文件、如何初始化自己的存储引擎等,这些也记录在错误日志文件中。如下所示。

2020-02-02T07:45:38.329153Z 0 [Note] InnoDB: Mutexes and rw_locks use Windows interlocked functions
2020-02-02T07:45:38.330312Z 0 [Note] InnoDB: Uses event mutexes
2020-02-02T07:45:38.330761Z 0 [Note] InnoDB: _mm_lfence() and _mm_sfence() are used for memory barrier
2020-02-02T07:45:38.331414Z 0 [Note] InnoDB: Compressed tables use zlib 1.2.11
2020-02-02T07:45:38.331953Z 0 [Note] InnoDB: Adjusting innodb_buffer_pool_instances from 8 to 1 since innodb_buffer_pool_size is less than 1024 MiB
2020-02-02T07:45:38.333205Z 0 [Note] InnoDB: Number of pools: 1
2020-02-02T07:45:38.333890Z 0 [Note] InnoDB: Not using CPU crc32 instructions
2020-02-02T07:45:38.337571Z 0 [Note] InnoDB: Initializing buffer pool, total size = 8M, instances = 1, chunk size = 8M
2020-02-02T07:45:38.338955Z 0 [Note] InnoDB: Completed initialization of buffer pool
2020-02-02T07:45:38.369561Z 0 [Note] InnoDB: Highest supported file format is Barracuda.
2020-02-02T07:45:38.408443Z 0 [Note] InnoDB: Creating shared tablespace for temporary tables

错误日志如果不清理或删除,那么它会一直增长。在 MySQL 5.5.7 之前,可以通过 mysqladmin –uroot –p flush-logs 命令删除错误日志。MySQL 5.5.7 以及之后,只能通过下面方式来归档、备份错误日志。
以 Windows 操作系统为例:

进入 Data 目录中
C:\WINDOWS\system32>cd C:\ProgramData\MySQL\MySQL Server 5.7\Data
重命名(备份)原有的错误日志 WIN11-ROOT.err
C:\ProgramData\MySQL\MySQL Server 5.7\Data>rename WIN11-ROOT.err WIN11-ROOT.err-old
刷新所有日志文件,会新建一个 WIN11-ROOT.err
C:\ProgramData\MySQL\MySQL Server 5.7\Data>mysqladmin flush-logs
将备份的 WIN11-ROOT.err-old 重命名为 backup-directory
C:\ProgramData\MySQL\MySQL Server 5.7\Data>rename WIN11-ROOT.err-old backup-directory

通用查询日志

MySQL 服务器会按照它接收到语句的先后顺序写入日志文件。由于一般查询日志记录的内容过于详细,开启后 Log 文件的体量会非常庞大,所以出于对性能的考虑,默认情况下,通用查询日志功能是关闭的。通常会在排查故障需获得详细日志的时候才会临时开启。开启方式如下:

mysql> SET GLOBAL general_log = 'ON';
Query OK, 0 rows affected (0.01 sec)

mysql> SHOW VARIABLES LIKE '%general%';
+------------------+----------------+
| Variable_name    | Value          |
+------------------+----------------+
| general_log      | ON             |
| general_log_file | WIN11-ROOT.log |
+------------------+----------------+
2 rows in set, 1 warning (0.01 sec)

如果不指定存储路径,通用查询日志将默认存储到 MySQL 数据库的数据文件夹下。如果不指定文件名,默认文件名为 hostname.log,其中 hostname 表示主机名。
开启通用查询日志后,执行一些操作来验证。

mysql> use lagou1;
Database changed
mysql> select * from lagou1.position;
+--------------------+--------------+--------+------+
| Id                 | name         | salary | city |
+--------------------+--------------+--------+------+
| 647882414097432576 | 测试工程师1  | 100000 | 上海 |
| 647882415951314944 | 测试工程师3  | 100000 | 上海 |
| 647882416190390272 | 测试工程师5  | 100000 | 上海 |
| 647882416429465600 | 测试工程师7  | 100000 | 上海 |
| 647882416639180800 | 测试工程师9  | 100000 | 上海 |
| 647882416819535872 | 测试工程师11 | 100000 | 上海 |
| 647882416991502336 | 测试工程师13 | 100000 | 上海 |
| 647882417180246016 | 测试工程师15 | 100000 | 上海 |
| 647882417377378304 | 测试工程师17 | 100000 | 上海 |
| 647882417566121984 | 测试工程师19 | 100000 | 上海 |
+--------------------+--------------+--------+------+
10 rows in set (0.00 sec)

执行完毕后,打开通用查询日志,查看刚才对应的操作:

C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqld.exe, Version: 5.7.35-log (MySQL Community Server (GPL)). started with:
TCP Port: 3306, Named Pipe: MySQL
Time Id Command Argument
2021-09-24T11:18:16.583794Z 631 Query SHOW VARIABLES LIKE '%general%'
2021-09-24T11:19:49.685773Z 631 Query SELECT DATABASE()
2021-09-24T11:19:49.686303Z 631 Init DB lagou1
2021-09-24T11:20:03.900882Z 631 Query select * from lagou1.position


通用查询日志启动后,可以通过两种方法停止该日志。一种是将 MySQL 配置文件中的相关配置注释掉,然后重启服务器,来停止通用查询日志。另一种就是设置 MySQL 的环境变量 general_log 为关闭状态。

SET GLOBAL general_log = 'OFF';

二进制日志

二进制日志也可叫作变更日志(Update Log),是 MySQL 中非常重要的日志。主要用于记录数据库的变化情况,即 SQL 语句的 DDL 和 DML 语句,不包含数据记录查询操作。
如果 MySQL 数据库意外停止,可以通过二进制日志文件来查看用户执行了哪些操作,对数据库服务器文件做了哪些修改,然后根据二进制日志文件中的记录来恢复数据库服务器。
默认情况下,二进制日志功能也是关闭的。可以通过在配置文件中添加 log-bin 选项来开启二进制日志,格式如下:

[mysqld]
log-bin=dir/[filename]

其中,dir 参数指定二进制文件的存储路径;filename 参数指定二进制文件的文件名,其形式为 filename.number,number 的形式为 000001、000002 等。如果没有 dir 和 filename 参数,二进制日志将默认存储在数据库的数据目录下,默认的文件名为 hostname-bin.number,其中 hostname 表示主机名。
例如,我指定文件名为 mysqlbinlog

log-bin=mysqlbinlog

每次重启 MySQL 服务后,都会生成一个新的二进制日志文件,这些日志文件的文件名中 filename 部分不会改变,number 会不断递增。
binlog

慢查询日志

慢查询日志用来记录在 MySQL 中执行时间超过指定时间的查询语句。通过慢查询日志,可以查找出哪些查询语句的执行效率低,以便进行优化。出于性能方面的考虑,一般只有在排查慢 SQL、调试参数时才会开启,默认情况下,慢查询日志功能是关闭的。

mysql> SET GLOBAL slow_query_log=ON;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like '%slow_query%';
+---------------------+---------------------+
| Variable_name       | Value               |
+---------------------+---------------------+
| slow_query_log      | ON                  |
| slow_query_log_file | WIN11-ROOT-slow.log |
+---------------------+---------------------+
2 rows in set, 1 warning (0.00 sec)

参数说明:

  • slow_query_log:慢查询开启状态。
  • slow_query_log_file:慢查询日志存放的位置(一般设置为 MySQL 的数据存放目录)。
  • long_query_time:查询超过多少秒才记录。
mysql> SHOW VARIABLES LIKE 'long_query_time';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set, 1 warning (0.00 sec)

mysql> SHOW VARIABLES LIKE 'slow_query_log';
+----------------+-------+
| Variable_name  | Value |
+----------------+-------+
| slow_query_log | ON    |
+----------------+-------+
1 row in set, 1 warning (0.00 sec)

mysql> SHOW VARIABLES LIKE 'slow_query_log_file';
+---------------------+---------------------+
| Variable_name       | Value               |
+---------------------+---------------------+
| slow_query_log_file | WIN11-ROOT-slow.log |
+---------------------+---------------------+
1 row in set, 1 warning (0.00 sec)

参考

MySQL 5.7 官方文档
segmentfault
打赏
评论区
头像
文章目录