Oracle 聯機重做日誌文件OnlineRedoLogFile

轉載:http://blog.sina.com.cn/s/blog_406d9bb00100fxag.html



OnlineRedoLogFile的主要作用是爲了提高數據庫性能,有變動的數據信息不直接寫入磁盤而是先通過LGWR把數據寫入到OnlineRedoLogFile裏面,然後再用DBWR寫進磁盤。大概的流程是寫滿第一組後寫第二組再寫第三組然後轉回來繼續寫第一組。每寫完一組再轉到下一組的時候會發生log switch, 這時也會自動啓動check point, 所謂check point 就是把當前的 redo文件通過DBWR寫入到磁盤中去,這樣的話下次轉到繼續寫他的時候以前的數據纔不會丟失。最少要有兩個組,每個組最少要有一個成員,當然爲了數據安全不丟失,一般都要弄至少兩到三個成員分別放到不同的磁盤上去。
Oracle <wbr>聯機重做日誌文件OnlineRedoLogFile  

 

     但也有一種情況,就是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 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


發佈了3 篇原創文章 · 獲贊 6 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章