ITPUB??ì3
新一届的微软MVP评选已经开始,欢迎各位推荐!
ITPUB论坛 » Oracle数据库管理 » 遭遇异常断电时,redo_buffer_cache中来不及写入regolog file中的信息会全部丢失吗?

标题: 遭遇异常断电时,redo_buffer_cache中来不及写入regolog file中的信息会全部丢失吗?
离线 棉花糖ONE


精华贴数 0
个人空间 0
技术积分 15301 (70)
社区积分 1281 (805)
注册日期 2007-2-21
论坛徽章:51
现任管理团队成员数据库板块每日发贴之星生肖徽章2007版:羊生肖徽章2007版:虎  
      

发表于 2008-7-3 17:19 
dbwr写数据之前先写日志,这样的情况是这些日志相关的数据都没写到数据文件中,都没内容要回滚


__________________
换一种思路来思考问题

qq群:47823366
只看该作者    顶部
离线 longjuanfeng
初级会员



精华贴数 0
个人空间 0
技术积分 16 (65405)
社区积分 0 (888092)
注册日期 2006-4-26
论坛徽章:0
      
      

发表于 2008-7-3 17:22 
对,不光是commit会写logfile,系统每3秒都会写一次logfile,这些是需要回滚的。楼主不用担心,丢失的信息相当于已经回滚了一样


只看该作者    顶部
离线 joyw


精华贴数 0
个人空间 0
技术积分 1663 (1012)
社区积分 15 (8668)
注册日期 2004-1-2
论坛徽章:7
生肖徽章2007版:羊生肖徽章2007版:虎2008北京奥运纪念徽章:马术2008北京奥运纪念徽章:跳水生肖徽章2007版:牛生肖徽章2007版:牛
ITPUB新首页上线纪念徽章     

发表于 2008-7-3 17:34 


QUOTE:
原帖由 棉花糖ONE 于 2008-7-3 17:19 发表
dbwr写数据之前先写日志,这样的情况是这些日志相关的数据都没写到数据文件中,都没内容要回滚

如果一个有“很大事物” 在执行, 比如一个DELETE 操作执行了“很长时间” , 而LGWR 每3秒就要写一次日志, 这个时候肯定有很多REDO条目已经写到redo日志文件中了,而且在REDO条目中会加入一些记录DBWR“记录”的条目, 这个时候crash 了, 那么在数据库重启动以后肯定是要做ROLLBACK的


__________________
对酒当歌,人生几何?
譬如朝露,去日苦多。
慨当以慷,忧思难忘。
何以解忧,唯有杜康。
。。。。。。。。。
只看该作者    顶部
离线 lanyingpeng
一般会员



精华贴数 0
个人空间 0
技术积分 306 (6437)
社区积分 0 (1495901)
注册日期 2007-8-3
论坛徽章:0
      
      

发表于 2008-7-6 14:09 
异常断电时,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 编辑 ]


只看该作者    顶部
相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问