MySQL 中的日志体系,主要包含两大类,7 种日志:
- 第一类:与 SQL 执行相关的,包括
Binlog(二进制日志)
、Redo Log(重做日志)
、Undo Log(撤销日志)
、Relay Log(中继日志)
。其中,Relay Log 也是一种特殊的 Binlog。 - 第二类:与 MySQL 运行相关的,包括
Slow Query Log(慢查询日志)
、General Query Log(通用查询日志)
、Error Log(错误日志)
各种日志的作用,概述如下:
- Binlog:记录数据库中的 DML、DDL 事件,以用于数据库恢复、主从复制以及数据库审计。
- Redo Log:记录数据库中的修改,以用于 MySQL 实例的崩溃恢复。
- Undo Log:用于保存数据修改前镜像,为用户提供一致性读。
- Relay Log:用于主从复制拓扑中,副本库存储中主库接收到的 Binlog,以应用于从库,实现主从复制。
- Slow Query Log:用于捕获和记录 MySQL 中的慢查询,为数据库优化提供参考。
- General Query Log:用于记录数据库中所有执行过的 SQL。
- Error Log:用于记录 mysqld 进程运行的详细信息。
1. Binary Log(二进制日志)
binlog 日志:记录了对 MySQL 数据库执行更改的所有操作,如 DML、DDL。但不会记录 SELECT、SHOW 这些不修改数据的操作,可通过 General Query Log
记录这类操作。
Binlog 的两个重要用途:
- 对于复制:复制源服务器上的二进制日志提供了要发送到副本的数据更改记录。将 MySQL Master 端的 binlog 发送至 Slave 端,Slave 端 Replay binlog 中的内容,以达到主从同步的目的。
- 用于恢复:当使用备份文件恢复了数据库后,通过应用 binlog 文件,能实现基于时间点的恢复。
- 用于审计:通过对 binlog 中的事件进行审计,审计用户的行为。
1.1. 设置 binlog
常用的 binlog 相关系统参数如下表:
系统参数 | 取值 | 作用域 | 动态修改 | 说明 |
---|---|---|---|---|
log_bin | ON(默认值) OFF 或 具体路径及前缀名 |
Global | N | 是否启用 binlog。也可指定 binlog 的路径及文件名前缀(basename)。 ON 表示启用 binlog,并保存在 data 目录下,前缀 [HOST_NAME]-bin.[序号] 。 |
log_bin_basename | 默认 binlog 或 [HOST_NAME]-bin. |
Global | N | 指定 binlog 文件的路径及 basename 。未提供 log_bin 时,默认为 binlog 。指定 log_bin ,但未指定路径时,默认为 [HOST_NAME]-bin. |
log_bin_index | 具体路径及前缀名 | Global | N | 保存 binlog 索引文件的路径及 basename 。 |
max_binlog_size | 1073741824(默认值,1G) 取值范围: [4096,1073741824] |
Global | Y | 用于控制每个 Binlog 文件的大小。 若启用加密,则 max_relay_log_size 包含加密 binlog 的 512 字节文件头。 若 max_relay_log_size 为 0,则 max_binlog_size 也适用于 max_relay_log_size |
binlog_cache_size | 32768(默认值 32K) $2^{32}$-1(32 位系统最大值) $2^{64}$-1(64 位系统最大值) |
Global | Y | 在事务期间保存 binlog 更改的内存缓冲区(binlog cache)的大小。 |
max_binlog_cache_size | 最大值:4GB(推荐) 最小值:4096(4K) |
Global | Y | 用于限制事务能使用的最大 binlog 缓存区。 因 MySQL 无法处理过大的 binary log positions,因此建议最大值 4G。 |
binlog_error_action | ABORT_SERVER(默认值):MySQL 服务中断 IGNORE_ERROR:忽略 binlog 错误 |
Global | Y | 确定 binlog 出错时的行为。 |
binlog-do-db | schema 名称 多个值需指定多行 |
- | N | 指定记录 binlog 的 schema 名称。 |
binlog-ignore-db | schema 名称 多个值需指定多行 |
- | N | 指定不记录 binlog 的 schema 名称。 |
log_replica_updates | ON (默认值):副本库记录 binlog OFF:副本库不记录 binlog |
Global | N | 指定副本服务器从复制源服务器接收到的更新是否记录到副本自己的 binlog 中。 从 MySQL 8.0.26 开始,使用 log_replica_updates 代替 log_slave_updates |
log_bin_trust_function_creators | OFF(默认值):禁止创建存储函数 ON:允许创建存储函数 |
Global | Y | 当启用 binlog 时,此参数适用。用于控制是否允许具有 CREATE ROUTINE 或 ALTER ROUTINE 权限的用户创建函数、存储过程及触发器。 |
binlog_expire_logs_auto_purge | ON(默认值):启用自动清除 binlog OFF:禁用自动清除 |
Global | Y | 启用或禁用 binlog 文件的自动清除。 |
binlog_expire_logs_seconds | 2592000(默认值,30天) |
Global | Y | 以秒为单位设置 binlog 的保留时长。设置为0时,则禁用自动清除。 |
binlog_format | ROW(默认值):记录块变更 STATEMENT:记录 SQL 语句 MIXED:默认记录 SQL 语句,遇不确定函数时,记录块变更 |
BOTH | Y | 用于设置 binlog 记录内容的格式。 |
sync_binlog | 1(默认值):每个事务同步; 0:由 OS 同步 N:每 N 个事务同步。 |
Global | Y | 用于控制 MySQL 实例将 binlog 同步到磁盘的频率。 |
- 在启用 GTID 后,若 binlog 达到最大值时无法访问
mysql.gtid_executed
以写入 GTID,则无法切换 binlog 文件。服务器会根据binlog_error_action
的设置做出响应。 - MySQL 8.0.29+ 可通过设置
binlog_expire_logs_auto_purge =OFF
来禁用 binlog 自动清除;在 MySQL 8.0.28 及更早版本中,可通过设置binlog_expire_logs_seconds = 0
来禁用 binlog 自动清除。 sync_binlog
用于控制 binlog cache 同步到磁盘的频率。- 0:MySQL 实例依赖操作系统不定期地将 binlog 刷新到磁盘,性能佳,安全性差。若事务提交后,操作系统同步 binlog 之前系统宕机,可能会丢失此期间的 binlog。不适用基于 binlog 主从复制的场景。
- 1:在每个事务提交之前,将 binlog 同步至磁盘。安全性高,性能略差(增加磁盘 IO)。若服务器在事务提交前,同步 binlog 之后意外退出,事务将在重启后回滚,但仍然存在于 binlog 中。在 MySQL 8.0 中,InnoDB 通过始终启用 XA 事务中对两阶段提交的支持,确保 binlog 和 InnoDB 数据文件同步。
- N:在成功提交 N 个事务后,再将 binlog 同步至磁盘。较高的值可提高性能(减少磁盘 IO),但会增加 binlog 丢失的风险。若事务提交后,同步 binlog 之前系统宕机,可能会丢失 N 个事务的 binlog。不适用 基于 binlog 主从复制的场景。
binlog_format
用于设置 binlog 记录内容的格式。- ROW(默认值):binlog 文件中记录的为数据表的行变更,类似于 Oracle 的物理 Dataguard。
- STATEMENT:binlog 文件中记录的为数据变更的 SQL 语句,类似于 Oracle 的逻辑 Dataguard。
- MIXED:binlog 文件默认采用
STATEMENT
格式记录日志,当遇到UUID()
、USER()
、CURRENT_USER()
等不确定性函数时,以 ROW 格式记录日志。
log-bin = /mysql/bin-log/mysql-bin # binlog 文件名格式为 mysql-bin.[序号],如 mysql-bin.000001、mysql-bin.000002 max_binlog_size = 1G # 设置每个 binlog 文件大小,默认值及最大值均为 1G binlog_format = row sync_binlog = 1 # 在每个事务提交前,刷新 binlog cache 到磁盘文件。 binlog_cache_size = 32K # 每个事务执行期间,为其分配的 binlog cache 大小 max_binlog_cache_size = 4GB # 每个事务执行期间,可适用的 binlog cache 最大值 binlog_expire_logs_auto_purge = 1 # 自动清除 binlog 文件。默认:1(ON) binlog_expire_logs_seconds = 172800 # 以秒为单位,设置 binlog 文件保留时长。默认值:2592000(30 天) binlog_do_db = etl_rig binlog_do_db = etl_cyc binlog_ignore_db = mysql binlog_ignore_db = information_schema binlog_ignore_db = performation_schema binlog_ignore_db = sys
复制
1.2. 优化 binlog
binlog_cache_size
系统参数(默认:32 位系统中 $2^{32}$-1;64 位系统中 $2^{64}$-1, 可动态修改)用于指定在事务执行期间保存 binlog 更改的内存缓冲区(binary log cache)的大小。若事务数据超过 binlog_cache_size 的值,超出的部分将存储到磁盘临时文件中,直到事务结束时再自动删除临时文件。binlog_cache_use
状态变量显示了使用binlog_cache_size
的事务数(含临时文件)。binlog_cache_disk_use
状态变量显示了使用临时文件的事务数,binlog_cache_use
与binlog_cache_disk_use
相结合,可用于系统参数binlog_cache_size
的调优,以尽可能避免使用磁盘文件。
show global status like 'Binlog_cache_%';
复制
max_binlog_cache_size
系统参数(默认 $2^{64}$-1,因 MySQL 无法处理过大的 binary log positions,因此建议最大值 4G,可动态修改)用于限制事务能使用的最大 binlog 缓存区。最小值 4096(4K)。
1.3. 解析 binlog
mysqlbinlog 是 mysql 原生自带的 binlog 解析工具,速度快而且可以配合管道命令过滤数据,适合解析大量 binlog 文件。
常用命令:
mysqlbinlog --no-defaults --base64-output=decode-rows -vv /mysql-data/bin-log/mysql-bin.002894 > 002894.log mysqlbinlog --no-defaults --base64-output=decode-rows -vv --database das --base64-output=decode-rows /mysql-data/bin-log/mysql-bin.002894 > 002894.log
复制
选项说明:
--no-defaults
避免unknown variable 'default-character-set=utf8mb4'
的报错。--base64-output=decode-rows -vv
显示具体 SQL 语句。--database das
只解析 das 数据库的 binlog。--skip-gtids=true
忽略 GTID 显示。
1.4. 管理 binlog
1.4.1. 禁用 binlog
在 MySQL 配置文件 my.cnf
中指定系统参数 log_bin=0
即可禁用 binlog。
1.4.2. 清理 binlog
通过 PURGE BINARY LOGS
可清理特定的 binlog。
- 按时间点,清理 binlog
mysql> PURGE BINARY LOGS TO 'mysql-bin.010'; # 清理 mysql-bin.010 文件之前的 binlog
mysql> PURGE BINARY LOGS BEFORE '2019-04-02 22:46:26'; # 清理 2019-04-02 22:46:26 之前的 binlog
复制
- 清空 binlog
RESET MASTER
(需 reload 权限) 删除所有现有的 binlog 文件并重置 binlog 索引文件,将服务器重置为 binlog 记录开始之前的状态。创建一个序号为 1 的空 binlog 文件,以便可重新启动 binlog 记录。若为 RESET MASTER TO <N>
指定非 1 的数值,则会创建一个以 N 开始的空 binlog 日志。
## 重置 binlog,并新建一个序号为 1 的空 binlog
mysql> RESET MASTER;
## 重置 binlog,并新建一个序号为 10 的空 binlog
mysql> RESET MASTER TO 10;
复制
RESET MASTER
除了会重置 binlog 之外,还会重置 GTID 执行历史记录。 将 gtid_purged 系统参数设置为空字符串(’’),gtid_executed 系统参数设置为空字符串,mysql.gtid_executed 表被清空。
1.5. mysql 系统表的 binlog 记录
mysql 系统库中的权限表(如 mysql.user 表),根据 SQL 语句的不同,采取不同的 binlog 记录方式:
- INSERT, UPDATE, DELETE, REPLACE, DO, LOAD DATA, SELECT, 和 TRUNCATE TABLE.
根据 binlog_format 系统参数的设置,直接记录权限表中的数据变更。
- GRANT, REVOKE, SET PASSWORD, RENAME USER, CREATE USER
忽略 binlog_format 系统参数的设置,在 binlog 中以 statements 方式记录权限表中的数据变更。
1.6. binlog 事务压缩
从 MySQL 8.0.20 开始,可以为 MySQL 实例启用 binlog 事务压缩。当 binlog 事务压缩时,事务负载(transaction payloads
)使用 zstd 算法进行压缩,然后作为单个事件(Transaction_payload_event)写入服务器的 binlog 文件。
在主从复制拓扑中,源库压缩的事务负载以压缩的状态传输至副本库的 Relay Log 中,为复制拓扑节省了网络带宽和空间占用。在主从复制拓扑中,压缩的事务负载(Transaction_payload_event)由副本库的 SQL thread 线程解压,并应用到副本库。 在通过 mysqlbinlog 恢复数据库时,压缩的事务负载(Transaction_payload_event)由 mysqlbinlog 解压并应用到数据库中。
系统参数 | 取值 | 作用域 | 动态修改 | 说明 |
---|---|---|---|---|
binlog_transaction_compression | 0或OFF(默认值) 1或ON |
BOTH | Y | 指定是否为写入服务器上的 binlog 的事务启用压缩。 |
binlog_transaction_compression_level_zstd | 3(默认值) 1至22的整数值,数值越大,压缩比越高。 |
BOTH | Y | 指定 zstd 压缩算法的级别。从 1(最低效果)到 22(最高效果) |
2. Relay Log(中继日志)
Relay Log 用于在主从复制拓扑环境中,副本库(I/O 线程)存储从源库(Binlog dump 线程)接收到的 binlog;Relay log 由副本库的 SQL 线程读取并应用到副本库,实现主从同步。

