|
Re: Re: Re: Re: 在问个redo log 的问题?
最初由 NinGoo 发布
[B]
这个我前面已经解释过了,oracle目前的机制,之所以commit时能够只写redo,正是因为redo记录了buffer中所有的change,不管是data block还是undo block
如果按你的方法,data block由于有redo的保护,在commit时只要redo写完就能保证其可以恢复,,undo block没有redo保护,那实例崩溃后这些undo block如何恢复?没有这些undo ,那么对应的没有提交的事务该如何回滚?所以如果redo不记录undo block的变更,那么commit时就必须将undo block写回到datafile中
总之一句话,undo block也好,data block也好,正是由于他们都在buffer中进行修改,就必须记录redo,否则,实例崩溃后,buffer中的所有信息都丢失,你必须有一种机制能保证实例恢复时,能将崩溃前的buffer信息复原 [/B]
崩溃后还要恢复所有的undo block?有必要么?我们假设某个tranction还没commit数据库发生崩溃。(已commit的tranction我就不讨论了),这个时候假设该tranctons的脏数据有部分已经写入disk,有部分没写。同理,有部分undo block已经写入disk,有部分没写。那么还要恢复那部分没来得及写入disk的undo么?我看没必要吧,因为部分脏数据没有写入disk,因此disk上面的数据还是old的,不需要回滚。只有已经写入disk的脏数据才需要回滚!!而这部分数据的回滚也只是需要已经写入disk的undo block。(因为undo block 总要在trange block write to disk之前write to disk) |
|