Current online Redo 和 Undo 損壞的處理方法

roominess發表於2012-03-31

Oracle 不同故障的恢復方案

http://space.itpub.net/15880878/viewspace-720082

 

Oracle undo 表空間管理

http://space.itpub.net/15880878/viewspace-720053

 

 

       上面的2Blog 講到了Oracle 一些故障下的恢復方法,但是還有2點,之前沒有做詳述。即current online redo 損壞的情況和undo的損壞情況。 之所以把他們放一起講,是因為他們之間有聯絡。

       在做操作之前,最好把控制檔案,redo log 和資料檔案做一個冷備份,以防萬一.


 

.  UNDO 的補充資訊

所以這裡補充說明一下。 在補充之前先講一下undo segment的概念。

 

       blogOracle undo 管理

       http://space.itpub.net/15880878/viewspace-720053

 

中提到了Oracle undo 有兩種管理方式,通過引數undo_management來設定auto  manual

 

1.1 undo_management被設定成MENUAL時使用系統回滾段即將undo records 記錄到SYSTEM 表空間下的SYSTEM段。

 

SQL> col segment_name format a10

SQL> select segment_name,tablespace_name,bytes,next_extent  from dba_segments where segment_type='ROLLBACK';

 

SEGMENT_NA TABLESPACE_NAME       BYTES NEXT_EXTENT

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

SYSTEM     SYSTEM                 393216     1048576

 

       通過上面的這條語句,我們查到了這個用於rollback system segment 存在與system 表空間。 預設情況下,只有一個segment,並且它還比較小,所以,如果使用system 段來儲存undo records。肯定會影響資料庫的效能。 所以Oracle 是建議使用Undo tablespace 來管理undo records

 

1.2  undo_management設定成AUTO時使用UNDO tablespace來管理回滾段。 這個時候,我們將有多個undo segment,並且這些segment 是存放在UNDO 表空間裡的。 這樣對DB的效能就會提高。

 

SQL> select segment_name,tablespace_name,bytes,next_extent  from dba_segments where segment_type='TYPE2 UNDO';

 

SEGMENT_NAME    TABLESPACE_NAME    BYTES NEXT_EXTENT

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

_SYSSMU1$            UNDOTBS1                1179648       65536

_SYSSMU2$            UNDOTBS1                1179648       65536

_SYSSMU3$            UNDOTBS1                2228224       65536

_SYSSMU4$            UNDOTBS1                1179648       65536

_SYSSMU5$            UNDOTBS1                 262144       65536

_SYSSMU6$            UNDOTBS1                1179648       65536

_SYSSMU7$            UNDOTBS1                1179648       65536

_SYSSMU8$            UNDOTBS1                1179648       65536

_SYSSMU9$            UNDOTBS1                1179648       65536

_SYSSMU10$           UNDOTBS1                1179648       65536

 

通過以上SQL的查詢結果,我們可以看出,有10undo segment來存放undo records

 

       以上我們是通過dba_segment 表檢視的結果。 也可以通過v$rollstatv$rollname 兩個檢視來檢視資訊。 2個檢視會顯示所有rollback 段的資訊。 包括system段和undo段。

 

SQL> col name format a15

SQL> select s.usn,n.name,s.extents,s.hwmsize,s.status from v$rollstat s, v$rollname n where s.usn=n.usn;

 

       USN NAME               EXTENTS    HWMSIZE STATUS

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

         0 SYSTEM                   6     385024 ONLINE

         1 _SYSSMU1$                3    7659520 ONLINE

         2 _SYSSMU2$                3    9691136 ONLINE

         3 _SYSSMU3$                4    7462912 ONLINE

         4 _SYSSMU4$                3   76668928 ONLINE

         5 _SYSSMU5$                4    8511488 ONLINE

         6 _SYSSMU6$                3    7462912 ONLINE

         7 _SYSSMU7$                3   33480704 ONLINE

         8 _SYSSMU8$                3    8577024 ONLINE

         9 _SYSSMU9$                3    7462912 ONLINE

        10 _SYSSMU10$               3   13754368 ONLINE

 

11 rows selected.

 

