阅读目录(Content)
- 1 undo
- 1.1 undo是啥
- 1.2 undo参数
- 1.3 undo空间管理
- 2 redo
- 2.1 redo是啥
- 2.2 redo 参数
- 2.3 redo 空间管理
- 3 undo及redo如何记录事务
- 3.1 Undo + Redo事务的简化过程
- 3.2 IO影响
- 3.3 恢复
1 undo
1.1 undo是啥
undo日志用于存放数据修改被修改前的值,假设修改 tba 表中 id=2的行数据,把Name=‘B‘ 修改为Name = ‘B2‘ ,那么undo日志就会用来存放Name=‘B‘的记录,如果这个修改出现异常,可以使用undo日志来实现回滚操作,保证事务的一致性。 对数据的变更操作,主要来自 INSERT UPDATE DELETE,而UNDO LOG中分为两种类型,一种是 INSERT_UNDO(INSERT操作),记录插入的唯一键值;一种是 UPDATE_UNDO(包含UPDATE及DELETE操作),记录修改的唯一键值以及old column记录。| Id | Name |
| 1 | A |
| 2 | B |
| 3 | C |
| 4 | D |
1.2 undo参数
MySQL跟undo有关的参数设置有这些:
1 mysql> show global variables like ‘%undo%‘; 2 +--------------------------+------------+ 3 | Variable_name | Value | 4 +--------------------------+------------+ 5 | innodb_max_undo_log_size | 1073741824 | 6 | innodb_undo_directory | ./ | 7 | innodb_undo_log_truncate | OFF | 8 | innodb_undo_logs | 128 | 9 | innodb_undo_tablespaces | 3 | 10 +--------------------------+------------+ 11 12 mysql> show global variables like ‘%truncate%‘; 13 +--------------------------------------+-------+ 14 | Variable_name | Value | 15 +--------------------------------------+-------+ 16 | innodb_purge_rseg_truncate_frequency | 128 | 17 | innodb_undo_log_truncate | OFF | 18 +--------------------------------------+-------+
- innodb_max_undo_log_size
- innodb_undo_tablespaces
- innodb_undo_log_truncate
- innodb_purge_rseg_truncate_frequency
1.3 undo空间管理
如果需要设置独立表空间,需要在初始化数据库实例的时候,指定独立表空间的数量。 UNDO内部由多个回滚段组成,即 Rollback segment,一共有128个,保存在ibdata系统表空间中,分别从resg slot0 - resg slot127,每一个resg slot,也就是每一个回滚段,内部由1024个undo segment 组成。 回滚段(rollback segment)分配如下:- slot 0 ,预留给系统表空间;
- slot 1- 32,预留给临时表空间,每次数据库重启的时候,都会重建临时表空间;
- slot33-127,如果有独立表空间,则预留给UNDO独立表空间;如果没有,则预留给系统表空间;
Cannot find a free slot for an undo log。则说明并发的事务太多了,需要考虑下是否要分流业务。
回滚段(rollback segment )采用 轮询调度的方式来分配使用,如果设置了独立表空间,那么就不会使用系统表空间回滚段中undo segment,而是使用独立表空间的,同时,如果回顾段正在 Truncate操作,则不分配。