暂无图片
分享
血色槲寄生
2019-04-16
redo,undo的问题疑问

老师好,因为听到过这么一个故事,某dba在检修升级快结束时发现一个超大事物操作错了,需要rollback,如果此时rollback时间肯定来不及,于是该dba直接shutdown abort了。于此产生一些疑问

1:超大事物commit前,是否一定不写入redo日志。

2:insert,update,delete哪种操作在rollback时用时最少,为什么。

3:insert,update,delete,在rollback一半宕机,恢复数据库时,数据库是什么状态,数据库在恢复时具体做了什么操作。

4.故事中的操作在极端情况下是否可行。

个人理解

1.commit前感觉应该不写入redo。

2.insert用时最少,update,delete用时一样,因为insert不需undo回写。

3.应该恢复到dml操作之前状态(事物一致性),如果commit前不写redo,那数据库对dml操作可以无视。

谢谢老师

收藏
分享
5条回答
默认
最新
李先生
  1. commit前,也是有可能写入redo的,这个可以参考重做日志缓冲区中的内容写到redo的几个条件。

  2. insert,update和delete的Rollback时间,时间和事务的大小有关,相比起来,insert产生的undo确实是要少一些的,因为update和delete都是保存数据修改前的映象的,所以生成的undo会多一些,rollback的时间上也会相应的长一点。

  3. Rollback一半宕机,open的时候数据库会继续回滚。

  4. 故事中的这个场景,虽然是可行的,但是在数据库重新启动的时候数据库就会进行一系列的前滚以及回滚操作。但是abort还是不建议用,这样可能会导致数据库无法启动等问题。

暂无图片 评论
暂无图片 有用 0
血色槲寄生

那数据库的前滚和回滚与rollback有什么本质不同,为什么时间少很多?

暂无图片 评论
暂无图片 有用 0
李先生

前滚是利用redo信息来对事务做一个重放/重现操作。

Rollback的时候,Oracle就会去找这个事务的undo信息,然后把undo信息应用到缓冲区缓存中的数据和索引块中,这些块就会恢复到原来的状态,这就是一个回滚操作。

回滚过程中从来不会涉及重做日志,只有恢复和归档时才会读取重做日志。


暂无图片 评论
暂无图片 有用 0
血色槲寄生

我明白了,恢复数据库是从redo恢复到操作之初,rollback是从undo恢复到操作之初,谢谢老师

暂无图片 评论
暂无图片 有用 0
章芋文
问题已关闭: 问题已经得到解决
暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