MySQL 日志配置

前段时间接到一个安全等保的问题,其目的是开启 MySQL 日志记录,为此专门去看了看 MySQL到底有多少种日志记录,关于 MySQL 的日志记录在官方文档中有详细的介绍,这里做下简单的梳理介绍。

日志总览

MySQL8.0官网中 MySQL 有以下几类日志类型:

日志类型 记录信息
错误日志 启动、运行或停止 mysqld 时的问题
通用查询日志 已建立的客户端连接信息和从客户端收到的语句
二进制日志 更改数据的语句(也用于复制)
中继日志 从复制源服务器接收的数据更改
慢查询日志 输出执行时间超过 long_query_time 配置的查询
DDL 日志(元数据日志 DDL 语句执行的元数据操作

其中 DDL日志 由 MySQL 自行创建管理,没有开放给用户可配置使用,所以这里只介绍其它几种日志的配置。

错误日志

官方术语 Error Log,包含mysqld 启动和关闭时间的记录和诊断消息,例如在服务器启动和关闭期间以及在服务器运行期间发生的错误、警告和注释。

开启错误日志需要配置 log_error 变量,该变量控制错误日志的输出目标,可以有如下两种

  • stderr,输出至控制台
  • 文件路径,输出至指定的文件,如果文件名不带 err 后缀则自动追加 err

示例配置如下

1
2
3
[msyqld]
# 指定输出文件路径
log_error=/tmp/mysql

则可以在 /tmp 目录下找到 mysql.err 的文件

通用查询日志

官方术语 General Query Log,当客户端连接或断开连接时,服务器将信息写入此日志,并记录从客户端接收到的每个 SQL 语句。

默认情况下,该日志为关闭状态,但如果怀疑客户端出现错误想确切了解客户端发送到mysqld的内容时,可以通过设置 general_log 进行开启,并通过general_log_file指定日志文件的名称

如果没有为通用查询日志文件指定名称,则默认名称为 host_name.log ,输出至数据目录中,除非给出绝对路径名来指定不同的目录。

示例配置如下

1
2
3
4
5
[msyqld]
# 开启通用查询日志,值为 1 或 on
general_log=1
# 指定输出文件路径
general_log_file=/tmp/general.log

可以在 /tmp/general.log 中看到如下类似内容

1
2
3
4
5
/usr/sbin/mysqld, Version: 8.0.27 (MySQL Community Server - GPL). started with:
Tcp port: 3306 Unix socket: /var/run/mysqld/mysqld.sock
Time Id Command Argument
2022-09-25T02:22:09.485028Z 8 Connect [email protected] on using TCP/IP
2022-09-25T02:22:09.631729Z 8 Query SELECT NOW()

二进制日志

官方术语 Binary Log,包含描述数据库更改的事件,例如表或者数据的增删改,有两个重要用途:

  • 主从复制,主库记录日志并发送给从库,从库解析重放日志,达到复制的目的
  • 数据恢复,数据恢复后可根据之前的日志重新同步至最新数据

二进制日志有三种格式

  • 基于语句的 STATEMENT
    • 优点:只记录语句,日志内容小,存储和网络开销少
    • 缺点:一致性差
  • 基于行数据 ROW
    • 优点:记录行数据,一致性强
    • 缺点:影响数据过多时,存储和网络开销大
  • 以上两种的 MIXED,由 MySQL规则判断采用 STATEMENT 还是 ROW

通用查询日志无法记录 ROW 类型的数据,因此在从库中重放的 ROW 和部分的 MIXED 将无法体现在通用查询日志中

默认安装下开启,但如果是手动初始化数据目录则不会开启,此时可以通过配置环境变量log-bin开启,示例如下:

1
2
3
4
5
6
7
[msyqld]
# 5.7必须配置,8.0默认为1
server_id=1
# 开启二进制日志
log_bin=/tmp/mysql.bin
# 指定二进制日志格式,默认:ROW
binlog_format=MIXED

慢查询日志

官方术语 Slow Query Log,记录执行时间超过 long_query_time 秒且至少 min_examined_row_limit 需要检查行的 SQL 语句组成。慢查询日志可用于查找需要很长时间执行的查询,是SQL优化追踪的好帮手。

默认情况下,慢查询日志是关闭的,可通过 slow_query_log 开启,示例配置如下:

1
2
3
4
5
6
7
8
9
10
# 开启慢查询日志,值:1 或 ON
slow_query_log=1
# 指定输出文件
slow_query_log_file=/tmp/mysql-slow.log
# 时间控制,单位秒,少于指定秒数的语句不被记录
long_query_time=3
# 行数控制,少于指定行的慢查询不会被记录
min_examined_row_limit=0
# 记录未使用索引语句,默认关
log_queries_not_using_indexes=ON

中继日志

官方术语 Relay Log,与二进制日志一样,由一组编号的文件组成,其中包含描述数据库更改的事件,以及一个包含所有使用的中继日志文件名称的索引文件。

中继日志文件的默认位置是数据目录。默认的中继日志文件和中继日志索引文件名和位置可以分别用 relay_logrelay_log_index 系统变量覆盖,这里暂不做介绍。

输出至表

通用查询日志慢查询日志除了输出日志至文件也支持写入表中存储,示例配置如下:

1
2
3
4
5
6
# 指定输出形式 TABLE,FILE,NONE
log_output=TABLE
# 开启通用查询日志
general_log=1
# 开启慢查询日志
slow_query_log=1

通用查询日志将存放在 mysql.general_log ,慢查询日志将存放在 mysql.slow_log

log_output可以多选配置,可同时支持文件和表格存储

1
2
3
4
5
6
7
log_output=TABLE,FILE
# 开启通用查询日志
general_log=1
general_log_file=/tmp/general.log
# 开启慢查询日志
slow_query_log=1
slow_query_log_file=/tmp/mysql-slow.log

写在最后

关于 MySQL 日志部分算是简单的归纳下,日志作为日常工作重要的排错调优手段,了解 MySQL 日志还是很有必要,希望这篇博客可以帮助到大家。