OnlineRedoLogFile的主要作用应该是为了提高数据库性能,有变动的数据信息不直接写入磁盘而是先通过 LGWR 把数据写入到 OnlineRedoLogFile 里面,然后再用 DBWR 写进磁盘。大概的流程是写满第一组后写第二组再写第三组然后转回来继续写第一组。每写完一组再转到下一组的时候会发生 log switch, 这时也会自动启动 check point, 所谓 check point 就是把当前的 redo 文件通过 DBWR 写入到磁盘中去,这样的话下次转到继续写他的时候以前的数据才不会丢失。最少要有两个组,每个组最少要有一个成员,当然为了数据安全不丢失,一般都要弄至少两到三个成员分别放到不同的磁盘上去。
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
      但也有一种情况,就是 LGWR 很勤快,一个劲地放 OnlineRedoLogFile 里面写东西,并且 OnlineRedoLogFile 也设置得比较小,一会儿就写满了,然后写下一个,等到转过来准备继续写第一组的时候, DBWR 都还没来得及把以前的数据写入磁盘,悲剧就发生了。新的数据进不来,数据库就会卡起, 要等到 DBWR 把数据写进磁盘, LGWR 转过去把 ORLF 的空间腾出来后数据库才会恢复正常,这个对数据库的性能方面影响貌似很大的说。这种问题的解决办法有两种。
       一种是直接手动强制 DBWR 马上运行把数据写进磁盘。
SQL> alter system checkpoint;

 

System altered

 

       二种是把 DBWR 自动执行的时间调得更短一些。 这里举例把他设成每 2000 秒执行一次
SQL> show parameter fast

 

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
fast_start_io_target                 integer     0
fast_start_mttr_target               integer     0
fast_start_parallel_rollback         string      LOW
SQL> alter system set fast_start_mttr_target=2000 scope=both;

 

System altered.

 

SQL> show parameter fast        // 查看是否更改成功

 

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
fast_start_io_target                 integer     0
fast_start_mttr_target               integer     2000
fast_start_parallel_rollback         string      LOW

 

下面介绍一下怎么在组之间进行手工切换的操作
SQL> desc V$controlfile                // 先复习一下以前怎么看控制文件的
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 STATUS                                             VARCHAR2(7)
 NAME                                               VARCHAR2(513)
 IS_RECOVERY_DEST_FILE                              VARCHAR2(3)
 BLOCK_SIZE                                         NUMBER
 FILE_SIZE_BLKS                                     NUMBER

 

SQL> col name format a35;         // 有一行太宽了,不太好看,调窄些
SQL> select * from V$controlfile;    // 于是我们可以看到当前有四个控制文件

 

STATUS  NAME                                IS_ BLOCK_SIZE FILE_SIZE_BLKS
------- ----------------------------------- --- ---------- --------------
        /u01/oradata/yofee/control01.ctl    NO       16384            594
        /u01/oradata/yofee/control02.ctl    NO       16384            594
        /u01/oradata/yofee/control03.ctl    NO       16384            594
        /u01/oradata/yofee/control04.ctl    NO       16384            594

 

SQL> desc v$log;                 // 同样的道理,我们可以这样查看 redolog 文件信息
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 GROUP#                                             NUMBER
 THREAD#                                            NUMBER
 SEQUENCE#                                          NUMBER
 BYTES                                              NUMBER
 MEMBERS                                            NUMBER
 ARCHIVED                                           VARCHAR2(3)
 STATUS                                             VARCHAR2(16)
 FIRST_CHANGE#                                      NUMBER
 FIRST_TIME                                         DATE

 

SQL> select group#,thread#,sequence#,status from v$log;      // 查看当前哪一个组是激活的

 

    GROUP#    THREAD#  SEQUENCE# STATUS
---------- ---------- ---------- ----------------
         1          1         10 CURRENT
         2          1          8 INACTIVE
         3          1          9 INACTIVE

 

SQL> alter system switch logfile;                      // 切换当前组

 

System altered.

 

SQL> select group#,thread#,sequence#,status from v$log;    // 验证一下

 

    GROUP#    THREAD#  SEQUENCE# STATUS
---------- ---------- ---------- ----------------
         1          1         10 ACTIVE
         2          1         11 CURRENT
         3          1          9 INACTIVE

 

.

 

SQL> desc v$logfile;              // 查看这个视图的列,发现 Member 这个字段很长,于是我们决定把这一列弄短一点
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 GROUP#                                             NUMBER
 STATUS                                             VARCHAR2(7)
 TYPE                                               VARCHAR2(7)
 MEMBER                                             VARCHAR2(513)
 IS_RECOVERY_DEST_FILE                              VARCHAR2(3)

 

SQL> col member format a40      // 把他弄成 40
SQL> select * from v$logfile;    // 现在可以查看一下这个显示得很规则的视图信息了,从这里面我们能看到有三组 OnlineRedoLogfile , 每组一个 Member (不安全啊,其实应该多建几个成员然后分别放到不同的磁盘上去的),现在我们准备先再加一组上去

 

    GROUP# STATUS  TYPE    MEMBER                                   IS_
