本文共 851 字,大约阅读时间需要 2 分钟。
How oracle server determine about the changed blocks (dirty blocks) after a checkpoint event by
which the DBWR writes dirty buffers in data files and still user do not commit the transaction or rollback.
有点复杂,下面假定有这么一个简要的场景:
用一个update语句更新1000行,oracle会执行以下操作:
a.在SGA中生成更新过的datablocks
b.在SGA中生成回滚记录
c.为SGA中的datablocks和回滚记录均生成重做日志信息
在这个过程中,Oracle可能会把REDO信息写入到日志文件中。要记住:在checkpoint一个数据块之前(也就是DBWR写datablock前),
保护该block的日志会先写入到日志文件中。不可能存在数据块已写入磁盘但日志还没有写入的情况。
假设在update的过程中数据库服务器宕机,那么可能会发生下列事件:
1.某些REDO信息已经写入到日志文件中,但数据块和回滚块没有写入到磁盘上。当系统重起后,会应用REDO日志,
在SGA中重构回滚块和数据块。前滚完成后,Oracle会应用先前构造的回滚块进行回滚,这样看起来事务好像从来没有发生过一样。
2.某些日志和某些数据块以及回滚块已经写入到磁盘上。首先执行1的操作,接着前滚,应用日志到还没有进行检查点的数据块上,然后再回滚。
3.没有日志写入到磁盘上。当系统重起后,事务看起来就好像没有发生过一样,无需恢复。
译自
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/6906/viewspace-21788/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/6906/viewspace-21788/