.  UNDO 損壞的情況

 

       瞭解了第一部分的補充知識後,我們在來看一下undo 損壞的情況。 出現這種情況,大多數是因為異常當機,在啟動的時候報的錯誤。DB 不能啟動。

      

       比如:ORA-00600: internal error code, arguments: [4194],  

 

       對於Undo 損壞的情況,能用備份恢復最好,如果不能,就只能通過一些特殊的方法來恢復。

 

2.1 方法一,使用system segment

Blog

       Oracle undo 表空間管理

       http://blog.csdn.net/tianlesoftware/archive/2010/07/11/5689558.aspx

 

提到了一種方法,就是使用SYSTEM 的回滾段步驟如下:

 

1)用spfile 建立pfile,然後修改引數:

#*.undo_tablespace='UNDOTBS1'

#*.undo_management='AUTO'

#*.undo_tablespace

#*.undo_retention

undo_management='MANUAL'

rollback_segments='SYSTEM'

 

2)用修改之後的pfile,重啟DB

SQL> STARTUP MOUNT pfile='F:/initorcl.ora' ;

 

3)刪除原來的表空間,建立新的UNDO 表空間

SQL> drop tablespace undotbs;

SQL> create undo tablespace undotbs1 datafile '/u01/oradata/undotbs1.dbf' size 10M;

 

4)關閉資料庫,修改pfile引數,然後用新的pfile建立spfile,在正常啟動資料庫。

*.undo_tablespace='UNDOTBS1'

*.undo_management='AUTO'

#undo_management='MANUAL'

#rollback_segments='SYSTEM'

 

 

2.2. 方法二:跳過損壞的segment

       在方法一里面,我們使用了system segment。 通過第一部分我們瞭解到,undo segment 有多個,我們可以通過alert log 來檢視正在使用的是哪些segment,這些段有可能損壞了。 我們只需要把這些損壞的segment 跳過,先正常啟動DB,在建立新的UNDO 表空間,在切換一下。

 

1)修改pfile,新增引數:

*._corrupted_rollback_segments='_SYSSMU11$','_SYSSMU12$','_SYSSMU13$'

 

這些欄位的值,我們通過alert log 檢視。 也可以通過如下命令檢視:

#strings system01.dbf | grep _SYSSMU | cut -d $ -f 1 | sort -u

 

2)用修改之後的pfile啟動DB

       因為跳過了哪些損壞的segment,所以DB 可以正常啟動。

 

3)建立新的UNDO 表空間,並切換過來

 

SQL> create undo tablespace undotbs1 datafile '/u01/oradata/undotbs1.dbf' size 10M;

SQL> alter system set undo_tablespace=undotbs1;

SQL> drop tablespace undotbs;

 

4)修改pfile,建立spfile,並正常啟動

刪除:

*._corrupted_rollback_segments='_SYSSMU11$','_SYSSMU12$','_SYSSMU13$'

 

 

以上就是UNDO 出現故障的2種處理方法。

 

 

.  Current online Redo 損毀的處理

       其實在之前的不同故障處理的那篇blog裡已經提到了這點。 但這種情況是一種特殊的情況。 所以還是單獨拿出來說明一下。

 

current online log 損壞有兩種恢復方法:

1)如果有歸檔和備份,可以用不完全恢復。

SQL>startup mount;

SQL>recover database until cancel; 先選擇auto,儘量恢復可以利用的歸檔日誌,然後重新執行:

SQL>recover database until cancel; 這次輸入cancel,完成不完全恢復,

resetlogs開啟資料:

SQL>alter database open resetlogs; 開啟資料庫

 

2)強制恢復, 這種方法可能會導致資料不一致

sql>startup mount;

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

sql>recover database until cancel;

sql>alter database open resetlogs;

 

這裡主要看2點:

1)使用了_allow_resetlogs_corruption 引數

2)這種情況下,可能會報ORA-600[2662]SCN有關)和 ORA-600[4000](回滾段有關)的錯誤。

 

       使用_allow_resetlogs_corruption引數,強制的開啟資料庫,可能會導致邏輯的壞塊,從而影響資料字典。 所以,即使使用該引數正常開啟後,也需要做的一個操作:邏輯匯出資料。 重建例項,匯入例項。 消除邏輯壞塊的可能性。

 

       如果使用_allow_resetlogs_corruption引數啟動報了undo segment的錯誤而無法啟動,處理方法參考第二節中undo 的處理情況。 只要DB 能正常open,就匯出資料,重建例項,在匯入。

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

相關文章