2011年(5)
分类: Oracle
2011-05-29 18:56:03
LGWR是一个非常重要的后台进程,主要负责将重做日志缓冲区的数据写入重做日志文件,LGWR是一个必须和前台用户进程通信的进程。当数据被修改的时候,系统会产生一个重做日志并记录在重做日志缓冲区内。这个Redo记录的条目大致可以认为是:
事务标示Transaction identifier
列信息Column address(File Block Row Column)
列的值Value of the column that changed
而日志缓冲区是一个循环缓冲区。在LGWR将日志缓冲区的日志项写入日志文件后,服务器进程可将新的日志项写入到该日志缓冲区。LGWR 通常写得很快,可确保日志缓冲区总有空间可写入新的日志项。
LGWR工作的主要条件如下:
l 用户提交
l 有1/3 重做日志缓冲区未被写入磁盘
l 有大于1MB重做日志缓冲区未被写入磁盘
l 超时
l DBWR需要写入数据的SCN号大于LGWR记录的SCN号,DBWR触发LGWR写入
所以,有时候当需要更多的日志缓冲区时,LWGR在一个事务提交前就将日志项写出,而这些日志项仅在事务提交后才永久化。 Oracle使用快速提交机制,当用户发出COMMIT语句时,一个COMMIT记录立即放入联机日志文件,但对应的数据缓冲区的数据块的改变,也就是上面说的“脏”数据,一直要等到满足条件才被DBWn写入数据文件。这样做的主要目的就是可以快速提交事务并返回给用户提交信息,但是又能确保事务的完整性。
当事务提交时,它被赋给一个系统修改号(SCN),同事务日志项一起记录在日志中。在Oracle 中,SCN是一个很重要的概念,贯穿整个Oracle体系结构。由于SCN也记录在日志中,所以,系统故障需要系统恢复的时候,就可以很容易地根据SCN来恢复。
如下图所示,Log Buffer默认大致可以分为三个部分,当写满其中一个部分,或者是遇到提交的时候,都会导致LGWR写数据。另外,LGWR也会有3s的超时限制,超过这个时间还没有写日志将会强制写,或者是大于1MB的限制也会强制写。因此基于以上的限制,在频繁提交的OLTP系统中,根本不需要有太大的Log buffer。
LGWR写进程