异常断电时,redo_buffer中来不及写入redo_file中的信息会全部丢失吗? (**已总结**)
谢各位指点,总结一下:
当发生DML操作时, 先记在redo_buffer中,再记到db_buffer中(先写日志,再写数据),然后redo_buffer中的数据由LGWR按照触发条件适时写入redo_file中, db_buffer中的数据则由DBWR按照触发条件适时写入db_file中,现假设存在一个commit了的DML操作,和一个未commit了的DML操作,那么将出现如下情况:
1.对于commit了的DML操作,该操作在commit时一定会被LGWR从redo_buffer中写入redo_file(因为LGWR的触发条件之一就是commit),但该操作在commit时不一定会被DBWR从db_buffer中写入db_file(因为commit并非DBWR的触发条件),那么此时数据库失败时恢复时,若发现该DML操作尚未写入db_file,数据库将去redo_file中找到该已经commit了的操作,进行redo重做操作; 若该操作已写入db_file,就无须进行redo重做操作了.
2.对于未commit的DML操作,该操作可能会被LGWR从redo_buffer中写入redo_file(当LGWR的其他触发条件发生时),也可能未写入redo_file. 同样,该操作也可能会被DBWR从db_buffer中写入db_file,也可能未写入db_file,即总共出现以下四种情况:
2.1 该操作未写入redo_file,也未写入db_file,那么发生数据库失败恢复时,数据库将直接丢弃该DML操作,反正该操作尚未commit,丢掉了也没关系;
2.2 该操作已写入redo_file,而未写入db_file,那么发生数据库失败恢复时,数据库将无须进行undo撤消,直接忽略redo_file记录的该条DML操作,也即直接丢弃该DML操作,同样,反正该操作尚未commit,丢掉了也没关系;
2.3 该操作未写入redo_file,而已写入db_file,这种情况不可能发生,因为LGWR触发的条件中,有一条就是DBWR发生时,LGWR也将被同时触发,即发生DBWR时,LGWR必同时发生,也即DBWR将db_buffer中的数据写入db_file中时,LGWR一定会同时将redo_buffer中的数据写入redo_file,因此这种操作未写入redo_file,而已写入db_file的情况是不可能发生的.
2.4 该操作已写入redo_file,也已写入db_file,那么发生数据库失败恢复时,数据库将去到redo_file中找到该DML操作,并进行undo撤消操作,即将db_file中已做的该DML操作取消掉;
可以看到,对于未commit的数据, 无论是四种情况中的哪种,数据库都会将该操作撤消.
以上总结是否正确, 再请各位指教,谢谢!!!
[ 本帖最后由 lanyingpeng 于 2008-7-6 16:41 编辑 ]
|