innodb 日志文件(redo-log,undo-log)
innodb 事务日志包括 redo log 和 undo log。redo log 是重做日志,提供前滚操
作,undo log 是回滚日志,提供回滚操作。
undo log 不是 redo log 的逆向过程,其实它们都算是用来恢复的日志:
1.redo log 通常是物理日志,记录的是数据页的物理修改,而不是某一行或某
几行修改成怎样怎样,它用来恢复提交后的物理数据页(恢复数据页,且只能恢
复到最后一次提交的位置)。
2.undo 用来回滚行记录到某个版本。undo log 一般是逻辑日志,根据每行记
录进行记录。
1.redo log
1.1 redo log 和二进制日志的区别
redo log 不是二进制日志。虽然二进制日志中也记录了 innodb 表的很多操作,
**也能实现重做的功能,但是它们之间有很大区别。
1. 二进制日志是在存储引擎的上层产生的,不管是什么存储引擎,对
数据库进行了修改都会产生二进制日志。而 redo log 是 innodb 层
产生的,只记录该存储引擎中表的修改。并且二进制日志先于
redo log 被记录。具体的见后文 group commit 小结。
2. 二进制日志记录操作的方法是逻辑性的语句。即便它是基于行格式
的记录方式,其本质也还是逻辑的 SQL 设置,如该行记录的每列
的值是多少。而 redo log 是在物理格式上的日志,它记录的是数
据库中每个页的修改。
3. 二进制日志只在每次事务提交的时候一次性写入缓存中的日志"文
件"(对于非事务表的操作,则是每次执行语句成功后就直接写入)。
而 redo log 在数据准备修改前写入缓存中的 redo log 中,然后才
对缓存中的数据执行修改操作;而且保证在发出事务提交指令时,
先向缓存中的 redo log 写入日志,写入完成后才执行提交动作。
4. 因为二进制日志只在提交的时候一次性写入,所以二进制日志中的
记录方式和提交顺序有关,且一次提交对应一次记录。而 redo log
中是记录的物理页的修改,redo log 文件中同一个事务可能多次记
录,最后一个提交的事务记录会覆盖所有未提交的事务记录。例如
事务 T1,可能在 redo log 中记录了 T1-1,T1-2,T1-3,T1* 共 4 个
操作,其中 T1* 表示最后提交时的日志记录,所以对应的数据页
最终状态是 T1* 对应的操作结果。而且 redo log 是并发写入的,
不同事务之间的不同版本的记录会穿插写入到 redo log 文件中,
评论