问题描述
老师好,因为听到过这么一个故事,某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操作可以无视。
谢谢老师
专家解答
1、commit前,也是有可能写入redo的,这个可以参考重做日志缓冲区中的内容写到redo的几个条件。
2、insert,update和delete的Rollback时间,时间和事务的大小有关,相比起来,insert产生的undo确实是要少一些的,因为update和delete都是保存数据修改前的映象的,所以生成的undo会多一些,rollback的时间上也会相应的长一点。
3、Rollback一半宕机,open的时候数据库会继续回滚。
4、故事中的这个场景,虽然是可行的,但是在数据库重新启动的时候数据库就会进行一系列的前滚以及回滚操作。但是abort还是不建议用,这样可能会导致数据库无法启动等问题。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。