ORA-16038錯誤--當前REDO不能歸檔解決-轉載整理

還不算暈發表於2013-10-24

說明一:歸檔模式下當前日誌的損壞有兩種情況:

一、是資料庫是正常關閉,日誌檔案中沒有未決的事務需要例項恢復,當前日誌組的損壞就可以直接用alter database clear unarchived logfile group n來重建。
二、是日誌組中有活動的事務,資料庫需要介質恢復,日誌組需要用來同步,有兩種補救辦法
A. 最好的辦法就是通過不完全恢復,可以保證資料庫的一致性,但是這種辦法要求在歸檔方式下,並且有可用的備份
B. 通過強制性恢復即基於cancel,但是可能導致資料庫不一致。
基於CANCEL的不一致恢復如下:
可以採用獲取最近的SCN的辦法用until scn恢復或用until cancel恢復
recover database until cancel 或者SCN號,
先選擇auto,儘量恢復可以利用的歸檔日誌,然後重新
recover database until cancel
這次輸入cancel,完成不完全恢復,也就是說恢復兩次。類似如下:
SQL> recover database until cancel;
Auto
……
SQL> recover database until cancel;
Cancel;

說明二:非當前日誌損壞

1)、如果損壞的是非當前的聯機日誌檔案,一般只需要clear就可以重建該日誌檔案,但是如果該資料庫處於歸檔狀態但該日誌還沒有歸檔,就需要強行clear。
2)、建議clear,特別是強行clear後作一次資料庫的全備份。
3)、此方法適用於歸檔與非歸檔資料庫。

3.測試資料庫-歸檔模式示例如下:

在startup時報如下錯誤:

SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-16038: log 1 sequence# 56 cannot bearchived
ORA-19809: limit exceeded for recovery files
ORA-00312: online log 1 thread 1:'/u02/oradata/orcl/redo01.log'

從v$log中找到當前日誌狀態,可知當前日誌組是3,而group 1還未歸檔;

SQL> select group#,sequence#,archived,status fromv$log;
    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
        1         56 NO INACTIVE
        3         58 NO CURRENT
        2         57 NO INACTIVE
用alter database clear logfile命令嘗試重構logfile group1,失敗;
SQL> alter database clear logfile group 1;
alter database clear logfile group 1
*
ERROR at line 1:
ORA-00350: log 1 of instance orcl (thread 1) needsto be archived
ORA-00312: online log 1 thread 1:'/u02/oradata/orcl/redo01.log'

失敗的原因是group 1還沒有歸檔,需要加上”unarchived”引數;
SQL> alter database clear unarchived logfilegroup 1;
Database altered.
成功後可以正常open了;
SQL> alter database open;

Database altered.

相關文章