2026-03-18 18:21:42
MySQL中的日志
MySQL作为一款强大的关系型数据库管理系统,其背后离不开日志的支持。这些日志不仅帮助MySQL实现了数据恢复和故障恢复的能力,还保证了事务的一致性和持久性。接下来,我们将详细探讨MySQL中的几种主要日志:归档日志(binlog)和重做日志(redo log)。
一、归档日志-binlog
binlog是MySQL中server层的日志模块,与具体的存储引擎(如Innodb、MyISAM)无关。它主要记录逻辑层面的内容,如“给ID=1这一行中的a字段加1”,“将ID=2这一行数据删除”等,与被操作的数据存放的数据页和物理地址无关。
作用:
数据恢复:利用binlog,可以将数据库恢复到误操作之前的状态。
主从同步:在MySQL的主从结构中,从库通过binlog从主库同步数据。
特点:
binlog是一直追加写的,当日志文件大小达到一定阈值后,会进行切割,并在一个新的文件中继续写。
基于数据库的备份情况以及binlog的保存时间,可以将数据库的状态恢复到允许时间范围内的任意时刻。
数据恢复流程:

二、重做日志-redo log
redo log是存储层中的日志模块,且是Innodb特有的。它主要记录“某个数据页上做了什么修改”,包含了具体的数据页地址,是一个物理层面的日志。
作用:
故障恢复:使Innodb具备故障恢复的能力,即使系统掉电,也能通过redo log恢复数据。
特点:
redo log可以看做是一个环形缓冲区,有大小的限制(通常由4个1GB大小的文件组成),当缓冲区写满后,会对之前写过的区域进行覆盖。
redo log采用顺序写的方式,相比随机写性能较高。
写操作流程及故障恢复:
在上述过程中,如果系统掉电,内存中的脏页数据会丢失。但是,由于redo log已经记录了更新操作,MySQL重启后,会通过回放redo log中的日志,将业务层面的更新“重做”一遍,从而保证数据的完整性。

总结: