日志
redo log是物理日志,记录的是“在某个数据页上做了什么修改”; 数据物理位置层面的直接修改
binlog是逻辑日志,记录的是这个语句的原始逻辑,比如“给ID=2这一行的c字段加1
undolog 回滚日志 , 存放了更新前的状态
txid (自增用于版本比较) + rollback id(指向上一次undolog位置 , 形成了一个链表, 用于mvcc) + rowid
写入顺序
redo、undo、binlog的生成流程
1、从磁盘读取到id=1的记录,放到内存。
2、记录undo log 日志。
3、记录redo log (预提交状态)
4、修改内存中的记录。
5、记录binlog
6、提交事务,写入redo log (commit状态)
事务提交过程
结论: 先写redolog再写binlog
先将数据写入内存 , 写redolog, 此时状态为prepare
写binlog commit (宕机后会 会重新提交)
写redolog commit
结论
binlog有记录,redolog状态为commit:正常完成的事务,不需要恢复;
binlog有记录,redolog状态prepare:在binlog写完提交事务之前的crash,恢复操:提交事务。(因为之前没有提交)
binlog无记录,redolog章台prepare:在binlog写完之前的crash,恢复操作:回滚事务(因为crash时并没有成功写入数据库)