Undo log
概念:undo log 是一种用于撤销回退的日志。在事务没提交之前,MySQL 会先记录更新前的数据到 undo log 日志文件里面,当事务回滚时,可以利用 undo log 来进行回滚。
版本链:当前记录 + undo log
作用:
-
实现事务回滚。
-
通过隐藏列的roll_pointer字段,去检测当前记录的哪个版本能够在此次快照读中查询到。(拿着每个记录的trx_id和ReadView的信息进行对比)
Redo log
概念:Buffer Pool 是基于内存的,因为一些原因,脏页中的数据还没来得及落盘,会破坏事务的持久性。可以通过redo log将对哪些页做的修改记录下来,故障恢复后可以根据此日志将数据恢复到最新状态,保证事务的持久性。
Buffer Pool的脏页刷盘时机:
-
后台线程
-
当脏页所占用内存达到一定值时候(可设置)
-
redo log写满,需要checkpoint操作
-
MySQL 正常关闭时
-
…
redo log刷盘时机:
-
InnoDB的后台线程,每隔1s,会将内存中的redo log刷盘
-
MySQL 正常关闭时
-
…
作用:记录buffer pool中的脏页修改记录,并用于恢复,保证事务的持久性
Binlog
概念:binlog 文件是记录了所有数据库表结构变更和表数据修改的日志,不会记录查询类的操作。
binlog的格式:
- STATEMENT:只记录执行的sql语句
- ROW:会记录每一行数据的变化。(不是sql语句,是每行记录右之前变为现在什么样子)
- Mixed:对于可能会出现不一致的操作语句,会采用Row格式,对于一般语句采用STATEMENT
binlog刷盘时机:
- 事务执行时候会写入binlog cache,事务提交后,binlog会刷盘
作用:
- 对数据进行备份,可用于恢复
- 主从复制