oracle 關於-日誌檔案

邱東陽發表於2014-04-02

Oracle資料庫中的日誌常用的有:

Redo log files      聯機日誌或重做日誌

Archived log files   歸檔日誌

Alert log files      告警日誌

Trace files         user_dump_dest    使用者資訊日誌(如跟蹤會話日誌)

                 Backupground_dump_dest           程式日誌

 

 

重做日誌檔案

重做日誌檔案會記錄對於資料庫的任何操作,如利用DML語句或者DDL語句對資料庫進行更改,或者資料庫

管理員對資料庫結構進行更改,都會在重做日誌中進行記錄。

當資料庫被以外的刪除或者修改,可以利用重做日誌檔案進行恢復,出現例程失敗或者介質失敗的情況下,也可以利用日誌檔案實現例程恢復或者介質恢復。

在資料庫出現故障時,可以根據重做日誌檔案中記錄的內容進行重做與前滾

維護資料庫的一致性,對資料的操作都會記錄在重組日誌中。

只有在歸檔模式下才能實現重做日誌的備份

重做日誌的要求:

在重做日誌中必須要有兩個或以上的組,每個組下面必須要有一個成員。

日誌切換:

在重做日誌檔案中由一個組切換到下一個組的過程,就叫做日誌切換。(在切換的時候如果其中一個組沒有成員或者成員損壞,

                                                                   那麼系統會奔潰。因為LGWR後臺程式寫入失敗發生衝突

導致LGWR中斷。所以系統會崩潰)

日誌檔案時按照迴圈順序的方式書寫,寫滿一個組,自動切換另一個組,都寫滿了在覆蓋第一個組。一直迴圈

 

自動切換---系統自動完成日誌切換。

手動切換----執行命令強制進行日誌切換。 (alter system switch logfile;)

 

 

redo 日誌檔案管理:

規劃原則: 分散放開到不同的硬碟,日誌所在盤的IO要足夠,IO讀寫要快

增加減少日誌成員或組

日誌狀態與監視

處理日誌的異常

 

 

日誌檔案的增加刪除

 

 

SQL> select * from v$logfile;

 

    GROUP# STATUS  TYPE    MEMBER                                   IS_

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

         1 STALE   ONLINE  +DATA/fengzi/onlinelog/group_1.271.84218 NO

                           7003

 

         2         ONLINE  +DATA/fengzi/onlinelog/group_2.273.84218 NO

                           7037

 

         3 STALE   ONLINE  +DATA/fengzi/onlinelog/group_3.275.84218 NO

                           7067

 

3 rows selected.

對於v$logfile檢視中STATUS列常見值:

INVALID:表明該檔案不可訪問

STALE: 表示檔案內容不全

DELETED:表示該檔案已不在使用

空白: 表示正在被使用

 

SQL> select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS  ARC     STATUS

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

FIRST_CHANGE# FIRST_TIME

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

         1          1         34   52428800          1    YES       INACTIVE

       688405 24-MAR-14

 

         2          1         35   52428800          1    NO        CURRENT

       720096 24-MAR-14

 

         3          1         33   52428800          1    YES        INACTIVE

       655563 21-MAR-14

 

 

SQL>

對於V$LOG檢視 STATUS 常見的值:

UNUSED: 表示從未對聯機重做日誌檔案組進行寫入,這是剛新增的聯機重做日誌檔案狀態。

CURRENT:表示當前的聯機重做日誌組,這說明該聯機重做日誌組是活動的。

ACTIVE:表示聯機重做日誌組是活動的,但是並不是當前的聯機重做日誌組。崩潰恢復需要該狀態,

可用於塊恢復。可能已經歸檔,也可能未歸檔。                                                                 

CLEARING:表示在執行ALTER DATABASE CLEAR LOGFILE;命令後正在將該日誌重建為一個空日誌。日誌清楚後狀態改為UNUSED.

CLEARING_CURRENT: 表示正在清除當前日誌檔案中的已關閉執行緒。如果切換時發生某些故障,則日誌可能處於次狀態。

INACTIVE:表示例程恢復不在需要次聯機重做日誌組。可能已歸檔,也可能未歸檔。

 

 

 

新增一個日誌組

SQL> alter database add logfile group 4 '+data/fengzi/onlinelog/group_4.log' size 50m;

 

Database altered.

 

SQL>

 

SQL> select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS

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

