如何恢復日誌文件

爲了防止數據庫日誌文件本身的故障或丟失,Oracle強烈建議使用鏡像日誌(mirrored redo log),如果LGWR跟蹤文件或者ALERT文件中的消息表LGWR,經常不得不因爲檢查點尚未完成或者組尚未歸檔而等待,就需要添加組。

添加聯機重做日誌組

語法:
ALTER DATABASE [database]
ADD LOGFILE [GROUP integer] filespec
[, [GROUP integer] filespec]...]
可以通過文件說明來指定成員名稱和位置可以選擇每個重做日誌文件組GROUP 參數值。如果省略了該參數,Oracle服務器將自動生成其值。

添加重做日誌成員

使用下面的ALTER DATABASE ADD LOGFILE MEMBER 命令向現有的重做日誌文件組添加新成員
ALTER DATABASE [database]
ADD LOGFILE MEMBER
[ 'filename' [REUSE]
[, 'filename' [REUSE]]...
TO {GROUP integer
|('filename'[, 'filename']...)
}
]

重新定位或者重命名聯機重做日誌文件

語法:
ALTER DATABASE [database]
RENAME FILE 'filename'[, 'filename']...
tO 'filename'[, 'filename']...
注意:
這個命令僅僅是修改了控制文件中的日誌文件的信息,並沒有真實的移動日誌文件的位置,所以需要手工用操作系統命令移動日誌文件的位置。

刪除不要的日誌文件組

語法:
ALTER DATABASE [database]
DROP LOGFILE
{GROUP integer|('filename'[, 'filename']...)}
[,{GROUP integer|('filename'[, 'filename']...)}]...
注意:
一個例程至少需要兩組聯機重做日誌文件;
無法刪除活動組或者當前組;
如果數據庫運行在ARCHIVELOG 模式下並且未將日誌文件組歸檔那麼無法刪除該組;
在刪除聯機重做日誌組時並沒有刪除操作系統文件,所以需要手工用操作系統命令刪除日誌文件。

刪除日誌文件

當一個聯機重做日誌成員狀態爲INVALID的時候,如果想丟棄一個或者多個聯機日誌成員,使用命令:
ALTER DATABASE [database]
DROP LOGFILE MEMBER 'filename'[, 'filename']...
注意:
不能刪除組內的最後一個有效成員
不能刪除當前組,所以在刪除該成員之前必須強制日誌文件切換
如果數據庫正運行在ARCHIVELOG 模式下並且未將該成員所屬日誌文件組歸檔否則無法刪除該成員
在刪除聯機重做日誌成員時並未刪除操作系統文件,所以還需要手工用操作系統命令完成實際的刪除文件的工作

清除聯機日誌組

如果一個聯機日誌文件組的所有成員都已破壞,可以通過重新初始化這些日誌文件來解決問題。
語法:
ALTER DATABASE [database]
CLEAR [UNARCHIVED] LOGFILE
{GROUP integer|('filename'[, 'filename']...)}
[,{GROUP integer|('filename'[, 'filename']...)}]...
注意:
無論聯機重做日誌文件是否歸檔,都可以清除它。但是,在其沒有歸檔時,您必須包含關鍵字UNARCHIVED。如果恢復需要該聯機重做日誌文件,這將使得備份不可用。

查詢v$log獲得聯機
重做日誌文件組的信息

下面的項是v$log視圖中STATUS 列的常見值:
UNUSED  表明從未對聯機重做日誌組進行寫入,這是剛添加的聯機重做日誌文件的狀態。
CURRENT  表明當前的聯機重做日誌組,這意味着該聯機重做日誌組是活動的。
ACTIVE  表明聯機重做日誌組是活動的,但是並非當前聯機重做日誌組,崩潰恢復需要該狀態它可能正用於塊恢復,它可能歸檔也可能不歸檔。
CLEARING  表明在ALTER DATABASE CLEAR LOGFILE 命令後正在將該日誌重建爲一個空日誌,日誌清除後其狀態更改爲UNUSED。
CLEARING_CURRENT  表明正在清除當前日誌文件中的已關閉線程,如果切換時發生某些故障,如寫入新日誌標題時的I/O錯誤,則該日誌可以停留在該狀態。
INACTIVE  表明例程恢復不再需要聯機重做日誌組,它可能歸檔也可能不歸檔。

查詢V$LOGFILE獲取日誌成員信息

下面的項是v$logfile 視圖中STATUS 列的常見值:
INVALID  表明該文件不可訪問。
STALE  表明該文件內容不完全,例如正在添加一個日誌文件成員。
DELETED  表明該文件已不再使用。
空白表明文件正在使用中。

常見故障處理

如果LGWR 至少能夠訪問一個組內成員,對組內可訪問成員的寫入將照常進行,LGWR 忽略組內的不可用成員。如果該組不活動,即檢查點已完成,那麼丟棄和添加一個新的聯機日誌成員就可以解決問題,否則如果該組是當前活動的日誌組,則必須首先強制日誌切換。
SQL> SELECT group#, sequence#, bytes, members, status
  2  FROM V$LOG;
    GROUP#  SEQUENCE#      BYTES    MEMBERS STATUS
----------------------------------
         1        411    1048576          2 INACTIVE
         2        412    1048576          2 INACTIVE
         3        413    1048576          2 INACTIVE
         5        414    1048576          2 CURRENT
SQL> select * from  v$logfile;
    GROUP# STATUS  MEMBER