副本库的 Relay log 与源库的 Binlog 内容格式相同,可通过 mysqlbinlog 读取。从 MySQL 8.0.20 开始,若源库启用了 Binlog 事务压缩,则副本库中的 Relay Log 同样启用事务压缩。
Relay Log 由一组含编号的 Relay log 文件,以及一个跟踪当前正在使用的 Relay Log 文件的索引文件(Index)组成。
- 对于默认复制通道,Relay log 文件名默认格式为
host_name-relay-bin.nnnnnn
,其中host_name
为主机名,nnnnnn
为从 000001 开始的序列号。默认通道的索引文件名为host_name-relay-bin.index
。 - 对于非默认复制通道,默认 basename 是
host_name-relay-bin-[channel]
,其中channel
为通道名。索引文件名为host_name-relay-bin-[channel].index
。
2.1. Relay Log 配置
系统参数 | 取值 | 范围 | 动态修改 | 说明 |
---|---|---|---|---|
relay_log | [host_name ]-relay-bin(默认通道的默认值)[] host_name ]-relay-bin-[channel ](非默认通道的默认值) |
Global | N | 可指定 Relay Log 的路径及文件名前缀(basename)。 参数值也将作为索引文件的文件名前缀,可设置 relay_log_index 参数覆盖此行为。 |
relay_log_basename | [host_name ]-relay-bin(默认值):默认位于 data 目录 |
Global | N | 指定 Relay Log 的文件路径及文件名前缀(basename)。 |
relay_log_index | [host_name ]-relay-bin.index(默认值) |
Global | N | 指定 Relay Log 的索引文件名称,默认为 relay_log 参数指定的值。设置 relay_log_index 可明确指定索引文件路径及文件名。 |
3. Redo Log(重做日志)
InnoDB Redo Log 类似于 Oracle 中的 Redo Log,用于 MySQL 实例的崩溃恢复。
3.1. 配置 Redo Log
3.1.1. MySQL 8.0.30 或更高版本
- 文件位置 innodb_log_group_home_dir
系统参数 innodb_log_group_home_dir(不能动态修改),定义了 Redo Log 文件的保存位置。如 innodb_log_group_home_dir=/mysql/redo-log
时,则 Redo Log 文件位于 /mysql/redo-log/#innodb_redo
目录中。若未指定 innodb_log_group_home_dir
参数,则 Redo Log 文件默认位于数据目录中的 #innodb_redo
子目录中。
[root@mysql8 ~]# cat /etc/my.cnf |grep log_group
innodb_log_group_home_dir = /mysql/redo-log/
[root@mysql8 ~]# ls /mysql/redo-log/#innodb_redo/
#ib_redo10_tmp #ib_redo17_tmp #ib_redo24_tmp #ib_redo31_tmp #ib_redo6
#ib_redo11_tmp #ib_redo18_tmp #ib_redo25_tmp #ib_redo32_tmp #ib_redo7_tmp
#ib_redo12_tmp #ib_redo19_tmp #ib_redo26_tmp #ib_redo33_tmp #ib_redo8_tmp
#ib_redo13_tmp #ib_redo20_tmp #ib_redo27_tmp #ib_redo34_tmp #ib_redo9_tmp
#ib_redo14_tmp #ib_redo21_tmp #ib_redo28_tmp #ib_redo35_tmp
#ib_redo15_tmp #ib_redo22_tmp #ib_redo29_tmp #ib_redo36_tmp
#ib_redo16_tmp #ib_redo23_tmp #ib_redo30_tmp #ib_redo37_tmp
复制
- 文件数量及容量 innodb_redo_log_capacity
从 MySQL 8.0.30
开始,innodb_redo_log_capacity 系统参数(默认104857600,单位字节,即1G)控制 Redo Log 文件占用的磁盘空间量。可通过 SET GLOBAL
语句动态修改,立即生效。
## 设置 Redo Log
SET GLOBAL innodb_redo_log_capacity = 2*1024*1024*1024;
复制
若指定了 innodb_redo_log_capacity
参数,MySQL 实例会维护 32
个 Redo Log
文件。其中,正在使用的 Redo Log 文件名称格式为 #ib_redo<N>
,而备选待用的 Redo Log 文件名格式为 #ib_redo<N>_tmp
。每个 Redo Log 大小为 innodb_redo_log_capacity/32
。
若未指定 innodb_redo_log_capacity
参数,innodb_redo_log_capacity
= innodb_log_files_in_group
x innodb_log_file_size
。
若 innodb_redo_log_capacity
、 innodb_redo_log_capacity
、 innodb_log_files_in_group
均未指定,则 Redo Log 容量为 innodb_redo_log_capacity
的默认值 104857600
,即 1G。
- performance_schema.innodb_redo_log_files
MySQL 8.0.30 或更高版本中,可通过系统视图 performance_schema.innodb_redo_log_files
查看 MySQL 实例中的 Redo Log 文件。
mysql> SELECT FILE_NAME, START_LSN, END_LSN FROM performance_schema.innodb_redo_log_files;
+----------------------------------------+-----------+-----------+
| FILE_NAME | START_LSN | END_LSN |
+----------------------------------------+-----------+-----------+
| /mysql/redo-log/#innodb_redo/#ib_redo6 | 632893952 | 636168704 |
+----------------------------------------+-----------+-----------+
1 row in set (0.00 sec)
复制
3.1.2. MySQL 8.0.30 之前
- 文件位置 innodb_log_group_home_dir
若未指定 innodb_log_group_home_dir
参数,则 Redo Log 默认保存在数据目录(由参数 datadir
控制)中。若指定了 innodb_log_group_home_dir
参数,Redo Log 文件位于该参数指定目录中。
- 文件数量及容量
在 MySQL 8.0.30
之前,InnoDB 默认在数据目录中创建两个名为 ib_logfile0
和 ib_logfile1
的 Redo Log文件,并循环使用。
innodb_log_file_size 系统参数定义了每个 Redo Log 文件的大小(默认为 50331648
,单位字节,即 50MB)。
innodb_log_files_in_group 系统参数定义了 Redo Log 文件的数量(默认为 2)。
innodb_log_file_size
与 innodb_log_files_in_group
均不支持动态修改,需在 my.cnf 配置文件中指定或者以 mysqld 的命令行格式(--innodb-log-file-size=#
、--innodb-log-files-in-group=#
)指定。
[mysql@samp-01 ~]$ cat /etc/my.cnf |grep innodb_log innodb_log_group_home_dir = /mysql/redo-log/ innodb_log_files_in_group = 5 innodb_log_file_size = 1G innodb_log_buffer_size = 128M
复制
3.1.3. 自动 Redo 容量配置
当启用 innodb_dedicated_server 后,InnoDB 会自动配置 innodb_buffer_pool_size
、innodb_redo_log_capacity
(或 innodb_log_file_size
、innodb_log_files_in_group
)、innodb_flush_method
。
3.2. Redo Log 缓冲区
系统参数 innodb_log_buffer_size (MySQL8.0 可动态修改)用于设置 Redo Log 缓冲区(log buffer)的大小(默认 16777216
,单位字节,即 16MB)。若系统中常有 DML 操作多行的大事务,可调高 innodb_log_buffer_size
参数值,以节省磁盘 I/O。
mysql> SET PERSIST innodb_log_buffer_size = 16*1024*1024;
mysql> SHOW GLOBAL variables LIKE '%log_buffer%';
+------------------------+----------+
| Variable_name | Value |
+------------------------+----------+
| innodb_log_buffer_size | 16777216 |
+------------------------+----------+
1 row in set (0.00 sec)
复制
通过 SET PERSIST
设置的系统参数,会立即生效并以 json 格式被持久化到数据目录下的 mysqld-auto.cnf
文件中。可通过 SET PERSIST_ONLY
使修改的参数只在重启后生效;可通过 RESET PERSIST;
清空该文件中的所有配置,或 RESET PERSIST <VarName>;
只清空特定的系统参数。
3.3. Redo Log 禁用
当为新的 MySQL 实例导入数据时,为了提高导入速度,可通过命令 ALTER INSTANCE DISABLE INNODB REDO_LOG
禁用 Redo Log。导入完成后,再通过 ALTER INSTANCE ENABLE INNODB REDO_LOG
启用 Redo Log。
## 1. 禁用 Redo Log
ALTER INSTANCE DISABLE INNODB REDO_LOG;
## 2. 启用 Redo Log
ALTER INSTANCE ENABLE INNODB REDO_LOG;
## 3. 查看 Redo Log 状态
SHOW GLOBAL STATUS LIKE 'Innodb_redo_log_enabled';
复制
执行禁用/启用 Redo Log 需具有 INNODB_REDO_LOG_ENABLE
权限。
3.4. Redo Log 优化
- 增加 Redo Log 文件大小。当 InnoDB 将 Redo Log 文件写满时,需要将 Buffer Pool 中的修改写入磁盘。增加 Redo Log 文件大小,可减少不必要的磁盘写入。
8.0.30 开始,由系统参数 innodb_redo_log_capacity
控制 Redo Log 文件总大小,并维护 32 个 Redo Log 文件,每个大小为 1/32 * innodb_redo_log_capacity
。
8.0.30 之前,使用 innodb_log_file_size
和 innodb_log_files_in_group
变量配置重做日志文件的大小和数量。
-
innodb_flush_log_at_trx_commit
用于控制将redo log buffer
写入磁盘的策略:- 0:提交事务的时候,不立即把 redo log buffer 里的数据刷入磁盘文件里去,而是依靠 InnoDB 的主线程每秒执行一次刷新到磁盘。此时可能你提交事务了,结果 mysql 宕机了,然后此时内存里的数据全部丢失。
- 1(默认值):提交事务的时候,就必须把 redo log buffer 里的数据刷入磁盘文件里去,只要事务提交成功,那么 redo log 就必然在磁盘里了。注意,因为操作系统的“延迟写”特性,此时的刷入只是写到了操作系统的缓冲区中,因此执行同步操作才能保证一定持久化到了硬盘中。
- 2:提交事务的时候,把 redo 日志写入磁盘文件对应的 os cache 缓存里去,而不是直接进入磁盘文件,可能 1 秒后才会把 os cache 里的数据写入到磁盘文件里去。
-
innodb_log_buffer_size
系统参数用于控制 Redo Log Buffer 的大小(默认16777216
,单位字节,即 16MB)。在 MySQL 8.0 中可通过set
命令动态修改。大多数场景下,采用默认值即可。若有大型事务或大量并发小事务,可调大innodb_log_buffer_size
参数值,以减少不必要的磁盘 IO。 -
innodb_log_write_ahead_size
系统参数用于解决read-on-write
问题(默认为 8K)。需设置为操作系统 PageSize 的整数倍(建议为 2倍),否则会发生read-on-write
。 -
innodb_log_writer_threads
系统参数用于启用或禁用 Redo Log 专用写入线程,适用于从 MySQL 8.0.22+。设置为 1(启用),可提高高并发系统的性能;设置为 0(禁用),可提高低并发系统的性能。 -
优化等待刷新 Redo 的用户线程对 Spin 的使用(在 8.0.11 版本中引入,可动态调整)。
innodb_log_wait_for_flush_spin_hwm
若用户线程等待 Flush Redo Log 的时间超过此参数值(默认为 400 微秒)时,则直接进入 condition wait。若不超过此参数值,则进入 Spin 操作。innodb_log_spin_cpu_abs_lwm
系统参数定义最小 CPU 使用量,低于此值用户线程在等待 flush redo 时不再 spin。当 CPU 使用率低于此值,不进行 Spin 等待。该值表示为 CPU 多个核心的使用率总和。如默认值 80 是单个 CPU 内核的 80%;150 则表示在多核 CPU 中第一个核使用率为 100%,第二个核使用率为 50%。innodb_log_spin_cpu_pct_hwm
系统参数定义最大 CPU 使用量,超过该值用户线程在等待 flush redo 时不再 spin。该值表示为 mysqld 实际绑定的 CPU 内核的总处理能力的百分比。默认值为 50。如 4 核 CPU设置为 50 时,表示个 2 个核心为 100%。
【tips】
Spin(旋转)是一种通过不间断地测试(耗费 CPU)来查看一个资源是否变为可用状态的等待操作,用于仅需要等待很短的时间来等待所需资源的场景。使用 spin 这种“空闲循环(busy-loop)”来完成资源等待的方式要比通过上下文切换使线程转入睡眠状态的方式要高效得多。
spinlock 又称自旋锁,是实现保护共享资源而提出一种锁机制。如果 spinlock 已经被别的执行单元持有,调用者就一直循环在那里看是否该 spinlock 的持有者已经释放了锁。
4. Undo Log(撤销日志)
与 Oracle 类似,Undo Log 是与单个读写事务关联的 undo log record 的集合,可用于实例恢复时,回滚未提交的事务。undo log record 包含有关如何撤消事务对数据进行变更的信息。如果另一个事务需要一致性读时,则修改前的数据将从 undo log record 中检索。undo log 存在于 undo log segments 中,而 undo log segments 包含在 rollback segments 中。而 rollback segments 驻留在 undo tablespace 和全局临时表空间(global temporary tablespace)中。
驻留在全局临时表空间(global temporary tablespace)保存关于用户(user-defined)临时表 的 undo log。这些 undo log 仅用于服务器运行期间的事务回滚,不会记录 redo log(节省 IO)。
每个 MySQL 实例可创建多个 Undo Tablespace,但仅可创建 1 个全局临时表空间。
4.1. Undo Tablespace
4.1.1. 默认的 Undo Tablespaces
默认在 innodb_undo_directory 指定的位置创建 2 个名称为 undo_001 和 undo_002 的 Undo Tablespace。数据字典中对应的 undo 表空间名称为 innodb_undo_001和innodb_undo_002。
4.1.2. Undo Tablespaces 大小
在 MySQL 8.0.23 之前,undo 表空间的初始大小取决于 innodb_page_size 值。对于默认的 16KB 页面大小,初始撤消表空间文件大小为 10MiB。对于 4KB、8KB、32KB 和 64KB 页面大小,初始撤消表空间文件大小分别为 7MiB、8MiB、20MiB 和 40MiB。
从 MySQL 8.0.23 开始,初始 undo tablespace 大小通常为 16MiB,最大为 innodb_max_undo_log_size(默认 1073741824,1G)。若文件扩展大于 16MB,且前一次扩展发生在 1 秒内,则截断后的 undo tablespace 大小为 1/4 * innodb_max_undo_log_size
。
在 MySQL 8.0.23 之前,undo tablespace 一次扩展四个 extent。从 MySQL 8.0.23 开始,undo tablespace 至少扩展 16MB。为应对急剧增长,若前一次文件扩展发生 0.1 秒内,则文件扩展量会加倍(可能会发生多次,最大 256MB)。若前一次文件扩展在 0.1 秒之前,则扩展量将减半(可能出现多次,最小为 16MB)。若为 undo tablespace 定义了 AUTOEXTEND_SIZE 选项,则:
扩展量 = max{由上述逻辑确定的扩展量, AUTOEXTEND_SIZE}
。
4.1.3. 添加 Undo Tablespaces
一个 MySQL 实例最多可创建 127 个 Undo Tablespace。
- MySQL 8.0.14 之前
在 MySQL 8.0.14 之前,需通过配置 innodb_undo_tablespaces 系统参数来添加额外的 undo tablespace。从 MySQL 8.0.14 开始,此系统参数已弃用且不可配置。
- MySQL 8.0.14+
从 MySQL 8.0.14 开始,可使用 SQL 创建额外的撤消表空间。
CREATE UNDO TABLESPACE tablespace_name ADD DATAFILE 'file_name.ibu';
复制
文件名必须以 .ibu
为后缀,并不允许指定为相对路径。若指定绝对路径,需要为系统参数 innodb_directories
中定义的值。innodb_data_home_dir
、innodb_undo_directory
和 datadir
系统参数定义的目录会自动附加到 innodb_directories
中。
若文件名中不含路径,则在 innodb_undo_directory
定义的目录中创建 undo tablespace。若该参数未定义,则在数据目录(datadir
)中创建 undo tablespace。
SELECT TABLESPACE_NAME, FILE_NAME FROM INFORMATION_SCHEMA.FILES
WHERE FILE_TYPE LIKE 'UNDO LOG';
复制
4.1.4. 删除 Undo Tablespaces
- MySQL 8.0.14 之前
(1)先慢关闭(slow shutdown)MySQL实例;(2)修改 innodb_undo_tablespaces 设置,以从 active undo tablespaces
列表中删除 undo tablespaces;(3)手动删除 undo tablespace 文件。
- MySQL 8.0.14 开始
(1)标记 undo tablespaces 表空间为 INACTIVE
。(2)查询 undo tablespaces 表空间状态。(3)删除 undo tablespaces。
## 1. 标记 undo tablespaces 为 INACTIVE
ALTER UNDO TABLESPACE <tablespace_name> SET INACTIVE;
## 2. 查询 undo tablespaces 状态,确认 STATE 字段为空
SELECT NAME, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME LIKE '<tablespace_name>';
## 3. 删除 undo tablespaces
DROP UNDO TABLESPACE <tablespace_name>;
复制
默认创建的 undo_001 和 undo_002 无法被删除。
4.1.5. 移动 Undo Tablespaces
使用 CREATE UNDO TABLESPACE
语法创建的 undo_tablespaces 可以在服务器离线时移动到任意一个由 innodb_directories
系统参数定义的目录。由系统参数 innodb_data_home_dir
、innodb_undo_directory
和 datadir
定义的目录会被自动附加到 innodb_directories
参数中。
4.1.6. 截断 Undo Tablespaces
4.1.6.1. 自动截断
设置系统参数 innodb_undo_log_truncate = 1
可启用 undo_tablespaces 自动截断特性。超过由系统参数 innodb_max_undo_log_size
(默认为 1073741824,单位字节,可动态修改)定义的大小的 undo tablespace 将被截断。自动截断需要 MySQL 实例至少有 2 个活动的 undo tablespace。
## 启用 undo_tablespaces 自动截断
mysql> SET GLOBAL innodb_undo_log_truncate=ON;
复制
Purge Threads 会定期清理 undo tablespace 中的 undo page,而每次清理的 undo page 数量由系统参数 innodb_purge_batch_size
(默认 300,可动态修改)决定。当 Purge Thread 执行指定次数(默认128,由系统参数 innodb_purge_rseg_truncate_frequency
控制,可动态修改)后,会触发 UNDO 表空间的自动截断操作。即默认当清理了 128*300 个 undo page 后,会自动执行 undo tablespace 截断。可通过减小系统参数 innodb_purge_rseg_truncate_frequency
的值,来提高自动截断的触发频率。
4.1.6.2. 手动截断
手动截断需要 MySQL 实例至少有 3 个活动的 undo tablespace。首先,停用待截断的 undo tablespace;待其状态(STATE)为空时,重新启用该 undo tablespace,即可完成手动截断。
## 1. 停用 undo tablespace
ALTER UNDO TABLESPACE <tablespace_name> SET INACTIVE;
## 2. 确定 STATE 为空
SELECT NAME, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES
WHERE NAME LIKE '<tablespace_name>';
## 3. 重新启用 undo tablespace
ALTER UNDO TABLESPACE <tablespace_name> SET ACTIVE;
复制
4.2. rollback segments(回滚段)
系统参数 innodb_rollback_segments
用于控制每个 undo_tablespaces 和 global temporary tablespace 中 rollback segments 的数量(取值范围1-128,默认 128,可动态修改)。
一个 rollback segments 支持的事务数取决于回滚段中的 undo 槽数(undo slots = InnoDB Page Size / 16
)和每个事务需要的 undo 日志数。
4.3. 事务与 undo log
一个事务最多可指定 4 个 undo log,包括如下 4 种操作类型:
- 用户表的 INSERT 操作;
- 用户表的 UPDATE、DELETE 操作;
- 用户(user-defined)临时表的 INSERT 操作;
- 用户(user-defined)临时表的 UPDATE、DELETE 操作;
如当一个事务中执行了 用户表
和 用户临时
表的 INSERT、UPDATE、DELETE 操作,则需要为其指定 4 个 undo log;当一个事务仅执行了对常规用户表的 INSERT 操作,则仅需为其指定 1 个 undo log。
4.4. UNDO 对并发事务数的限制
鉴于 事务 与 undo log 的关系,可使用以下公式来估计 InnoDB 能够支持的并发读写事务数。
- 若每个事务执行
INSERT
或UPDATE 或 DELETE
操作,则 InnoDB 能够支持的并发读写事务数为:
(innodb_page_size / 16) * innodb_rollback_segments * number of undo tablespaces
复制
默认为:(16384/16)1281
- 若每个事务执行
INSERT
和UPDATE 或 DELETE
操作,则 InnoDB 能够支持的并发读写事务数为:
(innodb_page_size / 16 / 2) * innodb_rollback_segments * number of undo tablespaces
复制
- 每个事务对临时表执行
INSERT
操作,则 InnoDB 能够支持的并发读写事务数为:
(innodb_page_size / 16) * innodb_rollback_segments
复制
- 每个事务对临时表执行
INSERT
和UPDATE 或 DELETE
操作,InnoDB 能够支持的并发读写事务数为:
(innodb_page_size / 16 / 2) * innodb_rollback_segments
复制
因此,可通过调高系统参数 innodb_rollback_segments(最大128)的值或创建多个 undo tablespaces,来提高 MySQL 并发事务数的能力。
4.5. UNDO 的状态值
SHOW STATUS LIKE 'Innodb_undo_tablespaces%';
+----------------------------------+-------+
| Variable_name | Value |
+----------------------------------+-------+
| Innodb_undo_tablespaces_total | 4 | -- 总共的UNDO表空间数量
| Innodb_undo_tablespaces_implicit | 2 | -- 这里implicit其实表示的初始化创建的默认UNDO表空间个数,这种UNDO不可被删除
| Innodb_undo_tablespaces_explicit | 2 | -- 这里explicit其实表示手工显式创建的UNDO表空间的个数
| Innodb_undo_tablespaces_active | 4 | -- 表示处于active的UNDO表空间的个数,可以看到当前和total一样,说明都在使用
+----------------------------------+-------+
复制
5. General Query Log(通用查询日志)
启用 General Query Log
后,MySQL 将按其接收的顺序,将所有 SQL 语句都记录到 General Query Log
中,如 SQL 语句、对象管理语句、客户端连接或断开等。
相关系统参数,如表所示:
系统参数 | 取值 | 作用域 | 动态修改 | 说明 |
---|---|---|---|---|
general_log | 0或OFF(默认值) 1或ON |
Global | Y | 是否启用 general query log |
log_output | FILE(默认值):输出到文件 TABLE:输出到系统表 NONE:禁用日志 |
Global | Y | 用于指定 general query log 和 slow query log 的目的地类型,但不启用日志。参数值可以是 TABLE、FILE 和 NONE 中的一个或多个值(逗号分隔)。 TABLE 表示将日志输出到 mysql.general_log 与 mysql.slow_log 中。 |
general_log_file | []host_name].log | Global | Y | 指定 general query log 的路径及文件名。 |
log_timestamps | UTC(默认值) SYSTEM(OS 的时区) |
Global | Y | log_timestamps 用于控制写入日志(general query log 、slow query log 、error log )中消息的时间戳时区。 |
log-raw | 0或OFF(默认值):以密文将密码记入日志 1或ON:以明文将密码记入日志 |
Global | Y | 适用于 MySQL 8.0.19+,用于控制是否以明文将密码记入日志中。 |
-
如果要记录某个会话产生的普通查询日志,可在会话级设置
sql_log_off
参数的值为ON/OFF
来控制。 -
当
general query log
后,与密码相关的语句,在记录到日志中时,会以密文保存。若要以明文保存,则可在启动 MySQL 服务时,指定--log-raw
选项。
6. Slow Query Log(慢查询日志)
MySQL 将执行时间超过系统参数 long_query_time
(默认10秒)指定的值,且访问的记录数超过系统参数 min_examined_row_limit
(默认值0)的数量的 SQL 语句记录到 Slow Query Log 中。
SQL 语句在执行完毕,并释放所有锁后,mysqld 才将其计入 Slow Query Log 中,因此日志中 SQL 顺序可能与执行顺序不同。
相关的系统参数,如表所示:
系统参数 | 取值 | 范围 | 动态修改 | 说明 |
---|---|---|---|---|
slow_query_log | 0或OFF(默认值) 1或ON |
Global | Y | 指定是否启用慢查询日志。日志目的地类型由 log_output 系统参数控制。 |
log_output | FILE(默认值):输出到文件 TABLE:输出到系统表 NONE:禁用日志 |
Global | Y | 用于指定 general query log 和 slow query log 的目的地类型,但不启用日志。参数值可以是 TABLE、FILE 和 NONE 中的一个或多个值(逗号分隔)。 TABLE 表示将日志输出到 mysql.general_log 与 mysql.slow_log 中。 |
slow_query_log_file | host_name-slow.log(默认值) | Global | Y | 指定 Slow Query Log 的路径及文件名。默认位于 data 目录中。 |
long_query_time | 10(默认值10秒) 取值范围:[0,31536000] |
Both | Y | 如果 SQL 执行时间超过此秒数,则服务器会增加 Slow_queries 状态变量的值。若启用了慢查询日志,SQL 语句将被记录到慢查询日志文件中。 |
min_examined_row_limit | 0(默认值) | Both | Global | 查询行数少于 min_examined_row_limit 的 SQL |
log_slow_admin_statements | 0或OFF(默认值) 1或ON |
Global | Y | 是否将管理类的慢 SQL 记入 slow query log 中。 |
log_queries_not_using_indexes | 0或OFF(默认值) 1或ON |
Global | Y | 是否将 full index scan 及 full table scan 记入到 slow query log 中(需要启用慢查询日志)。 |
log_throttle_queries_not_using_indexes | 0(默认值):无限制 | Global | Y | 指定每分钟允许记录到 slow query log 的且未使用索引的 SQL 语句数量,需要启用 log_queries_not_using_indexes=1 。 |
log_slow_replica_statements | 0或OFF(默认值) | Global | Y | 仅适用于副本库,且主库 binlog_format=MIXED 或 binlog_format=STATEMENTS 。用于指定副本库是否记录慢 SQL |
log_slow_extra | 0或OFF(默认值) 1或ON |
Global | Y | 当启用 slow query log 且 log_output 中包含 FILE 时,向 slow query log 中写入额外的信息。TABLE 中的日志信息不受影响。 |
log_slow_admin_statements
管理类 SQL 主要包括: ALTER TABLE, ANALYZE TABLE, CHECK TABLE, CREATE INDEX, DROP INDEX, OPTIMIZE TABLE 和 REPAIR TABLE 等。log_slow_extra
系统参数启用后,slow query log
文件中除了记录:Query_time
(执行时长)、Lock_time
(获取锁的时长)、Rows_sent
(发送到客户端的行数)、Rows_examined
(检索的数据行数)字段之外,额外增加字段:Thread_id
(线程 ID)、Errno
、Bytes_received
、Bytes_sent
、Sort_range_count
、Sort_rows
、Sort_scan_count
、Created_tmp_disk_tables
、Start
、End
等。
7. Error Log(错误日志)
7.1. 系统参数 log_error_services
Error Log(错误日志)类似于 Oracle 中的 alert 日志,记录了 mysqld 进程运行的重要信息。但 MySQL 记录错误日志的功能是由组件(component)完成的。组件用于扩展 MySQL 的功能,与插件(plugin)不同,组件之间通过 service 进行交互,而插件(plugin)之间通过 API 调用进行交互。
MySQL 记录错误日志的功能由过滤器(filter,筛选)组件与接收器(sink,写入)组件完成。通过系统参数 log_error_services 来控制使用哪些组件来实现错误日志的筛选(载入)及输出。
mysql> SELECT @@GLOBAL.log_error_services;
+----------------------------------------+
| @@GLOBAL.log_error_services |
+----------------------------------------+
| log_filter_internal; log_sink_internal |
+----------------------------------------+
复制
log_error_services
指定的多个组件从左至右执行。默认值 log_filter_internal; log_sink_internal
表示 MySQL 错误日志经过组件 log_filter_internal
过滤筛选后,由组件 log_sink_internal
将错误日志输出到系统参数 log_error
指定的位置。
7.2. 错误日志组件
6.2. xxxx_internal
组件为 MySQL 内置组件,使用时无需加载。针对非内置组件(如 log_filter_dragnet
、log_sink_json
等)需先通过命令 INSTALL COMPONENT <组件 URN>
加载。从 MySQL 8.0.30 开始,若错误日志组件未加载,系统参数 log_error_services
会隐式加载它们。6.2.
针对非内置的日志组件,可通过命令 UNINSTALL COMPONENT <组件 URN>
卸载。如 UNINSTALL COMPONENT 'file://component_log_filter_dragnet';
。
## 1. 加载日志组件
mysql> INSTALL COMPONENT 'file://component_log_filter_dragnet';
## 2. 卸载日志组件
mysql> UNINSTALL COMPONENT 'file://component_log_filter_dragnet
复制
7.2.1. Filter 过滤器组件
7.2.1.1. log_filter_internal
log_filter_internal 为 MySQL 内置并默认启用的日志过滤器组件(不可多次指定), 结合系统参数 log_error_verbosity
和 log_error_suppression_list
实现基于日志 事件级别
和 错误代码
的日志过滤。
若禁用 log_filter_internal
,则系统参数 log_error_verbosity
和 log_error_suppression_list
无效。
系统参数 | 取值 | 范围 | 动态修改 | 说明 |
---|---|---|---|---|
log_error_verbosity | 2(默认值):ERROR, WARNING 1:ERROR 3:ERROR, WARNING, INFORMATION |
Global | Y | 指定日志过滤组件 log_filter_internal 的过滤级别,需启用 log_filter_internal 组件。 |
log_error_suppression_list | 空字符串(默认) | Global | Y | 指定需要忽略的错误代码,多个错误号需用 , 分隔。错误代码可以用字符串或数字形式,如 MY-000031 、ER_SERVER_SHUTDOWN_COMPLETE 、000031 、31 等。 |
[mysqld] log_error_verbosity = 2 # error and warning messages only log_error_suppression_list = 'ER_PARSER_TRACE,MY-010001,10002'
复制
有关有效的错误代码,可参考链接:https://dev.mysql.com/doc/mysql-errors/8.0/en/
7.2.1.2. log_filter_dragnet
log_filter_dragnet 日志过滤组件(不可多次指定)可结合系统参数 dragnet.log_error_filter_rules
,根据自定义的规则进行日志过滤。从 MySQL 8.0.12
开始,可以查询 dragnet.Status
状态变量以确定最近分配给 dragnet.log_error_filter_rules
的结果。
log_filter_dragnet
为非内置的日志过滤组件,使用时需要通过 INSTALL COMPONENT <组件 URN>
加载组件。从 MySQL 8.0.30 开始,系统参数log_error_services
会隐式加载该参数指定的日志组件。log_filter_dragnet
日志组件的 URN 为 file://component_log_filter_dragnet
。
## 1. 加载 log_filter_dragnet 过滤组件
mysql> INSTALL COMPONENT 'file://component_log_filter_dragnet';
## 2. 使 log_filter_dragnet 过滤组件生效
mysql> SET GLOBAL log_error_services = 'log_filter_dragnet; log_sink_internal';
## 3. 设置自定义的日志过滤规则
mysql> SET GLOBAL dragnet.log_error_filter_rules = 'IF prio <> 0 THEN unset prio.';
mysql> SHOW WARNINGS\G6.4. *************************** 1. row ***************************
Level: Note
Code: 4569
Message: filter configuration accepted:6.5. SET @@GLOBAL.dragnet.log_error_filter_rules=
'IF prio!=ERROR THEN unset prio.';
复制
关于 log_filter_dragnet
过滤规则的语法,可参考链接:https://dev.mysql.com/doc/refman/8.0/en/error-log-rule-based-filtering.html#error-log-dragnet-filtering-language
7.2.2. Sink 接收器组件
Sink 组件用于实现错误日志输出,若未启用 Sink 组件,则不会产生日志输出。
7.2.2.1. log_sink_internal
log_sink_internal
接收器组件为 MySQL 内置并默认启用的日志输出组件(不可多次指定)。该组件将错误日志输出到系统参数 log_error
指定的位置以及 Performance_Schema.error_log
系统表中。6.2.2.
7.2.2.2. log_sink_json
log_sink_json 接收器组件为非内置的日志输出组件,用于将错误日志输出为 json
格式。同时,该接收器也会将错误日志输出到系统表 Performance_Schema.error_log
中。多次指定该组件,将生成多个 json 日志。
log_sink_json
组件会根据系统参数 log_error
的值,生成后缀为 [NN].json
的日志文件。如下示例的 mysql.err.00.json
。
激活非内置的 log_sink_json
日志组件之前,需要先加载。从 MySQL 8.0.30 开始,系统参数 log_error_services
会隐式自动加载该参数指定的非内置日志组件。而早期的版本,需要通过 INSTALL COMPONENT <组件 URN>
来加载组件。log_sink_json
组件的 URN 为 file://component_log_sink_json
。
- 输出错误日志为 json 格式
## 1. 加载 log_sink_json 接收器组件
mysql> INSTALL COMPONENT 'file://component_log_sink_json';
## 2. 生效 log_sink_json 接收器组件
mysql> SET PERSIST log_error_services = 'log_filter_internal; log_sink_json';
## 3. 查看错误日志输出位置
mysql> show global variables like 'log_error';
+---------------+----------------------------+
| Variable_name | Value |
+---------------+----------------------------+
| log_error | /mysql/mysql-log/mysql.err |
+---------------+----------------------------+
1 row in set (0.00 sec)
## 4. 生成 json 格式的错误日志,将日志输出至 mysql.err.00.json
mysql> system ls /mysql/mysql-log/
mysql.err mysql.err.00.json slowquery.log
复制
- 输出 2 个不同内容的 json 日志
其中一个 json 日志内容为未经过组件 log_filter_internal
筛选;另一个 json 日志内容为筛选后的日志。
## 多次指定 log_sink_json 组件
mysql> SET PERSIST log_error_services = 'log_sink_json; log_filter_internal; log_sink_json';
## 生成 2 个 json 格式日志
mysql> system ls /mysql/mysql-log/
mysql.err mysql.err.00.json mysql.err.01.json slowquery.log
复制
- 同时输出到文本日志、json 日志中
mysql> mysql> show global variables like 'log_error';
+---------------+----------------------------+
| Variable_name | Value |
+---------------+----------------------------+
| log_error | /mysql/mysql-log/mysql.err |
+---------------+----------------------------+
1 row in set (0.00 sec)
mysql> SET PERSIST 'log_filter_internal; log_sink_internal; log_sink_json';
mysql> system ls /mysql/mysql-log/
mysql.err mysql.err.00.json slowquery.log
复制
将错误日志输出到 /mysql/mysql-log/mysql.err
与 /mysql/mysql-log/mysql.err.00.json
文件中。
7.2.2.3. log_sink_syseventlog
log_sink_syseventlog 接收器组件用于将 mysqld 进程的错误日志输出到操作系统的错误日志中。该组件 URN 为 file://component_log_sink_syseventlog
,不能多次指定,同时也不会将日志输出到系统表 Performance_Schema.error_log
中。
mysql> INSTALL COMPONENT 'file://component_log_sink_syseventlog';
mysql> SET PERSIST log_error_services = 'log_filter_internal; log_sink_syseventlog';
```6.5.1.1.
当在 Linux 平台,为 MySQL 错误日志启用 `log_sink_syseventlog` 日志输出组件。该组件会将系统参数 `syseventlog.facility`、`syseventlog.include_pid`、`syseventlog.tag` 的值记录到错误日志中。而在 MySQL 8.0.13 之前,分别对应 `log_syslog_facility`、`log_syslog_include_pid` 和 `log_syslog_tag` 6.2.2.3.
+ `syseventlog.facility`:标记进程类型,默认为 `daemon`。全局系统变量,可动态修改。在 MySQL 8.0.13 之前,为 `log_syslog_facility`。
+ `syseventlog.include_pid`:是否写入 mysqld 进程的 PID,默认为 `1(ON)`。全局系统变量,可动态修改。在 MySQL 8.0.13 之前,为 `log_syslog_include_pid`。
+ `syseventlog.tag`:为错误日志指定标签(tag),默认为空字符串。在 MySQL 8.0.13 之前,为 `log_syslog_tag` 。
```sql
mysql> SET PERSIST syseventlog.facility = 'user';
## 2. 日志中包含 mysqld 进程的 PID
mysql> SET PERSIST syseventlog.include_pid = 1;
## 3. 为错误日志指定 tag。
mysql> SET PERSIST syseventlog.tag = M8030;
复制
[root@mysql8 log]# tail -f /var/log/messages Nov 16 16:25:04 mysql8 mysqld-M8030[10334]: Received SHUTDOWN from user <via user signal>. Shutting down mysqld (Version: 8.0.30). Nov 16 16:25:06 mysql8 mysqld-M8030[10334]: /usr/local/mysql/bin/mysqld: Forcing close of thread 83 user: 'dm_mysql'. Nov 16 16:25:06 mysql8 mysqld-M8030[10334]: /usr/local/mysql/bin/mysqld: Forcing close of thread 84 user: 'dm_mysql'. Nov 16 16:25:06 mysql8 mysqld-M8030[10334]: /usr/local/mysql/bin/mysqld: Forcing close of thread 20 user: 'root'. Nov 16 16:25:06 mysql8 mysqld-M8030[10334]: /usr/local/mysql/bin/mysqld: Forcing close of thread 85 user: 'dm_mysql'. Nov 16 16:25:07 mysql8 mysqld-M8030[10334]: /usr/local/mysql/bin/mysqld: Shutdown complete (mysqld 8.0.30) MySQL Community Server - GPL. Nov 16 16:25:08 mysql8 mysqld: Shutting down MySQL.... SUCCESS! Nov 16 16:25:08 mysql8 systemd: Stopped LSB: start and stop MySQL. Nov 16 16:25:08 mysql8 systemd: Starting LSB: start and stop MySQL...
复制
7.3. 系统参数
系统参数 | 取值 | 范围 | 动态修改 | 说明 |
---|---|---|---|---|
log_error_services | log_filter_internal; log_sink_internal (默认值) |
Global | Y | 指定实现错误日志的组件,多个组件用 , 或 ; 分隔。MySQL 8.0.30 之前的版本,非内置组件需通过 INSTALL COMPONENT 加载。 |
log_error_verbosity | 2(默认值):ERROR, WARNING 1:ERROR 3:ERROR, WARNING, INFORMATION |
Global | Y | 指定日志过滤组件 log_filter_internal 的过滤级别,需启用 log_filter_internal 组件。 |
log_error_suppression_list | 空字符串(默认) | Global | Y | 指定需要忽略的错误代码,多个错误号需用 , 分隔。错误代码可以用字符串或数字形式,如 MY-000031 、ER_SERVER_SHUTDOWN_COMPLETE 、000031 、31 等。 |
log_error | stderr:输出到控制台 路径及文件名 |
Global | N | 指定错误日志的路径及文件名。stderr 表示输出到控制台。 |
log_timestamps | UTC(默认值) SYSTEM(OS 的时区) |
Global | Y | log_timestamps 用于控制写入日志(general query log 、slow query log 、error log )中消息的时间戳时区。 |
[mysqld]
## 7.4. -------------- For Error Log ------------------ ##
log_error = /mysql/mysql-log/mysql.err
log_error_services = 'log_filter_internal; log_sink_internal'
log_error_verbosity = 2
log_error_suppression_list = ""
log_timestamps = system
复制