gydtep 发表于 2022-11-16 14:43:52

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

gydtep 发表于 2022-11-16 19:55:10

上面介绍了一个Undo Record中的存放的内容,每一次的修改都会产生至少一个Undo Record,那么大量Undo Record如何组织起来,来支持高效的访问和管理呢,这一小节我们将从几个层面来进行介绍

gydtep 发表于 2022-11-17 07:28:25

Delete Mark标明该Undo Log中有没有TRX_UNDO_DEL_MARK_REC类型的Undo Record,避免Purge时不必要的扫描;Log Start Offset中记录Undo Log Header的结束位置

gydtep 发表于 2022-11-17 15:25:30

这一小节我们将从几个层面来进行介绍:首先是在不考虑物理存储的情况下的逻辑组织方式;之后,物理组织方式介绍如何将其存储到到实际16KB物理块中

gydtep 发表于 2022-11-17 18:46:31

也就是16KB Page的申请和释放,都是由一个FSP的Segment管理的,这个跟索引中的Leaf Node Segment和Non-Leaf Node Segment的管理方式是一致的,这部分之后会有单独的文章来进行介绍。

gydtep 发表于 2022-11-17 20:48:13

当前Page还空闲部分的开头,也就是下一条Undo Record要写入的位置。Undo Segment中的第一个Undo Page还会在56字节到86字节记录Undo Segment Header,

gydtep 发表于 2022-11-18 12:32:36

可以看出Rollback Segment的个数会直接影响InnoDB支持的最大事务并发数。MySQL 8.0由于支持了最多127个独立的Undo Tablespace,一方面避免了ibdata1的膨胀,

gydtep 发表于 2022-11-18 17:35:15

为了方便维护,这里有一个限制就是单条Undo Record不跨page,如果当前Page放不下,会将整个Undo Record写入下一个Page。

gydtep 发表于 2022-11-19 10:08:46

多版本的目的是为了避免写事务和读事务的互相等待,那么每个读事务都需要在不对Record加Lock的情况下, 找到对应的应该看到的历史版本。

gydtep 发表于 2022-11-20 08:18:02

MLOG_UNDO_INSERT是最常见的,在Undo Log里写入新的Undo Record都对应的写这个日志记录写入Undo中的所有内容;最后,MLOG_UNDO_ERASE_END 对应Undo Log跨Undo Page时抹除最后一个不完整的Undo Record的操作。
页: 7 8 9 10 11 12 13 14 15 16 [17] 18 19 20 21 22 23 24 25 26
查看完整版本: 腾讯云2860元代金券领取及使用说明