FIRST_CHANGE# FIRST_TIME

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

         1          1         34   52428800          1 YES INACTIVE

       688405 24-MAR-14

 

         2          1         35   52428800          1 NO  CURRENT

       720096 24-MAR-14

 

         3          1         33   52428800          1 YES INACTIVE

       655563 21-MAR-14

 

         4          1          0   52428800          1 YES UNUSED

            0

進行日誌切換時 優先選擇使用 UNUSED狀態的組

 

新增一個日誌組,指定2個成員

SQL> alter database add logfile group 5 ('+data/fengzi/onlinelog/group_5_1.log','+data/fengzi/onlinelog/group_5_2.log') size 50m;

Database altered.

 

SQL>select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS

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

FIRST_CHANGE# FIRST_TIME

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

         1          1         34   52428800          1 YES INACTIVE

       688405 24-MAR-14

 

         2          1         35   52428800          1 NO  CURRENT

       720096 24-MAR-14

 

         3          1         33   52428800          1 YES INACTIVE

       655563 21-MAR-14

 

         4          1          0   52428800          1 YES UNUSED

            0

 

         5          1          0   52428800          2 YES UNUSED

            0

SQL>

發現新新增的group 5 成員有兩個

 

 

一次新增多個組 一個組一個成員一個組多個成員

SQL> alter database add logfile group 6 '+data/fengzi/onlinelog/group_6.log' size 50m,

group 7 ('+data/fengzi/onlinelog/group_7_1.log','+data/fengzi/onlinelog/group_7_2.log') size 50m;

 

 

向組中新增成員

SQL> alter database add logfile member '+data/fengzi/onlinelog/group_4.log' to group 4;

 

新新增的成員的大小與組中成員的大小是一致的,會自動分配。

 

向多組新增成員

SQL> alter database add logfile member '+data/fengzi/onlinelog/group_1.log' to group 1 '+data/fengzi/onlinelog/group_2.log' to group 2;

 

 

刪除組

SQL> alter database drop logfile group 4;   --查詢v$LOG檢視的狀態為CURRENTACTIVE是刪除不掉的,因為在迴圈之內

Database altered.                       –想要刪除,需要手動切換日誌,切換到可以刪除的狀態alter system switch logfile

 

SQL>

刪除多個組

SQL> alter database drop logfile group 4,group 5;

 

 

刪除組中的某一個成員

SQL> alter database drop logfile member '+data/fengzi/onlinelog/group_5_1.log';

 

Database altered.

 

SQL>

刪除兩個組中不同成員

SQL>alter  database  drop  logfile   member  '+DATA/fengzi/onlinelog/group_1.log ',

'+DATA/fengzi/onlinelog/group_2.log';

 

一個組下必須有一個成員,所以不能把所有成員刪除,想要刪除只能刪除組,系統中必須要有兩個組。

 

日誌檔案的重新命名

資料庫必須處於歸檔模式 (想在非歸檔模式下進行修改需要一致性關閉資料庫啟動到mount狀態)

當檔案處於CURRENT狀態時是不能被修改的

alter system switch logfile 切換日誌,直到能重新命名為止

 

 

檔案系統

重新命名redo logfile /u01/app/oracle/oradata/fengzi/redo03.log的日誌檔案

SQL> ho cp  /u01/app/oracle/oradata/fengzi/redo03.log  /u01/app/oracle/oradata/fengzi/fengziredo1.log

                                老的檔案                                     新的檔案

SQL> alter database rename file ‘/u01/app/oracle/oradata/fengzi/redo03.log’

to /u01/app/oracle/oradata/fengzi/fengziredo1.log

 

 

ASM

ASM可以直接使用asmcmd工具中的mkalias命令對檔案進行重新命名

[oracle@dongyang ~]$ echo $ORACLE_SID

+ASM

[oracle@dongyang ~]$ asmcmd

ASMCMD> ll

        commands:

        -------- 

        cd

        du

        find

        help

        ls

        lsct

        lsdg

        mkalias

        mkdir

        pwd

        rm

        rmalias

ASMCMD>

ASMCMD> cd data/fengzi/onlinelog

ASMCMD> ls

group_1.271.842187003

group_1.272.842187017

group_2.273.842187037

group_2.274.842187053

group_3.275.842187067

group_3.276.842187083

group_4.304.843302545

group_4.log

ASMCMD> mkalias group_1.271.842187003 redo02.log

ASMCMD> ls

group_1.271.842187003

group_1.272.842187017

group_2.273.842187037

