第一范文网 - 专业文章范例文档资料分享平台

ORACLE的工作机制

来源:用户分享 时间:2025/11/10 20:37:20 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

FER中的内容是最早向磁盘上回滚段中写的,写完这些才会生成日志BUFFER中的内容,原因是日志中必须要记录回滚段的新旧变化以便在恢复时从日志中的记录的回滚段新旧变化对回滚段再次重写,记住,REDO不光是对数据文件依据日志文件重写,也要依据日志文件对回滚段重写,而且重写回滚段要先于重写数据文件,要理解REDO就是重来一遍,所谓重来一遍就要跟正常的的先后顺利一样重做一遍(正常的操作中的顺序就是先读入DB BUFFER,写回滚段buffer,后写回滚段,后写日志BUFFER,后改写DB BUFFER,后写日志最后写数据文件)区别是REDO时不用再记日志了,这样解释后相信大家应该理解为什么日志中也必须要记录回滚段的信息了,只有这样才可以对正常操作中的一个ROLLBACK动作进行恢复,即在REDO过程中利用即时重写的数据块和回滚段重构出一个当时适用的前镜像来rollback。当一个重做日志文件写满后,LGWR将切换到下一个重做日志文件,重做日志文件也是循环工作方式。如果是归档模式,归档进程还将前一个写满的重做日志进程写入归档日志文件。当DB BUFFER改写之后,服务器进程在脏数据列表中建立一条指向此DB BUFFER缓冲块的指针。接着服务器进程会从数据文件读入第二个数据块(db block)重复以上读入,建立回滚段,写LOG BUFFER,改写DB BUFFER,放入脏列表的动作,当脏数据列表达到一定长度时,DBWN进程将脏数据列表中指向的缓冲块全部写入数据文件,也就是释放加在这些DB BUFER块上的锁存器,并在修改相应块的头部的SCN号(一次UPDATE操作只对应一个SCN)。前面说过DBWN动作之前会先触发LGWR,这用以确保写入数据文件的改变首先会被记录在日志文件中。实际上ORACLE可以从数据文件中一次读入多个块放入DB BUFFER,然后再对这些块建回滚段、再记日志等等,也就是每次操作的对象是DB BLOCK的复数,而不仅限于一次操作一个DB BLOCK,可以通过参数DB_FILE_MULTIBLOCK_READ_COUNT来设置一次读入的块的个数。注意,不管是否提交,用户的所有更改都会被记录在日志文件中,用户级回滚的动作(rollback)没有对应的COMMIT SCN。在密集事务的情况下,LGWR可以把多个COMMIT产生的REDO条目批量写入REDO LOG FILE,但每个COMMIT之间有十分之一秒的间隔,且会产生不同的COMMIT SCN。LGWR正常情况下是一个休眠进程,会被一定的条件触发,唤醒,比如COMMIT就是一个唤醒条

件,一旦LGWR被唤醒,LGWR将把唤醒时间点之前LOG BUFFER中产生的所有内容(从上次LGWR唤醒后到本次唤醒前之间写入LOG BUFFER的内容)写入LOG FILE,直到LGWR完成后,LGWR才可以被再次触发,在LGWR触发到完成期间所有对数据库的操作仍然可以不间断的加入LOG BUFFER。在这段时间内,LGWR不再接收其它条件的触发,比如紧跟前一个COMMIT之后的其它COMMIT(复数)都要等待LGWR完成后才可以再次触发LGWR,并在LGWR下次被触发时,将积累的REDO BUFFER条目一次性写入REDO LOG,后继的COMMIT不会单个单个的触发LGWR。

如果要查找的数据已缓存,则根据用户的SQL操作类型决定如何操作,如果是SELECT则查看DB BUFFER块的头部是否有事务,如果有,将利用回滚段进行重构出一致性块再读取,如果没有则比较SELECT的SCN与DB BUFFER块头部的SCN如果比自己大,仍然同上,如果比自己小则认这是一个非脏缓存,可以直接从这个DB BUFFER块中读取。如果是UPDATE则即使在DB BUFFER中找到一个没有事务,而且SCN比自己小的非脏缓存数据块,服务器进程仍然要到表的头部对这条记录申请加锁,加锁成功则进行后续动作,如果不成功,则要等待前面的进程解锁后才能进行动作。

ORACLE的工作机制-3 肖亚峰(xyf_tck)

只有当SQL语句影响的所有行所在的最后一个块被读入DB BUFFER并且重做信息被写入REDO LOG BUFFER(仅是指重做日志缓冲,而非重做日志文件)之后,用户才可以发出COMMIT,COMMIT触发LGRW,但并不强制立即DBWN来释放所有相应的DB BUFFER块上的锁,也就是说有可能出现已COMMIT,但在随后的一段时间内DBWN还在写这条语句涉及的数据块的情形,表头部的行锁,并不是在COMMIT一发出就马上释放,实际上要等到相应的DBWN进程结束才会释放。一个用户请求锁定另一个用户已COMMIT的资源不成功的机会是存在的。COMMIT发出后会将回滚段中的\前映像\标识为已提交.DML语句会产生一个SCN号,DBWN触发时写入到数据块的头部,COMMIT时也会产生一个SCN号,也会被写入数据块的头部。在数据块的头部只

