MySQL数据库可以实现主从复制,实现持久化,实现回滚,其实关键在于MySQL里的三种log,分别是:
- binlog
- redo log
- undo log
bin log
用于记录数据库执行的写入性操作(不包括查询)信息,以二进制的形式保存在磁盘中
可以简单理解为记录的就是sql语句
binlog 是 mysql 的逻辑日志,并且由 Server层进行记录,使用任何存储引擎的 mysql 数据库都会记录 binlog 日志
使用场景
在实际应用中, binlog 的主要使用场景有两个,分别是 主从复制
刷盘时机
mysql 通过 sync_binlog 参数控制 biglog 的刷盘时机,取值范围是 0-N:
- 0:不去强制要求,不是直接进入磁盘文件,而是进入os cache
内存缓存,由系统自行判断何时写入磁盘; - 1:每次 commit 的时候都要将 binlog 写入磁盘;
- N:每N个事务,才会将 binlog 写入磁盘。
可以看出, sync_binlog 最安全的是设置是 1
日志格式
binlog 日志有三种格式,分别为 STATMENT 、 ROW 和 MIXED
在 MySQL 5.7.7 之前,默认的格式是 STATEMENT , MySQL 5.7.7 之后,默认值是 ROW
日志格式通过 binlog-format 指定。
- STATMENT : 基于 SQL 语句的复制,每一条会修改数据的sql语句会记录到 binlog 中
- ROW : 基于行的复制
- MIXED : 基于 STATMENT 和 ROW 两种模式的混合复制,比如一般的数据操作使用 row 格式保存,有些表结构的变更语句,使用 statement 来记录
redo log
物理日志
这种日志大致的格式如下:对表空间XX中的数据页XX中的偏移量为XXXX的地方更新了数据XXX
redo log写日志,是顺序写入磁盘文件,每次都是追加到磁盘文件末尾去,速度也是很快的
包括两部分:一个是内存中的日志缓冲( redo log buffer ),另一个是磁盘上的日志文件
mysql 每执行一条 DML 语句,先将记录写入 redo log buffer ,后续某个时间点再一次性将多个操作记录写到 redo log file
这种 先写日志,再写磁盘 的技术就是 MySQL里经常说到的 WAL 技术
redo log与bin log

undo log
原子性 底层就是通过 undo log 实现的
undo log 主要记录了数据的逻辑变化,比如一条 INSERT语句,对应一条 DELETE 的 undo log ,对于每个 UPDATE 语句,对应一条相反的 UPDATE 的 undo log ,这样在发生错误时,就能回滚到事务之前的数据状态。同时, undo log 也是 MVCC(多版本并发控制)实现的关键




