事务日志undo log
1 Undo日志的作用
作用1:回滚数据
逻辑上恢复,之前插入了一条数据,已经开辟了物理空间,回滚只是将该数据删除,物理空间还存在。
作用2:MVCC
2 Undo存储结构
mysql> show variables like 'innodb_undo_logs';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| innodb_undo_logs | 128 |
+------------------+-------+
3 Undo log 生命周期
1 简要生成过程
update age = 12 where id = 1; 原来age为10;
执行过程
- 执行更新操作时,先从buffer pool 中查找有没有对应的数据页,没有就从磁盘加载进 缓冲池。
- 记录undo log日志 age = 10
- 在内存中更新数据age=12
- 记录redo log日志到 redo buffer 中
- 由三种策略决定什么时候刷盘到 磁盘上
- 记录bin log 文件
2 详细过程
执行update语句,分为两种情况
情况1 不更新主键
update user set name = 'Sun' where id =1
更改行记录中 tom 值为 sun
回滚指针指向 此次 undo log ,头插法。
情况2 更新主键值
UPDATE user SET id=2 WHERE id=1;
将原来的标识为删除,在后面插入一条新的记录。同时记录下更新前id。
回滚指针ID是递增的
3 回滚过程
以上面的例子来说,假设执行rollback,那么对应的流程应该是这样:
- 通过undo no=3的日志把id=2的数据删除
- 通过undo no=2的日志把id=1的数据的deletemark还原成0
- 通过undo no=1的日志把id=1的数据的name还原成Tom
- 通过undo no=0的日志把id=1的数据删除
4 undo log 的删除
针对于insert undo log 因为insert操作的记录,只对事务本身可见,对其他事务不可见。故该undo log可以在事务提交后直接删除,不需要进行purge操作。
针对于update undo log 该undo log可能需要提供MVCC机制,因此不能在事务提交时就进行删除。提交时放入undo log链表,等 待purge线程进行最后的删除。