日志缓冲区(redo log buffer)及日志写进程(LGWR)剖析

                                                   日志缓冲区(redo log buffer)及日志写进程(LGWR)剖析



REDO LOG BUFFER:

日志中记录数据块的地址,更改的时间以及对数据块做了哪些改变。

Oracle在执行任何DML和DDL操作改变数据之前,都会将恢复所需要的信息,先写入redo log buffer,然后再写入database buffer cache。

① 如果数据和回滚数据不在database buffer cache中,server process会将它们从dbf文件中读取到database buffer cache中。

② server process会在要修改的数据行上添加行级锁。

③ server process将数据的变化信息和回滚所需的信息都写入redo log buffer

④ server process将对数据所做的修改后的数据信息写入database buffer cache,然后将database buffer cache中的这些数据标记为脏数据(此时内存中的数据和磁盘上的数据是不一致的)。

⑤ LGWR将重做日志缓冲区中的数据写入重做日志文件中。

⑥ DBWndatabase buffer cache的脏数据写入数据文件中。

LGWR:

LGWR的触发条件:

1.事务提交时

2.Log buffer中的数据超过1m时

3.当log buffer中的数据超过_log_io_size隐含值时

4.每隔3s

当事务提交时,会产生一个提交的redo record,这个redo record写入log buffer后,服务器进程(server process)会触发LGWR进行日志写操作。

有些系统中,平均每个事务的大小很大,有的为1m甚至更大,但是平均下来每秒的事务数却很小,这样通过提交来触发LGWR工作的机会很小,很有可能导致数据的积压,而数据量超过1m触发LGWR进行日志写操作正是为了解决这种情况。

_log_io_size参数的默认值是log buffer的三分之一,这个参数的意义是当log buffer中的buffer占用量超过这个参数的数值时会触发LGWR进行日志写操作,从而防止log buffer空间被消耗殆尽。

如果一个系统长时间没有事务提交,log buffer中的空间也很空闲,就可能导致log buffer中的数据长时间不写入redo log file中,增加数据丢失的风险,所以oralce通过每隔3s触发一次LGWR进行日志写操作大大的降低了这种风险。

你可能感兴趣的:(oracle)