gydtep 发表于 2022-11-14 13:38:53
对应的trx_id是K,不可见。沿着Rollptr找到Undo中的前一版本,对应的trx_id是J,不可见。继续沿着Rollptr找到,trx_id是I可见,返回结果。gydtep 发表于 2022-11-15 14:37:48
事务结束的时候,对于需要Purge的Update类型的Undo Log,会按照事务提交的顺序trx_no,挂载到Rollback Segment Header的History List上。Undo Log回收的基本思路,gydtep 发表于 2022-11-16 16:01:10
其实只是修改对应Record的Delete Mark标记。对应的,如果这时这个Record又重新插入,其实也只是修改一下Delete Mark标记,也就是将这两种情况的delete和insert转变成了update操作。gydtep 发表于 2022-11-17 14:27:20
Update Fields中记录的就是当前这个Record版本相对于其之后的一次修改的Delta信息,包括所有被修改的Field的编号,长度和历史值。gydtep 发表于 2022-11-17 18:46:44
Undo Segment会持有至少一个Undo Page,每个Undo Page会在开头38字节到56字节记录Undo Page Header,其中记录Undo Page的类型、最后一条Undo Record的位置gydtep 发表于 2022-11-17 19:18:57
Undo Segment会持有至少一个Undo Page,每个Undo Page会在开头38字节到56字节记录Undo Page Header,其中记录Undo Page的类型、最后一条Undo Record的位置,gydtep 发表于 2022-11-17 20:39:12
如上所示,是一个Undo Segment的示意图,每个写事务开始写操作之前都需要持有一个Undo Segment,一个Undo Segment中的所有磁盘空间的分配和释放,也就是16KB Page的申请和释放gydtep 发表于 2022-11-18 12:32:47
方便undo空间回收,另一方面也大大增加了最大的Rollback Segment的个数,增加了可支持的最大并发写事务数。如下图所示:gydtep 发表于 2022-11-18 17:35:27
当事务结束(commit或者rollback)之后,如果只占用了一个Undo Page,且当前Undo Page使用空间小于page的3/4,这个Undo Segment会保留并加入到对应的insert/update cached list中。gydtep 发表于 2022-11-20 08:18:10
如数据库故障恢复机制的前世今生中讲过的ARIES过程,Crash Recovery的过程中会先重放所有的Redo Log,整个Undo的磁盘组织结构,也会作为一种数据类型也会通过上面讲到的这些Redo类型的重放恢复出来。