MySQL 日志配置
前段时间接到一个安全等保的问题,其目的是开启 MySQL 日志记录,为此专门去看了看 MySQL到底有多少种日志记录,关于 MySQL 的日志记录在官方文档中有详细的介绍,这里做下简单的梳理介绍。
日志总览
在MySQL8.0
官网中 MySQL 有以下几类日志类型:
日志类型 | 记录信息 |
---|---|
错误日志 | 启动、运行或停止 mysqld 时的问题 |
通用查询日志 | 已建立的客户端连接信息和从客户端收到的语句 |
二进制日志 | 更改数据的语句(也用于复制) |
中继日志 | 从复制源服务器接收的数据更改 |
慢查询日志 | 输出执行时间超过 long_query_time 配置的查询 |
DDL 日志(元数据日志 | DDL 语句执行的元数据操作 |
其中 DDL日志
由 MySQL 自行创建管理,没有开放给用户可配置使用,所以这里只介绍其它几种日志的配置。
错误日志
官方术语 Error Log,包含mysqld 启动和关闭时间的记录和诊断消息,例如在服务器启动和关闭期间以及在服务器运行期间发生的错误、警告和注释。
开启错误日志需要配置 log_error
变量,该变量控制错误日志的输出目标,可以有如下两种
- stderr,输出至控制台
- 文件路径,输出至指定的文件,如果文件名不带
err
后缀则自动追加err
示例配置如下
1 | [msyqld] |
则可以在 /tmp
目录下找到 mysql.err
的文件
通用查询日志
官方术语 General Query Log,当客户端连接或断开连接时,服务器将信息写入此日志,并记录从客户端接收到的每个 SQL 语句。
默认情况下,该日志为关闭状态,但如果怀疑客户端出现错误想确切了解客户端发送到mysqld的内容时,可以通过设置 general_log
进行开启,并通过general_log_file
指定日志文件的名称
如果没有为通用查询日志文件指定名称,则默认名称为 host_name.log
,输出至数据目录中,除非给出绝对路径名来指定不同的目录。
示例配置如下
1 | [msyqld] |
可以在 /tmp/general.log
中看到如下类似内容
1 | /usr/sbin/mysqld, Version: 8.0.27 (MySQL Community Server - GPL). started with: |
二进制日志
官方术语 Binary Log,包含描述数据库更改的事件
,例如表或者数据的增删改
,有两个重要用途:
- 主从复制,主库记录日志并发送给从库,从库解析重放日志,达到复制的目的
- 数据恢复,数据恢复后可根据之前的日志重新同步至最新数据
二进制日志有三种格式
- 基于语句的
STATEMENT
- 优点:只记录语句,日志内容小,存储和网络开销少
- 缺点:一致性差
- 基于行数据
ROW
- 优点:记录行数据,一致性强
- 缺点:影响数据过多时,存储和网络开销大
- 以上两种的
MIXED
,由MySQL
规则判断采用STATEMENT
还是ROW
通用查询日志无法记录 ROW
类型的数据,因此在从库中重放的 ROW
和部分的 MIXED
将无法体现在通用查询日志中
默认安装下开启,但如果是手动初始化数据目录则不会开启,此时可以通过配置环境变量log-bin
开启,示例如下:
1 | [msyqld] |
慢查询日志
官方术语 Slow Query Log,记录执行时间超过 long_query_time
秒且至少 min_examined_row_limit
需要检查行的 SQL 语句组成。慢查询日志可用于查找需要很长时间执行的查询,是SQL优化追踪的好帮手。
默认情况下,慢查询日志是关闭的,可通过 slow_query_log
开启,示例配置如下:
1 | # 开启慢查询日志,值:1 或 ON |
中继日志
官方术语 Relay Log,与二进制日志一样,由一组编号的文件组成,其中包含描述数据库更改的事件,以及一个包含所有使用的中继日志文件名称的索引文件。
中继日志文件的默认位置是数据目录。默认的中继日志文件和中继日志索引文件名和位置可以分别用 relay_log
和 relay_log_index
系统变量覆盖,这里暂不做介绍。
输出至表
通用查询日志、慢查询日志除了输出日志至文件也支持写入表中存储,示例配置如下:
1 | # 指定输出形式 TABLE,FILE,NONE |
通用查询日志将存放在 mysql.general_log
,慢查询日志将存放在 mysql.slow_log
log_output
可以多选配置,可同时支持文件和表格存储
1 | log_output=TABLE,FILE |
写在最后
关于 MySQL
日志部分算是简单的归纳下,日志作为日常工作重要的排错调优手段,了解 MySQL
日志还是很有必要,希望这篇博客可以帮助到大家。