Oracle 关于实例恢复的一个讨论

问题:在Oracle中update一条记录,长时间不提交,DBWn会不会将脏块写入数据文件?LGWR会不会把redo log buffer中的记录写入online redo log? 如果二者都已写入磁盘,用户发出rollback命令,将会做哪些操作?如果此时数据库实例crash,实例恢复时,将做哪些操作?

讨论结论:

1.当用户DML语句修改一条记录,记录所在脏块是有可能被写入数据文件(提交时间越长,写入数据文件几率越大),因为DBWn的写触发条件为:每3秒自动唤醒一次;检查点事件;一个服务器进程在规定时间内没有找到空闲块;由上可知,DBWn是否写入,和用户是否提交没有关系;

2.redo log buffer中的记录,也是有可能写入online redo log中,因为LGWR触发条件为:每3秒自动唤醒一次;三分之一满;大小达到1M;commit操作触发;DBWn脏块要写入数据文件中,但是保护该脏块的redo还没写入磁盘,此时会触发LGWR写。由上可知,LGWR的写在未commit的情况下,也可能会写入redo文件。

3.当二者都已写盘,用户发出rollback,则oracle会利用undo块来进行恢复。(undo块也有可能写入磁盘,但是绝对不会被覆盖!)

4.如果此时数据库crash,则oracle会在实例恢复时,先应用redo,进行前滚。前滚完后会进行回滚,将未提交的事务(undo中有记录)进行rollback。