一、二进制日志(Binlog)
1. Binlog概念
Binlog 是逻辑日记
,用于记录数据库执行的写入操作(查询不记录)信息,Server
层记录和引擎层无关,并且是以追加方式进行写入,可以通过参数 max_binlog_size
设置每个 Binlog 文件的大小,文件大小达到设定值时会生成新的文件来保存日记。
概念 | 解释 |
---|---|
逻辑日志 | “逻辑日志”可以简单理解为记录的就是sql语句。Binkog和Undo log记录的是逻辑日志 |
Server | “Server”是MySQL基本架构的一层,MySQL基本架构分为Server层和引擎层,详细介绍可以参考–简单记一条查询SQL语句的执行全过程 。 |
2. Binlog作用
在实际应用中,主要用在两个场景:主从复制和数据恢复
- 主从复制场景:在 Master 主端开启 Binlog,将 Binlog 发生到各个 Slave 从端,Slave 从端重放 Binlog 从而达到主从数据一致
- 数据恢复场景:通过使用 mysqlbinlog 工具来恢复数据
3. Binlog 记录过程及刷盘时机
Binlog 大致记录过程是先写 Binlog Buffer,然后通过刷盘时机,控制刷入 OS Buffer,控制 fsync() 进行写入 Binlog File 日记磁盘的过程。
概念 | 解释 |
---|---|
刷盘时机 | “刷盘时机”是指啥时候、通过什么策略将内存中的日志写到磁盘中。因为日志每次都是先写入内存的buffer中,然后通过刷盘时机设置的参数控制刷盘时机,最后才刷入磁盘。这个参数设置对于Undo、Redo和Binlog都有一套参数 |
对于 Binlog,MySQL 是通过参数 sync_binlog 参数来控制刷盘时机,取值是 0、1 和 N 三种值。0 表示由系统自行判断何时调用 sync() 写入磁盘;1 表示每次事务 commit 都要调用 fsync() 写入磁盘;N 表示每 N 个事务,才会调用 fsync() 写入磁盘。
图2:内存和磁盘日记结构图
4. Binlog 记录格式
MySQL 5.7.7 版本之前默认格式是 STATEMENT
,版本之后默认是 ROW
,可以通过参数 binlog-format 指定。
二、事务日志(Undo log)
1. Undo log 概念
Undo log是逻辑日记
、回滚日记。比如一条修改 +3 的逻辑语句,Undo log 会记录对应一条 -3 的逻辑日记,一条插入语句则会记录一条删除语句,这样发生错误时,根据执行 Undo log 就可以回滚到事务之前的数据状态。
2. Undo log 作用
- 回滚数据:当程序发生异常错误时等,根据执行 Undo log 就可以回滚到事务之前的数据状态,保证原子性,要么成功要么失败。
- MVCC 一致性视图:通过 Undo log 找到对应的数据版本号,是保证 MVCC 视图的一致性的必要条件。
3. Undo log 记录过程及刷盘时机
刷盘过程及时机类似于 Binlog 和 Redo,可以参考 Redo log 刷盘时机章节给出的图片,已经体现出来了。
4. Undo log 总结
Undo log 日记内容不是很多,重点是回滚
和多版本控制 MVCC
那块。此外,我记得印象笔记深刻的是长事务会导致日记过多,这个日记就是 Undo log。因为长事务存在,导致需要保存很多视图快照,其实这里就是涉及到Undo log 何时删除和生成的问题,当时纠结好久,其实很简单。生成是事务开始后写 Redo log 之前生成,当没有事务需要用到 Undo log 时就会被删除。举个例子,如果事务 A 一直存活,那么事务 A 之后产生的事务 B、C…等等就算提交了,也不会被删除,因为事务 A 需要用到 B、C… 事务去找 A 的版本。所以避免长事务可以减少Undo log 日记量,当然还可以提高性能。
三、事务日记 (Redo log)
1. Redo log 概念
Redo log 是重做日记,属于InnoDB引擎的日记。是物理日记,日记记录的内容的是数据页的更改,这个页 “做了什么改动”。如:add xx记录 to Page1,向数据页Page1增加一个记录。
概念 | 解释 |
---|---|
数据页 | MySQL是按照数据页为最小单位进行存储的,b+树的特性,一页默认16k,数据属于页,页包含数据。当操作一条数据的时候,实际上就是在操作一个数据页,多条数据可能是在一个数据页也可能是在多个数据页,看数据具体分布。 |
2. Redo log 作用
- 前滚操作:具备
crash-safe
能力,提供断电重启时解决事务丢失数据问题。 - 提高性能:先写Redo log记录更新。当等到有空闲线程、内存不足、Redo log满了时
刷脏
。写 Redo log 是顺序写入,刷脏是随机写,节省的是随机写磁盘的 IO 消耗(转成顺序写),所以性能得到提升。此技术称为WAL技术:Write-Ahead Logging,它的关键点就是先写日记磁盘,再写数据磁盘。