group_2.274.842187053

group_3.275.842187067

group_3.276.842187083

group_4.304.843302545

group_4.log

redo02.log

ASMCMD>

 

SQL> alter database rename file '+DATA/fengzi/onlinelog/group_1.271.842187003' to '+DATA/fengzi/onlinelog/redo02.log';

 

 

Database altered.

 

SQL> select * from v$logfile;

 

    GROUP# STATUS  TYPE    MEMBER                                   IS_

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

         1 STALE   ONLINE  +DATA/fengzi/onlinelog/redo02.log        NO

         1 STALE   ONLINE  +DATA/fengzi/onlinelog/group_1.272.84218 YES

                           7017

 

         2         ONLINE  +DATA/fengzi/onlinelog/group_2.273.84218 NO

                           7037

 

         2         ONLINE  +DATA/fengzi/onlinelog/group_2.274.84218 YES

                           7053

 

         3 STALE   ONLINE  +DATA/fengzi/onlinelog/group_3.275.84218 NO

 

    GROUP# STATUS  TYPE    MEMBER                                   IS_

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

                           7067

 

         3 STALE   ONLINE  +DATA/fengzi/onlinelog/group_3.276.84218 YES

                           7083

 

 

6 rows selected.

 

SQL>

 

日誌檔案狀態與監視

所謂的監視就是檢視位置在哪,是否存在

檢視磁碟空間是否足夠

看日誌組下是否有多個成員

監視日誌切換間隔時間

 

首先要檢視日誌檔案在不在

SQL> select member from v$logfile;

 

MEMBER

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

+DATA/fengzi/onlinelog/redo02.log

+DATA/fengzi/onlinelog/group_1.272.842187017

+DATA/fengzi/onlinelog/group_2.273.842187037

+DATA/fengzi/onlinelog/group_2.274.842187053

+DATA/fengzi/onlinelog/group_3.275.842187067

+DATA/fengzi/onlinelog/group_3.276.842187083

 

6 rows selected.

 

SQL>

[oracle@dongyang ~]$ echo $ORACLE_SID

+ASM

[oracle@dongyang ~]$ asmcmd

ASMCMD> cd data/fengzi/onlinelog

ASMCMD> ls

group_1.271.842187003

group_1.272.842187017

group_2.273.842187037

group_2.274.842187053

group_3.275.842187067

group_3.276.842187083

redo02.log

ASMCMD>

檢視磁碟空間

ASMCMD> lsdg

State    Type    Rebal  Unbal  Sector  Block       AU  Total_MB  Free_MB  Req_mir_free_MB  Usable_file_MB  Offline_disks  Name

MOUNTED  NORMAL  N      N         512   4096  1048576     16376     9057             4094            2481              0  DATA/

ASMCMD>

 

檢視日誌檔案切換間隔時間

SQL> select to_char(first_time,'YYYY-MM-DD HH24:MI:SS'),GROUP# from v$log;

 

