Oracle當前聯機日誌組損壞的處理

Oracle當前聯機日誌組損壞的處理
 
oracle 日誌的特性總結
 
oracle 日誌切換規律(從最大sequence#號切換到最小sequence#號)
 
eg 如下所示:下個當前日誌組會是sequence#號爲27的5號日誌組
SQL> select group#,archived,sequence#,status from v$log;
 
    GROUP# ARC SEQUENCE# STATUS
---------- --- ---------- ----------------
         1 NO         32 CURRENT
         2 YES         28 INACTIVE
         3 YES         29 INACTIVE
         4 YES         30 INACTIVE
         5 YES         27 INACTIVE   <------衆日誌組中sequence#號最小
         6 YES         31 INACTIVE
 
6 rows selected.
 
SQL> alter system switch logfile ;
 
System altered.
 
SQL> select group#,archived,sequence#,status from v$log;
 
    GROUP# ARC SEQUENCE# STATUS
---------- --- ---------- ----------------
         1 YES         32 ACTIVE
         2 YES         28 INACTIVE
         3 YES         29 INACTIVE
         4 YES         30 INACTIVE
         5 NO         33 CURRENT
         6 YES         31 INACTIVE
 
6 rows selected.
 
快速轉換oracle日誌組狀態active爲inactive
 
日誌組切換後,上一個當前日誌組狀態由current變成active,實際上是由於當前數據文件頭部的scn值還位於狀態爲active日誌組的low scn 和next scn 內,所以我們此刻如果立即發起alter sytem checkpoint 命令推進數據文件頭部scn  變可使日誌狀態由active 變爲inactive。
SQL> select group#,archived,sequence#,status from v$log;
 
    GROUP# ARC SEQUENCE# STATUS
---------- --- ---------- ----------------
         1 YES         32 INACTIVE
         2 YES         34 INACTIVE
         3 YES         35 INACTIVE
         4 NO          36 CURRENT
         5 YES         33 INACTIVE
         6 YES         31 INACTIVE
 
 
SQL> alter system switch logfile;
 
System altered.
 
SQL> select group#,archived,sequence#,status from v$log;
 
    GROUP# ARC SEQUENCE# STATUS
---------- --- ---------- ----------------
         1 YES         32 INACTIVE
         2 YES         34 INACTIVE
         3 YES         35 INACTIVE
         4 YES         36 ACTIVE     <------sequence號爲36的日誌爲active
         5 YES         33 INACTIVE
         6 NO          37 CURRENT
 
6 rows selected.
 
查詢數據文件頭部scn情況如下:
SQL> select hxfil,fhscn from x$kcvfh;
 
     HXFIL FHSCN
---------- ----------------
         1 2781239221
         2 2781239221
         3 2781239221
         4 2781239221
         5 2781239221
         6 2781239221
         7 2781239221
         8 2781239221
        11 2781239221
        12 2781239221
        13 2781239221
 
SQL> select sequence#,first_change#,next_change# from v$log_history;
SEQUENCE# FIRST_CHANGE# NEXT_CHANGE#
---------- ------------- ------------
        32    2781218249   2781218300
        33    2781218300   2781219174
        34    2781219174   2781219184
        35    2781219184   2781239220
        36    2781239220   2781239424
數據文件頭部的scn:2781239221 處於sequence號爲36的日誌scn範圍 內 2781239220   2781239424
 
SQL> alter system checkpoint;
 
System altered.
 
 
SQL> select hxfil,fhscn from x$kcvfh;
 
     HXFIL FHSCN
---------- ----------------
         1 2781239456
         2 2781239456
         3 2781239456
         4 2781239456
         5 2781239456
         6 2781239456
         7 2781239456
         8 2781239456
        11 2781239456
        12 2781239456
        13 2781239456
 
11 rows selected.
 
 
SQL> select group#,archived,sequence#,status from v$log;
 
    GROUP# ARC SEQUENCE# STATUS
---------- --- ---------- ----------------
         1 YES         32 INACTIVE
         2 YES         34 INACTIVE
         3 YES         35 INACTIVE
         4 YES         36 INACTIVE 
         5 YES         33 INACTIVE
         6 NO          37 CURRENT
 
clear 日誌組的執行條件
 
clear的日誌組狀態不能是acitve 或者當前日誌組
eg
SQL> select group#,archived,sequence#,status from v$log;
 
    GROUP# ARC SEQUENCE# STATUS
---------- --- ---------- ----------------
         1 NO          38 CURRENT
         2 YES         34 INACTIVE
         3 YES         35 INACTIVE
         4 YES         36 INACTIVE
         5 YES         33 INACTIVE
         6 YES         37 ACTIVE
 
SQL> alter database clear logfile group 6;
alter database clear logfile group 6
*
ERROR at line 1:
ORA-01624: log 6 needed for crash recovery of instance CRM (thread 1)
ORA-00312: online log 6 thread 1: '/oracle/CRM2/CRM/redo06.log'
ORA-00312: online log 6 thread 1: '/oracle/CRM2/CRM/redo06b.log'
 
 
二  數據庫一直open當前聯機日誌組內成員全部損壞
 
此種情況最終就是日誌不能切換,影響到數據庫的應用時我們纔可能發現。如下所示日誌狀態:
 
1 數據庫日誌狀態如下:
SQL> select group#,archived,sequence#,status from v$log;
 
    GROUP# ARC SEQUENCE# STATUS
---------- --- ---------- ----------------
         1 NO          44 INACTIVE
         2 NO          40 INACTIVE
         3 NO          41 INACTIVE
         4 NO          42 INACTIVE
         5 NO          45 CURRENT
         6 NO          43 INACTIVE
 
6 rows selected.
 
2 使用alter database clear unarchived logfile group n 命令處理sequence#號爲最小的一組日誌,等待片刻,讓所有未歸檔的日誌歸檔完成,(當告警日誌中出現如下字樣Archiver process freed from errors. No longer stopped)之後查詢日誌狀態如下:
 
SQL> alter database clear unarchived logfile group 2;
 
Database altered.
 
select group#,archived,sequence#,status from v$log
 
    GROUP# ARC SEQUENCE# STATUS
---------- --- ---------- ----------------
         1 YES         44 INACTIVE
         2 YES          0 UNUSED
         3 YES        41 INACTIVE
         4 YES        42 INACTIVE
         5 NO         45 CURRENT
         6 YES         43 INACTIVE
 
注意雖然現在的日誌歸檔狀態已經正常,但初始化後的日誌組2內的日誌文件可能並未生效。我們再數次切換下日誌,告警文件便會產生如下報錯:
ORA-00314: log 2 of thread 1, expected sequence# 46 doesn't match 0
ORA-00312: online log 2 thread 1: '/oracle/CRM2/CRM/redo02b.log'
ORA-00314: log 2 of thread 1, expected sequence# 46 doesn't match 0
ORA-00312: online log 2 thread 1: '/oracle/app/db1/dbs/log2CRM.dbf'
 
而此刻的日誌歸檔狀態如下:
SQL> select group#,archived,sequence#,status from v$log;
 
    GROUP# ARC SEQUENCE# STATUS
---------- --- ---------- ----------------
         1 NO          50 INACTIVE
         2 NO          46 INACTIVE
         3 NO          47 INACTIVE
         4 NO          48 INACTIVE
         5 NO          51 CURRENT
         6 NO          49 INACTIVE
 
6 rows selected.
 
總結:以上測試爲10g環境,若使用alter database clear unarchived logfile group n 初始化了之前的當前日誌後,爲了避免上面的問題。我們可以通過重啓數據庫,或者重建該日誌組。11g測試沒發現此類問題。
 
 
 
數據庫啓動時報當前聯機日誌文件丟失
 
1
SQL> startup
ORACLE instance started.
 
Total System Global Area 322961408 bytes
Fixed Size                  2020480 bytes
Variable Size              92277632 bytes
Database Buffers          222298112 bytes
Redo Buffers                6365184 bytes
Database mounted.
ORA-00313: open failed for members of log group 2 of thread 1
ORA-00312: online log 2 thread 1: '/oracle/app/db1/dbs/log2CRM.dbf'
ORA-00312: online log 2 thread 1: '/oracle/CRM2/CRM/redo02b.log'
 
 
SQL> select group#,archived,sequence#,status from v$log;
 
    GROUP# ARC SEQUENCE# STATUS
---------- --- ---------- ----------------
         1 YES         50 INACTIVE
         2 NO          52 CURRENT
         6 YES         49 INACTIVE
         4 YES         48 INACTIVE
         5 YES         51 INACTIVE
         3 YES         47 INACTIVE
 
6 rows selected.
 
注意,由於是當前日誌組,所以不能用alter database clear unarchived logfile group 2 對該日誌組進行初始化。不過我們可以執行基於取消的恢復如下所示:
SQL> alter database clear unarchived logfile group 2;
alter database clear unarchived logfile group 2
*
ERROR at line 1:
ORA-00313: open failed for members of log group 2 of thread 1
ORA-00312: online log 2 thread 1: '/oracle/CRM2/CRM/redo02b.log'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
ORA-00312: online log 2 thread 1: '/oracle/app/db1/dbs/log2CRM.dbf'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
 
2 執行基於取消的恢復
 
SQL> recover database until cancel;
Media recovery complete.
 
 
SQL> alter database open resetlogs;
 
Database altered.
 
 
總結:
1  對於當前日誌組所有成員損壞的情況,按上面方式處理即可。不過仍需注意的是,初始化日誌組後,會丟失該日誌組對應的歸檔,造成歸檔不連續,應該做一次全庫備份。
 
2  對於當前日誌組成員的損壞,切換當前日誌後,drop掉損壞的日誌成員然後再添加新的成員。
 
3 對於非當前的日誌組成員損壞,直接drop掉損壞的日誌成員,然後添加新的日誌成員。
 
4  對於非當前日誌組損壞的情況,可以直接用alter database clear unarchived logfile group n 或者alter database clear logfile group n 進行初始化處理。
 
 
 
 
 
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章