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

WBOY
发布: 2016-06-07 15:21:38
原创
941 人浏览过

问题:在oracle中update一条记录,长时间不提交,DBWn会不会将脏块写入数据文件?LGWR会不会把redo log buffer中的记录写入onlin

问题:在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。

本文永久更新链接地址

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!