gydtep 发表于 2022-11-12 12:59:57

同时,更多的责任意味着更复杂的管理逻辑,InnoDB中其实是把Undo当做一种数据来维护和使用的,也就是说,Undo Log日志本身也像其他的数据库数据一样

gydtep 发表于 2022-11-12 13:53:30

这种Undo Record在代码中对应的是TRX_UNDO_INSERT_REC类型。不同于Update类型的Undo Record,Insert Undo Record仅仅是为了可能的事务回滚准备的,

gydtep 发表于 2022-11-12 15:51:33

其中Undo Number是Undo的一个递增编号,Table ID用来表示是哪张表的修改。下面一组Key Fields的长度不定,因为对应表的主键可能由多个field组成

gydtep 发表于 2022-11-13 16:14:26

trx_undo_create中会轮询选择当前Rollback Segment中可用的Slot,也是就值FIL_NUL的Slot,申请新的Undo Page,初始化Undo Page Header,Undo Segment Header等信息,创建新的trx_undo_t内存结构并挂到trx_rseg_t的对应List中。

gydtep 发表于 2022-11-14 16:37:57

如数据库故障恢复机制的前世今生中讲过的ARIES过程,Crash Recovery的过程中会先重放所有的Redo Log,整个Undo的磁盘组织结构,也会作为一种数据类型也会通过上面讲到的这些Redo类型的重放恢复出来。

gydtep 发表于 2022-11-16 09:08:59

数据库故障恢复机制的前世今生中提到过,Undo Log用来记录每次修改之前的历史值,配合Redo Log用于故障恢复。这也就是InnoDB中Undo Log的第一个作用:

gydtep 发表于 2022-11-16 20:33:56

每个事务其实会修改一组的Record,对应的也就会产生一组Undo Record,这些Undo Record收尾相连就组成了这个事务的Undo Log。除了一个个的Undo Record之外,还在开头增加了一个Undo Log Header来记录一些必要的控制信息,因此,一个Undo Log的结构如下所示:

gydtep 发表于 2022-11-17 08:59:50

每当InnoDB中需要修改某个Record时,都会将其历史版本写入一个Undo Log中,对应的Undo Record是Update类型。当插入新的Record时,还没有一个历史版本,但为了方便事务回滚时做逆向(Delete)操作,这里还是会写入一个Insert类型的Undo Record。

gydtep 发表于 2022-11-17 09:37:06

这种Undo Record在代码中对应的是TRX_UNDO_INSERT_REC类型。不同于Update类型的Undo Record,Insert Undo Record仅仅是为了可能的事务回滚准备的,并不在MVCC功能中承担作用。因此只需要记录对应Record的Key,供回滚时查找Record位置即可。

gydtep 发表于 2022-11-18 10:13:33

Rollback Segment Header是按需分配的,其中包含1024个Slot,每个Slot占四个字节,指向一个Undo Segment的First Page。
页: 1 2 3 [4] 5 6 7 8 9 10 11 12 13
查看完整版本: 阿里云服务器2核2G低至49.68元/年