TO_CHAR(FIRST_TIME,     GROUP#

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

2014-03-24 09:03:31          1

2014-03-24 13:39:46          2

2014-03-23 11:26:40          3

 

SQL>

如果間隔時間不滿足15分鐘到20分鐘之間就應該修改日誌檔案的大小。

 

改變日誌檔案大小

SQL> select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS

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

FIRST_CHANGE# FIRST_TIME

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

         1          1         34   52428800          2 YES INACTIVE

       688405 24-MAR-14

 

         2          1         35   52428800          2 NO  CURRENT  --當前使用

       720096 24-MAR-14

 

         3          1         33   52428800          2 YES INACTIVE

       655563 21-MAR-14

SQL>

將日誌組大小改為100m 需要先刪除組,在刪除組物理檔案。最後重建

(只能1個組1個組的刪,必須保留2個組,只能刪除迴圈之外的)

SQL> alter database drop logfile group 3;

 

Database altered.

 

SQL>

ASMCMD> ls

group_1.271.842187003

group_1.272.842187017

group_2.273.842187037

group_2.274.842187053

group_3.262.842184305

group_3.263.842184319

redo02.log

ASMCMD> rm group_3.263.842184319

ASMCMD> rm group_3.262.842184305

重建組與成員

SQL> alter database add logfile group 3 ('+data/fengzi/onlinelog/group_3_1.log','+data/fengzi/onlinelog/group_3_2.log') size 100m;

刪除另一個迴圈之外組

SQL> alter database drop logfile group 1;

Database altered.

 

SQL>

ASMCMD> ls

group_1.271.842187003

group_1.272.842187017

group_2.273.842187037

group_2.274.842187053

group_3.262.843384567

group_3.263.843384577

group_3_1.log 

group_3_2.log

redo02.log

ASMCMD> rm group_1.271.842187003

ASMCMD> rm group_1.272.842187017

 

SQL> alter database add logfile group 1 ('+data/fengzi/onlinelog/group_1_1.log','+data/fengzi/onlinelog/group_1_2.log') size 100m;

 

Database altered.

 

SQL>

刪除當前使用的組必須切換日誌

一直切換日誌,直到切換到組2INACTIVE為止

SQL> alter system switch logfile;

 

System altered.

 

SQL> select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS

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

FIRST_CHANGE# FIRST_TIME

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

         1          1         42  104857600          2 YES INACTIVE

       771647 28-MAR-14

 

         2          1         41   52428800          2 YES INACTIVE

       771612 28-MAR-14

 

         3          1         43  104857600          2 NO  CURRENT

       771651 28-MAR-14

 

 

SQL>

切換完成刪除重建組2

SQL> alter database drop logfile group 2;

 

Database altered.

 

SQL>

ASMCMD> rm group_2.273.842187037

asmcmd: entry 'group_2.273.842187037' does not exist in directory '+data/fengzi/onlinelog/'

ASMCMD> ls     --發現組2物理檔案已經不在

group_1.271.843385069

group_1.304.843385081

group_1_1.log

group_1_2.log

group_3.262.843384567

group_3.263.843384577

group_3_1.log

group_3_2.log

ASMCMD>

 

SQL> alter database add logfile group 2 ('+data/fengzi/onlinelog/group_2_1.log','+data/fengzi/onlinelog/group_2_2.log') size 100m;

 

Database altered.

 

SQL> select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS

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

FIRST_CHANGE# FIRST_TIME

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

         1          1         42  104857600          2 YES INACTIVE

       771647 28-MAR-14

 

         2          1          0  104857600          2 YES UNUSED

            0

 

         3          1         43  104857600          2 NO  CURRENT

       771651 28-MAR-14

 

                 

SQL>                          OK 修改日誌檔案大小成功

 

日誌檔案的異常處理

首先檢視告警日誌確認錯誤原因

 

對於日誌檔案的不一致(只有在資料庫啟動時報錯日誌檔案不一致才能使用下面命令)

 

第一種方法:清空不一致的日誌組 (只能清除一個迴圈之外的組也就是 INACTIVE狀態)

SQL>alter database clear logfile group <N>;

 

另一種方法: 清除日誌,可以清除 ACTIVE 狀態的組

SQL>alter database clear unarchived logfile group <N>;

對於CURRENT狀態是不能清除的,只需要切換日誌就可以清除

 

 

對於日誌檔案丟失與損壞  (要看資料庫是否是一致性關閉的)

 

如果是一致性關閉的資料庫可以使用清空指令 (發現清空之後日誌檔案會自動生成)

SQL>alter database clear logfile group <N>;

SQL>alter database open;

如果非一致性關閉資料庫的是清空不了的

 

可以使用欺騙手段恢復資料庫(在歸檔模式下是可以使用這種方法)

 

SQL> recover database using backup controlfile;

Specify log             --直接回車什麼都不做

 

SQL> alter database open resetlogs; 

SQL> recover database;  

SQL> alter database open resetlogs;

 

還可以直接使用隱藏引數解決 (這個隱藏引數的作用是忽略一致性的驗證)

SQL> alter system set "_allow_resetlogs_corruption" =true scope=spfile;

 

SQL> startup force mount     

SQL>alter database open resetlogs;

SQL> alter system reset " _allow_resetlogs_corruption" scope=spfile sid='*';  (用完之後一定要幹掉隱藏引數)

 

 

在非歸檔模式下可以組合以上方法解決

SQL> alter system set "_allow_resetlogs_corruption" =true scope=spfile;

SQL> recover database using backup controlfile;

Specify log             --直接回車什麼都不做

 

SQL> alter database open resetlogs; 

SQL>shutdown immediate;

SQL>startup

SQL> alter database open resetlogs; 

SQL> alter system reset  " _allow_resetlogs_corruption" scope=spfile sid='*';

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29532781/viewspace-1134340/,如需轉載,請註明出處,否則將追究法律責任。

相關文章