您的位置:首页 > 数据库 > Oracle

Oracle 联机重做日志文件OnlineRedoLogFile

2014-08-13 22:48 302 查看
转载:http://blog.sina.com.cn/s/blog_406d9bb00100fxag.html

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


 
 

 

     但也有一种情况,就是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;         
13264
//有一行太宽了,不太好看,调窄些

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 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;

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

 

The End

谢谢观看!

update:

 

alter database add logfile group 4

('/app/oracle/product/oradata/test/redo04.log') size 50M;

alter database add logfile member

 '/home/oracle/yofee/redo04b.log' to group 4;

SQL> select group#,members,archived,status from v$log;

    GROUP#    MEMBERS ARC STATUS

---------- ---------- --- ----------------

         1          2 YES INACTIVE

         2          2 YES INACTIVE

         3          2 NO  CURRENT

         4          2 YES UNUSED

这个unused 的状态不用手动去改,当下一次日志切换的时候就会变成current,

SQL> alter system switch logfile;

System altered.

SQL> select group#,members,archived,status from v$log;

    GROUP#    MEMBERS ARC STATUS

---------- ---------- --- ----------------

         1          2 YES INACTIVE

         2          2 YES INACTIVE

         3          2 YES ACTIVE

         4          2 NO  CURRENT
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: