Oracle當前聯機日誌組損壞的處理
一oracle 日誌的特性總結
1 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.
2 快速轉換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
3 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.
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 進行初始化處理。