Current online Redo 和 Undo 損壞的處理方法
Oracle 不同故障的恢復方案
http://space.itpub.net/15880878/viewspace-720082
Oracle undo 表空間管理
http://space.itpub.net/15880878/viewspace-720053
上面的2篇Blog 講到了Oracle 一些故障下的恢復方法,但是還有2點,之前沒有做詳述。即current online redo 損壞的情況和undo的損壞情況。 之所以把他們放一起講,是因為他們之間有聯絡。
在做操作之前,最好把控制檔案,redo log 和資料檔案做一個冷備份,以防萬一.
一. UNDO 的補充資訊
所以這裡補充說明一下。 在補充之前先講一下undo segment的概念。
在blog:Oracle 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的查詢結果,我們可以看出,有10個undo segment來存放undo records。
以上我們是通過dba_segment 表檢視的結果。 也可以通過v$rollstat和v$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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Undo和Current Online Redo損壞的處理方法
- 【Oracle】Current online Redo 和 Undo 損壞的處理方法Oracle
- Online Redo Log損壞處理實驗(上)
- Online Redo Log損壞處理實驗(中)
- Online Redo Log損壞處理實驗(下)
- oracle - redo 損壞或刪除處理方法Oracle
- oracle redo各種狀態(inactive、active、current)損壞的處理方式Oracle Redo
- UNDO表空間損壞的處理
- undo表空間損壞的處理過程
- 沒有備份的情況下處理undo損壞
- Oracle REDO損壞Oracle Redo
- 處理塊損壞
- Oracle 無備份情況下undo檔案損壞處理Oracle
- Redo Log File(inactive、active)損壞,處理恢復對策
- 遇到了 客戶生產庫 current online logfile 損壞
- 段頭損壞的處理
- undo 檔案損壞
- redo日誌損壞
- ORACLE-00600 4194 斷電undo損壞處理過程Oracle
- 第7章 處理塊損壞
- oracle10g rac 表決盤損壞、ocr損壞處理Oracle
- 回滾段表空間損壞處理(ORA-01552)處理方法
- redo和undo的區別
- SQL Server 2005日誌檔案損壞的處理方法SQLServer
- undo檔案丟失或損壞
- RAC磁碟頭損壞問題處理
- (轉)oracle redolog損壞的處理辦法Oracle Redo
- Redo 和 Undo 概念解析
- Oracle聯機日誌檔案丟失或損壞的處理方法Oracle
- windows10應用商店損壞怎麼修復_win10應用商店損壞處理方法WindowsWin10
- ORACLE資料庫壞塊的處理 (處理無物件壞快的方法)Oracle資料庫物件
- Oracle資料庫UNDO損壞後的恢復Oracle資料庫
- UNDO 表空間檔案損壞的恢復
- REDO檔案丟失或者損壞的恢復
- sysaux表空間檔案損壞的處理(zt)UX
- Oracle的redo 和undo的區別Oracle
- ORACLE聯機日誌檔案丟失或損壞的處理方法(轉)Oracle
- oracle 11gr2 針對ocr/vote asm diskgroup損壞的處理方法OracleASM