现在的位置: 首页 > 综合 > 正文

Recovery Principles–Redo record and change vector

2013年07月19日 ⁄ 综合 ⁄ 共 863字 ⁄ 字号 评论关闭
当我们发出一个update语句的时候, Oracle会完成以下几步:
1. 生成一系列change vector.
2. 在redo buffer中保存这一系列change vector组成的redo record, redo record最终将被写入到redolog文件中.
3. 更改数据快.
那么change vector 包含哪些信息呢? 基本上, 它包含了来自于数据块的版本号, 操作的类型以及数据块的地址. 每个redo record是由多个change vector组成的. oracle 在恢复过程中, 会保证一个transaction 要么被全部恢复, 要么全部不恢复, 实际上就是通过恢复redo record中的全部change vector来做到的, 只要有一个change vector恢复失败, 这个redo record的所有change vector都将失败.
对于上述update语句, 典型情况下会包含3个change vector. 首先, 为了保留before image以便undo,需要把数据块的before image放入rollback segment, 放入到rollback segment时, oracle会在rollback segment的transaction表里插入一条记录保存了被修改的数据块的地址. 由于这个transaction表本身也是存储在一个数据块里的, 因此, 这个操作本身也是对数据块的修改, 因此, 这个修改需要生成一个change vector. 其次, oracle 把改动的数据块写入到rollback segment的目标块也是一个数据块, 因此, 对该块也需要一个change vector. 第三个change vector就是被修改的数据块本身了. 这是一条redo record
如果上述update语句刚好修改到了被索引的列, 索引也会被修改, 同样需要生成一个包含多个change vector的redo record.
commit 会生成第三个redo record. 因此, 最简单的一个update+commit, 会产生上面的三个redo record.

抱歉!评论已关闭.