---------- ------- ------- ---------------------------------------- ---
         3         ONLINE  /u01/oradata/yofee/redo03.log            NO
         2         ONLINE  /u01/oradata/yofee/redo02.log            NO
         1         ONLINE  /u01/oradata/yofee/redo01.log            NO

 

SQL> alter database add logfile group 4    
  2  ('/u01/oradata/yofee/redo04.log') size <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />50M;                     // 加一个 group4 并在这组里面加了一个大小为 50M 的成员

 

Database altered.

 

SQL> !    // 切换到 Linux 环境,去他的目录查看一下,发现真的创建成功了!
[oracle@oracle11g ~]$ cd /u01/oradata/yofee
[oracle@oracle11g yofee]$ ll
total 1777220
-rw-r-----  1 oracle oinstall   9748480 Nov 12 07:43 control01.ctl
-rw-r-----  1 oracle oinstall   9748480 Nov 12 07:43 control02.ctl
-rw-r-----  1 oracle oinstall   9748480 Nov 12 07:43 control03.ctl
-rw-r-----  1 oracle oinstall   9748480 Nov 12 07:43 control04.ctl
-rw-r-----  1 oracle oinstall   9748480 Nov 11 10:58 control05.ctl
-rw-r-----  1 oracle oinstall 104865792 Nov 12 07:40 example01.dbf
-rw-r-----  1 oracle oinstall  52429312 Nov 12 07:43 redo01.log
-rw-r-----  1 oracle oinstall  52429312 Nov 12 07:31 redo02.log
-rw-r-----  1 oracle oinstall  52429312 Nov 12 07:31 redo03.log
-rw-r-----  1 oracle oinstall  52429312 Nov 12 07:43 redo04.log
-rw-r-----  1 oracle oinstall 620371968 Nov 12 07:40 sysaux01.dbf
-rw-r-----  1 oracle oinstall 734011392 Nov 12 07:40 system01.dbf
-rw-r-----  1 oracle oinstall  29368320 Nov 12 06:57 temp01.dbf
-rw-r-----  1 oracle oinstall  89137152 Nov 12 07:40 undotbs01.dbf
-rw-r-----  1 oracle oinstall   5251072 Nov 12 07:40 users01.dbf
[oracle@oracle11g yofee]$ exit        // 现在继续进入 ORACLE 环境在 group4 里面再创建一个 OnlineRedoLogFile, 这时就不用指定大小了,因为同一个组里面的成员大小肯定是一样的三
exit

 

SQL> alter database add logfile member
  2  '/u01/oradata/yofee/redo04a.log' to group 4;

 

Database altered.

 

SQL> select * from v$logfile;     // 好,我们再来看看这些 redoLogFile 信息,发现另外这一个也创建好了并且和刚才那个属于同一组,只不过他的状态是 INVALID 的。

 

    GROUP# STATUS  TYPE    MEMBER                                   IS_
---------- ------- ------- ---------------------------------------- ---
         3         ONLINE  /u01/oradata/yofee/redo03.log            NO
         2         ONLINE  /u01/oradata/yofee/redo02.log            NO
         1         ONLINE  /u01/oradata/yofee/redo01.log            NO
         4         ONLINE  /u01/oradata/yofee/redo04.log            NO
         4 INVALID ONLINE  /u01/oradata/yofee/redo04a.log           NO
下面介绍一下怎么删除一个组里面其中一个成员(前提是他不是当前激活状态组的成员并且要保证他里面的数据已经归档了,否则会丢失上面的数据)
SQL> select * from v$logfile;

 

    GROUP# STATUS  TYPE    MEMBER                                   IS_
---------- ------- ------- ---------------------------------------- ---
         3         ONLINE  /u01/oradata/yofee/redo03.log            NO
         2         ONLINE  /u01/oradata/yofee/redo02.log            NO
         1         ONLINE  /u01/oradata/yofee/redo01.log            NO
         4         ONLINE  /u01/oradata/yofee/redo04.log            NO
         4 INVALID ONLINE  /u01/oradata/yofee/redo04a.log           NO

 

SQL> alter database drop logfile member '/u01/oradata/yofee/redo04a.log';

 

Database altered.        // 这一步其实只是在控制文件里面把这 LOG 文件信息取消掉了,但真实的那个物理文件还是存在的。
下一步自然就是切换到 Linux 环境,然后找到他的目录将其删除 (RM -f)
走到这一步的时候, group 4 里面也就只有一个 log 文件了,我们必须通过删除组来达到这个目的,因为每个组里面必须得有一个成员嘛。
删除组:

 

// 状态是 Inactive 表示已经发生 checkpoint, 已经被 DBWR 写入进磁盘了,可以删除掉,如果是 active 表示已经存在脏数据, DBWR 还没有运行。一般都会让 group 连续,现在要删的话就删 4 。如果他当前是 current 状态的话就切换一下组。
Alter system switch logfile;
SQL> select group#,members,archived,status from v$log;   

 

    GROUP#    MEMBERS ARC STATUS
---------- ---------- --- ----------------
         1          1 NO  CURRENT
         2          1 NO  INACTIVE
         3          1 NO  INACTIVE
         4          1 YES UNUSED

 

Alter database drop logfile group 4;
当然,和以前一样,我们还得在对就的目录去把这个组的成员物理地删除掉便大功告成了。