存储一个最新的SCN号,COMMIT之后这个事务插槽可以被另外一个事务使用。

如果用户ROOLBACK,则服务器进程会根据数据文件块和DB BUFFER中块的头部的事务列表和SCN以及回滚段地址重构出相应的修改前的副本,并且用这些原值来还原当前数据文件中已修改但未提交的改变。如果有多个\前映像\,服务器进程会在一个\前映像\的头部找到\前前映像\的回滚段地址,一直重构出同一事务下的最早的一个\前映像\为止。一旦发出了COMMIT,用户就不能ROLLBACK,这使得COMMIT后DBWN进程还没有全部完成的后续动作得到了保障。

下面我们要提到检查点的作用,ckpt的触发,有以下几种情况: 1.当发生日志组切换的时候

2.当满足log_checkpoint_timeout、log_checkpoint_interval、fast_start_io_target、fast_start_mttr_target参数设置的时候

3.当运行alter system switchlogfile的时候 4.当运行alter systemckeckpoint的时候

5.当运行altertablespacetbs_namebegin backup[end backup]的时候

6.当运行altertablespace[datafile] offline的时候 7.系统正常关闭时

只有在4.7两种情况下发生完全检查点。发生完全检查点时,首先系统记录检查点对应的Checkpoint SCN,并记录下该时刻修改的DB BUFFER对应的日志文件的最新的重做字节地址(Redo Byte Address (RBA)),然后DBWN进程将这个重做字节地址(RBA)之前已发生的DB BUFFER中的脏缓冲写入数据文件(之所以要以重做字节地址(RBA)为标志是因为在检查点发生到检查点完成之间的时间内,系统还在一直不断的产生修改,这些修改所产生的DB BUFFER脏缓冲,以及日志条目将不会影响这次检查点最后确认的一致性结果,也就是最后确认这个Checkpoint SCN之前的系统是一致的)。最后把Checkpoint SCN和RBA更新至控制文件,Checkpoint SCN更新至每个数据文件头部,表明当前数据库是一致的。日志切换并不导致一个完全检点的发生,比如

有三个日志文件组,当发生日志切换时发生检查点,而发生日志切换一般是因为当前的LGWR正在写重做日志,也就是LGWR当刚写满2号日志就立即触发检查点,于是系统开始核对3号日志中记录的REDO项目所对应的数据是否已经从DB BUFFER中写入数据文件(不管事务是否已提交),如果没有写入,检查点就触发DBWN进程将这些缓冲块写入数据文件,显然LGWR因此而发生等待,除此以外,检查点还让DBWN进程将在2号日志中对应修改的DB BUFFER块写入数据文件,然后继续LGWR进程,直到LGWR进程将LGWR触发之前存在于REDO LOG BUFFER中的所有缓冲(包含未提交的重做信息)写入重做日志文件,检查点再更新数据文件,控制文件头部SCN。其实LGWR等待的并不是CKPT的完成,而是等待CKPT触发的DBWN进程的完成。可以想像断电时可能既有未COMMIT的事务,也可能同时存在已COMMIT但DBWN未完成的情况,如果断电时有一个已COMMIT但DBWN动作没有完成的情况存在,因为已经COMMIT,COMMIT会触发LGWR进程,所以不管DBWN动作是否已完成,该语句将要影响的行及其产生的结果一定已经记录在重做日志文件中了,则实例重启后,SMON进程从控制文件中记录的上一次重做字节地址(RBA)开始,按照重做日志文件中的条目对数据文件和回滚段重新做一遍即前滚,注意这些条目的操作在断电之前有的已经被DBWN写入了数据文件,有的还没有来得及写,不管有没有写进数据文件,前滚时都会再重新写一次(9I之前是这样的),9I之后,由于也在日志中记录了DBWN改写的块信息,系统会过滤掉已写入的条目而只重做那些未写入的条目。对于一个未提交事务,分几种情况来描述:1)LGWR与DBWN一致的情况即一个语句执行完成后很长时间也没有COMMIT,这种情况一般不存在DBWN来不及完成的情况。只是没有COMMIT而已。那么SMON将在前滚完成后,利用回滚段重构出具有最小SCN的前映像,并把它的值写回原位。2)事务执行中断电,即可能存在LGWR与DBWN不同步的情况(因为DBWN之前会触发LGWR,所以DBWN对数据文件的修改一定会被先记录在重做日志文件中。因此只可能存在已写入重做日志而未来得及写入数据文件的情况存在。而

不可能存在已写入数据文件却没有写入日志文件的情况。),这种情况下SMON也会

先前滚一点(即把数据文件与相应的日志文件先同步再回滚,之所以说前滚一点,是指仅LGWR与DBWN之间进度的差距,而不是把这条语句进行到底再回滚,

搜索更多关于: ORACLE的工作机制 的文档
ORACLE的工作机制.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c7wb930ypti0fvam2h1ng_2.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top