简记 LGWR与DBWR 的操作

来源:互联网 发布:淘宝怎么给朋友发链接 编辑:程序博客网 时间:2024/05/22 04:53

用户DML或DDL操作数据库之后,导致数据库的对象发生变化的一个过程

 

首先进程会把提交的记录连同所产生的SCN一起写入重做日志缓冲区;如果是DML发出COMMT,或是DDL,那么重做日志写进程(LGWR)将把重做日志缓冲区中的所有记录连续地写到重做日志文件中。在此之后,oracle就能保证即使在系统崩溃的情况下,这些提交的数据也可以得以恢复。之后会提示用户此命令后之前所做的操作已经生效(提交已经完成);进程将修改数据库高速缓冲区中的相关数据的状态并释放资源和打开锁等;此时可能刚才操作的数据还在数据缓冲区中,这些数据所在的缓冲区被标为脏缓冲区,接着数据库写进程(DBWR)会把这些数据写进外存中。

       这也就出现了,在同一个时刻oracle是先写重做日志缓冲区中的数据而后写数据缓冲区中的数据,“为什么不同时写呢?”oracel的这种解决方案的最大优点就是在保证不丢失数据的情况下,数据库的效率不会受太大影响。因为重做日志文件中的记录是以最紧凑的格式存放的,所以它的I/O量会比数据文件的操作少的多。另外LGWR是顺序将重做日志缓冲区中的记录写到重做日志文件中的,这样其I/O速度又比数据块写到数据文件中快很多。

      LGWR除了会在COMMIT时把重做日志缓冲区中的数据写到重做日志文件以外,在下面四种情况下也会进行同样的操作:

1.当重做日志缓冲区中的记录超过1MB时。

2.当重做日志缓冲区中的记录超过该区容量的1/3时。

3.在DBWR进程进行操作之前。

4.每3秒钟。