----------------------------------
。。。。。。(其他日誌文件)。。。。。。。。。       
         5 INVALID E:/ORACLE1/ORA81/ORADATA/TEST/REDO07.LOG
         5         E:/ORACLE1/ORA81/ORADATA/TEST/REDO08.LOG
8 rows selected
SQL>
但是這時候數據還可以忽略這個損壞的文件而正常使用。要修復這個文件,我們需要做:
SQL> shutdown
SQL> host
E:/>COPY E:/ORACLE1/ORA81/ORADATA/TEST/REDO08.LOG E:/ORACLE1/ORA81/ORADATA/TEST/
REDO07.LOG
改寫 E:/ORACLE1/ORA81/ORADATA/TEST/REDO07.LOG 嗎? (Yes/No/All): YES
已複製 1 個文件。
上面這一步需要注意的是,如果新的日誌文件的位置或文件名稱需要改變(如,介質失效),則在數據庫加載(Startup Mount)後需要對這個改變位置或名稱的日誌文件重命名,然後再打開數據,具體過程參見“重新定位或者重命名聯機重做日誌文件”。
E:/>exit
SQL> select * from  v$logfile;
    GROUP# STATUS  MEMBER
----------------------------------
。。。。。。(其他日誌文件)。。。。。。。。。
         5 UNKNOWN E:/ORACLE1/ORA81/ORADATA/TEST/REDO07.LOG
         5 STALE   E:/ORACLE1/ORA81/ORADATA/TEST/REDO08.LOG
8 rows selected
我們看到該日誌文件的狀態爲UNKNOWN;表示是剛添加的聯機重做日誌文件的狀態。等到數據庫在使用完該文件或者手工用命令:alter system switch logfile強制數據庫發生log switch以後,文件的狀態就會顯示爲空白,即,正常狀態。
注意:在恢復了數據庫以後,立刻完全關閉數據(Normal),進行一個冷備份。
上面關於日誌文件損壞和修復的相關部分會被記錄在Alert.log文件中。
如果在日誌切換時LGWR 無法訪問下一個組的所有成員或者損壞的日誌文件時該組中日誌成員,則該實例關閉。如果組不活動,那麼丟棄和添加一個新的日誌組就可解決問題;如果活動,數據庫可能需要從聯機重做日誌文件殘留物進行介質恢復。
爲了模擬日誌組中有一個成員損壞的情況,我們打開文本編輯器,並且破壞E:/ORACLE1/ORA81/ORADATA/TEST/ REDO07.LOG文件,然後,我們看到:
SQL> ALTER SYSTEM SWITCH LOGFILE;
ALTER SYSTEM SWITCH LOGFILE
ORA-00313: 無法打開日誌組  (線程 ) 的成員
SQL> STARTUP MOUNT
SQL> ALTER DATABASE
2  DROP LOGFILE GROUP 5;
數據庫已更改。
SQL> ALTER DATABASE OPEN;
數據庫已更改。
現在一切正常了,則完全關閉數據(Normal),進行一個冷備份。
上面關於日誌文件損壞和修復的相關部分會被記錄在Alert.log文件中。
在歸檔模式下,我們需要用alter database clear logfile group來恢復數據庫:
現在GROUP 4中只有一個MEMBER,並且不是CURRENT,我們損壞這個GROUP(F:/ORACLE1/ORA81/ORADATA/TEST/REDO07.LOG),然後,當SWITCH到這個損壞的組以後,數據庫會HANG,或者嚴重的話會CRASH,這時候我們可能收到下面的錯誤:
SQL> ALTER DATABASE CLEAR LOGFILE
  2  'F:/oracle1/ora81/oradata/test/REDO07.LOG';
ALTER DATABASE CLEAR LOGFILE
*
ERROR 位於第 1 行:
ORA-12571: TNS:packet writer failure
SQL> conn intenral@test
請輸入口令:
ERROR:
ORA-01092: ORACLE instance terminated. Disconnection forced
SQL>
這時候,我們可以退出SQLPLUS,然後重新進來:
SQL> exit
E:/>sqlplus internal
進來後,shutdown abort數據庫,然後,再startup mount:
SQL> shutdown abort
SQL> startup mount
可以看到,數據庫沒有CRASH。現在我們CLEAR GROUP4,先用alter database clear logfile group 4;(如果不行就用alter database clear unarchived logfile group 4;):
SQL> alter database clear logfile group 4;
數據庫已更改。
SQL> alter database open;
數據庫已更改。
SQL>
好了,數據庫已經恢復了
如果正在寫入當前組的所有成員時,LGWR 突然無法訪問這些成員,則該數據庫例程關閉,在這種情況下,數據庫可能需要從聯機日誌文件殘留物進行介質恢復。
確定GROUP4是CURRENT,現在毀壞GROUP4。當你發現這個錯誤:
SQL> alter database open;
alter database open
*
ERROR 位於第 1 行:
ORA-00313: ??????? 4 (?? 1) ???
ORA-00312: ???? 4 ?? 1: 'F:/ORACLE1/ORA81/ORADATA/TEST/REDO07.LOG'
SQL>
那麼,然後SHUTDOWN,並且MOUNT數據庫:
SQL> shutdown
ORA-01109: ??????
已經卸載數據庫。
ORACLE 例程已經關閉。
SQL> startup mount
恢復數據庫:
SQL>  recover database until cancel;
完成介質恢復。
SQL> alter database open resetlogs;
數據庫已更改。
以前的ARCHIVE 已經不可用了,需要SHUTDOW,然後作一個FULL BACKUP,之後,再重新STARTUP數據庫,就可以了.

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