mysql事务日志是mysql数据库在运行过程中,用来记录事务执行相关操作的日志文件集合,是数据库保证事务ACID(原子性、一致性、隔离性、持久性)特性的核心基础组件,不同的事务日志承担着不同的功能职责。

mysql常见的事务日志类型
1. redo log(重做日志)
redo log是InnoDB存储引擎特有的日志,属于物理日志,记录的是数据页的物理修改操作。它的核心作用是在数据库发生异常宕机重启时,用来恢复已经提交但尚未刷盘到数据文件的事务数据,保证事务的持久性。
redo log采用循环写的方式,由两部分组成:一是内存中的redo log buffer,二是磁盘上的redo log文件。当事务提交时,会根据配置的刷盘策略将redo log buffer中的内容写入磁盘的redo log文件。
下面是一个查看redo log相关配置的示例:
-- 查看redo log文件大小 SHOW VARIABLES LIKE 'innodb_log_file_size'; -- 查看redo log文件数量 SHOW VARIABLES LIKE 'innodb_log_files_in_group'; -- 查看redo log刷盘策略,1表示每次事务提交都刷盘,2表示写入操作系统缓存 SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';
2. undo log(回滚日志)
undo log也是InnoDB存储引擎特有的日志,属于逻辑日志,记录的是事务执行前的数据版本。它的主要作用是支持事务回滚和MVCC(多版本并发控制),保证事务的原子性和隔离性。
当事务执行增删改操作时,InnoDB会先生成对应的undo log,记录修改前的数据状态。如果事务需要回滚,就可以通过undo log将数据恢复到事务开始前的状态;同时其他事务读取数据时,也可以通过undo log读取到对应的历史版本数据,避免读写冲突。
undo log存储在undo表空间中,mysql8.0之后默认会将undo表空间独立出来,相关的配置查看示例如下:
-- 查看undo表空间数量 SHOW VARIABLES LIKE 'innodb_undo_tablespaces'; -- 查看单个undo表空间的大小 SHOW VARIABLES LIKE 'innodb_undo_log_truncate';
3. binlog(二进制日志)
binlog是mysql server层生成的日志,所有存储引擎都可以使用,属于逻辑日志,记录的是事务执行的逻辑操作(比如SQL语句或者行级别的修改记录)。它的核心作用是用于主从复制和数据恢复,是mysql高可用架构的重要支撑。
binlog有三种记录格式:STATEMENT格式记录SQL语句,ROW格式记录行级别的修改,MIXED格式是前两种的混合。binlog的刷盘策略由sync_binlog参数控制,设置为1时表示每次事务提交都刷盘,能最大程度保证binlog不丢失。
查看binlog相关配置的示例如下:
-- 查看binlog是否开启 SHOW VARIABLES LIKE 'log_bin'; -- 查看binlog格式 SHOW VARIABLES LIKE 'binlog_format'; -- 查看binlog刷盘策略 SHOW VARIABLES LIKE 'sync_binlog';
mysql事务日志的核心作用总结
- 保证事务持久性:redo log记录了已提交事务的物理修改,即使数据库宕机,重启后也可以通过redo log重做这些操作,确保提交的事务不会丢失。
- 保证事务原子性:undo log记录了事务修改前的数据版本,事务执行失败需要回滚时,可以通过undo log将数据恢复到事务开始前的状态,实现事务要么全部执行要么全部不执行的效果。
- 支持MVCC多版本并发控制:undo log保存了数据的多个历史版本,读事务可以根据自身的事务ID读取到对应版本的数据,实现读写操作互不阻塞,提升并发性能。
- 支撑主从复制与数据恢复:binlog记录了所有事务的逻辑操作,主库可以将binlog同步给从库,从库重放binlog实现数据同步;同时也可以通过binlog恢复指定时间点的数据。
事务日志的协同工作流程
当一个事务提交时,三种事务日志的协同流程大致如下:
- 事务执行过程中,先生成对应的undo log,记录修改前的数据版本。
- 事务执行产生的数据修改先写入redo log buffer,同时生成对应的binlog记录。
- 事务提交时,根据配置将redo log buffer的内容刷入磁盘的redo log文件,同时根据配置将binlog刷入磁盘。
- 最后将redo log标记为提交状态,事务完成提交。
这种两阶段提交的机制,保证了redo log和binlog的逻辑一致性,避免主从复制或者数据恢复时出现数据不一致的问题。