LGWR的出发条件:
1. 用户提交,commit;
2. 有1/3重做日志缓冲区未被写入磁盘;
3. 有大于1M的重做日志缓冲区未被写入磁盘;
4. 每隔3秒钟;
5. DBWR需要写入的数据的SCN大于LGWR记录的SCN,DBWR出发LGWR写入;
对第5点的解释:
对于一个脏buffer,oracle保证,在脏buffer被DBWR写回block以前,脏buffer对应的重做日志一定是写到磁盘了。如果重做日志没有写回磁盘,oracle会先触发LGWR把重做日志写回磁盘,然后BDWR才把脏buffer写回block。日志总是先于buffer写到磁盘上。这叫做日志写入优先。
对硬盘来讲有一个参数:IOPS(IOper second),每秒IO的次数。
LGWR的特点:
1. 非常频繁,写的次数多,即IOPS大;
2. LGWR一次写的量比较小;
3. LGWR是顺序写;
Log buffer大小设置:
1. 在9i以前,一般是3M;
2. 在10g中oracle会自动调整大小,遵循这样一个原则:‘fixed SGA size’+‘redo buffer ’是granule size的整数倍;
Oracle把SGA和PGA内存分成一个个粒度(granule),粒度大小是oracle自己去调整的。粒度是oracle内存分配的最小单位。相当于windows内存管理的内存页概念。
Oracle的redo log有多个组,查看oracle日志组:
SQL> select * from v$log;
查看每个日志组有几个成员:
SQL> select * from v$logfile;
Redo log比dbf还要重要,dbf可以丢失,但是redo log千万不要丢失。
假设redo log有四个组,每组两成员,成员1放在磁盘1上,成员2放在磁盘2上。磁盘1损坏,成员1丢失,还有磁盘2的成员2,这就留下了冗余。
对日志组的增删改:
有了以上命令就能对oracle的体系结构进行变化了。
Redo log的切换:
Redo log1写满之后开始写redolog2,这就叫切换。我们要把redo log从开始写到写满的时间控制在10-20分钟之间。
查看日志切换时间:
SQL> selectto_char(FIRST_TIME,'yyyy-mm-dd hh24:mi:ss') f_time from v$log_history; F_TIME --------------------------------------------------------------------------- 2012-03-1610:41:36 2012-03-1610:43:24 2012-03-1610:51:02 2015-11-0820:58:54 2015-11-0920:05:42 2015-11-1022:00:19 2015-11-1610:09:39 7 rows selected.
手工切换redo log日志(强行切换):
<pre name="code" class="sql">SQL> altersystem switch logfile; System altered.
然后再查看日志切换时间:
SQL> selectto_char(FIRST_TIME,'yyyy-mm-dd hh24:mi:ss') f_time from v$log_history; F_TIME --------------------------------------------------------------------------- 2012-03-1610:41:36 2012-03-1610:43:24 2012-03-1610:51:02 2015-11-0820:58:54 2015-11-0920:05:42 2015-11-1022:00:19 2015-11-1610:09:39 2015-11-1711:19:24 8 rows selected.
发现多了一条数据