沒有備份的情況下處理undo損壞
如果遇到undo損壞,當然最好的方法是完全恢復,不過如果沒有備份,可以採用一種非常規的手段(利用Oracle的隱藏引數),如果此時undo包含未提交的事務,會造成一點點的資料丟失(一般都是可忍受的),如果沒有未提交的事務,則不會有資料丟失。其主要步驟有:
1. 修改undo表空間管理為手動;
2. 設定隱藏引數(_offline_rollback_segments或_corrupted_rollback_segments)標識受影響的回滾段,使Oracle忽略其上的未提交事務;
3. 手動刪除受影響的回滾段和undo表空間,然後重建新的undo表空間;
4. 還原undo表空間管理為自動。
實驗如下:
Step 1.
如果undo資料檔案損壞,資料庫只能到mount狀態,open時會出現以下錯誤:
ORA-01157: cannot identify/lock data file 14 - see DBWR trace file
ORA-01110: data file 14: 'I:\INTEL_DATA\O06DMS0\UNDO1.O06DMS0'
說明該undo檔案已經損壞或丟失,把該檔案offline之後就可以開啟資料庫了:
SQL> alter database datafile 'I:\INTEL_DATA\O06DMS0\UNDO1.O06DMS0' offline drop;
SQL> alter database open;
開啟資料庫的目的是為了找出受影響的回滾段:
SQL> select segment_name,status from dba_rollback_segs;
SEGMENT_NAME STATUS
------------------------------ ----------------
SYSTEM ONLINE
_SYSSMU10_1201331463$ OFFLINE
_SYSSMU9_2926456744$ OFFLINE
_SYSSMU8_640224757$ OFFLINE
_SYSSMU7_3984293596$ OFFLINE
_SYSSMU6_3694658906$ OFFLINE
_SYSSMU5_3475919656$ OFFLINE
_SYSSMU4_168502732$ OFFLINE
_SYSSMU3_1987193959$ OFFLINE
_SYSSMU2_3908286755$ OFFLINE
_SYSSMU1_3281912951$ OFFLINE
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- -------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string undo1
關閉資料庫:
SQL> shutdown immediate;
Step 2.
建立一個臨時的pfile:
SQL> create pfile='H:\initO06DMS0.ora' from spfile;
修改pfile如下:
*.undo_management='manual' -- undo表空間管理方式修改為手動
*.undo_tablespace='undo2' --指定一個新的undo表空間
*._offline_rollback_segments=('_SYSSMU10_1201331463$','_SYSSMU9_2926456744$','_SYSSMU8_640224757$','_SYSSMU7_3984293596$','_SYSSMU6_3694658906$','_SYSSMU5_3475919656$','_SYSSMU4_168502732$','_SYSSMU3_1987193959$','_SYSSMU2_3908286755$','_SYSSMU1_3281912951$') --把所有受影響的回滾段都列在這裡
並以改pfile重新啟動資料庫:
SQL> startup pfile='H:\initO06DMS0.ora'
Step 3.
手動刪除受影響的回滾段:
SQL>drop rollback segment "_SYSSMU10_1201331463$";
SQL>drop rollback segment "_SYSSMU9_2926456744$";
SQL>drop rollback segment "_SYSSMU8_640224757$";
SQL>drop rollback segment "_SYSSMU7_3984293596$";
SQL>drop rollback segment "_SYSSMU6_3694658906$";
SQL>drop rollback segment "_SYSSMU5_3475919656$";
SQL>drop rollback segment "_SYSSMU4_168502732$";
SQL>drop rollback segment "_SYSSMU3_1987193959$";
SQL>drop rollback segment "_SYSSMU2_3908286755$";
SQL>drop rollback segment "_SYSSMU1_3281912951$";
手動刪除舊的undo表空間:
SQL> drop tablespace undo1 including contents;
重建新的undo表空間:
SQL> create undo tablespace undo2 datafile 'I:\INTEL_DATA\O06DMS0\UNDO2.O06DMS0' size 100m;
建立新的spfile,覆蓋舊的spfile:
SQL> create spfile from pfile='H:\initO06DMS0.ora';
關閉資料庫:
SQL> shutdown immediate;
Step 4.
以原來的spfile啟動資料庫:
SQL> startup;
還原undo表空間管理為自動:
SQL> alter system set undo_management='auto' scope=spfile;
取消隱藏引數的設定:
SQL> alter system reset "_offline_rollback_segments" scope=spfile;
重啟使其生效:
SQL> shutdown immediate;
SQL> startup
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- -------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string undo2
最終檢查一下:
SQL> select segment_name,status from dba_rollback_segs;
SEGMENT_NAME STATUS
------------------------------ ----------------
SYSTEM ONLINE
_SYSSMU40_1968985325$ ONLINE
_SYSSMU39_4040503138$ ONLINE
_SYSSMU38_4059847715$ ONLINE
_SYSSMU37_2692202156$ ONLINE
_SYSSMU36_2617425201$ ONLINE
_SYSSMU35_1133967719$ ONLINE
_SYSSMU34_1916939664$ ONLINE
_SYSSMU33_99444166$ ONLINE
_SYSSMU32_162619813$ ONLINE
_SYSSMU31_830375278$ ONLINE
1. 修改undo表空間管理為手動;
2. 設定隱藏引數(_offline_rollback_segments或_corrupted_rollback_segments)標識受影響的回滾段,使Oracle忽略其上的未提交事務;
3. 手動刪除受影響的回滾段和undo表空間,然後重建新的undo表空間;
4. 還原undo表空間管理為自動。
實驗如下:
Step 1.
如果undo資料檔案損壞,資料庫只能到mount狀態,open時會出現以下錯誤:
ORA-01157: cannot identify/lock data file 14 - see DBWR trace file
ORA-01110: data file 14: 'I:\INTEL_DATA\O06DMS0\UNDO1.O06DMS0'
說明該undo檔案已經損壞或丟失,把該檔案offline之後就可以開啟資料庫了:
SQL> alter database datafile 'I:\INTEL_DATA\O06DMS0\UNDO1.O06DMS0' offline drop;
SQL> alter database open;
開啟資料庫的目的是為了找出受影響的回滾段:
SQL> select segment_name,status from dba_rollback_segs;
SEGMENT_NAME STATUS
------------------------------ ----------------
SYSTEM ONLINE
_SYSSMU10_1201331463$ OFFLINE
_SYSSMU9_2926456744$ OFFLINE
_SYSSMU8_640224757$ OFFLINE
_SYSSMU7_3984293596$ OFFLINE
_SYSSMU6_3694658906$ OFFLINE
_SYSSMU5_3475919656$ OFFLINE
_SYSSMU4_168502732$ OFFLINE
_SYSSMU3_1987193959$ OFFLINE
_SYSSMU2_3908286755$ OFFLINE
_SYSSMU1_3281912951$ OFFLINE
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- -------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string undo1
關閉資料庫:
SQL> shutdown immediate;
Step 2.
建立一個臨時的pfile:
SQL> create pfile='H:\initO06DMS0.ora' from spfile;
修改pfile如下:
*.undo_management='manual' -- undo表空間管理方式修改為手動
*.undo_tablespace='undo2' --指定一個新的undo表空間
*._offline_rollback_segments=('_SYSSMU10_1201331463$','_SYSSMU9_2926456744$','_SYSSMU8_640224757$','_SYSSMU7_3984293596$','_SYSSMU6_3694658906$','_SYSSMU5_3475919656$','_SYSSMU4_168502732$','_SYSSMU3_1987193959$','_SYSSMU2_3908286755$','_SYSSMU1_3281912951$') --把所有受影響的回滾段都列在這裡
並以改pfile重新啟動資料庫:
SQL> startup pfile='H:\initO06DMS0.ora'
Step 3.
手動刪除受影響的回滾段:
SQL>drop rollback segment "_SYSSMU10_1201331463$";
SQL>drop rollback segment "_SYSSMU9_2926456744$";
SQL>drop rollback segment "_SYSSMU8_640224757$";
SQL>drop rollback segment "_SYSSMU7_3984293596$";
SQL>drop rollback segment "_SYSSMU6_3694658906$";
SQL>drop rollback segment "_SYSSMU5_3475919656$";
SQL>drop rollback segment "_SYSSMU4_168502732$";
SQL>drop rollback segment "_SYSSMU3_1987193959$";
SQL>drop rollback segment "_SYSSMU2_3908286755$";
SQL>drop rollback segment "_SYSSMU1_3281912951$";
手動刪除舊的undo表空間:
SQL> drop tablespace undo1 including contents;
重建新的undo表空間:
SQL> create undo tablespace undo2 datafile 'I:\INTEL_DATA\O06DMS0\UNDO2.O06DMS0' size 100m;
建立新的spfile,覆蓋舊的spfile:
SQL> create spfile from pfile='H:\initO06DMS0.ora';
關閉資料庫:
SQL> shutdown immediate;
Step 4.
以原來的spfile啟動資料庫:
SQL> startup;
還原undo表空間管理為自動:
SQL> alter system set undo_management='auto' scope=spfile;
取消隱藏引數的設定:
SQL> alter system reset "_offline_rollback_segments" scope=spfile;
重啟使其生效:
SQL> shutdown immediate;
SQL> startup
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- -------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string undo2
最終檢查一下:
SQL> select segment_name,status from dba_rollback_segs;
SEGMENT_NAME STATUS
------------------------------ ----------------
SYSTEM ONLINE
_SYSSMU40_1968985325$ ONLINE
_SYSSMU39_4040503138$ ONLINE
_SYSSMU38_4059847715$ ONLINE
_SYSSMU37_2692202156$ ONLINE
_SYSSMU36_2617425201$ ONLINE
_SYSSMU35_1133967719$ ONLINE
_SYSSMU34_1916939664$ ONLINE
_SYSSMU33_99444166$ ONLINE
_SYSSMU32_162619813$ ONLINE
_SYSSMU31_830375278$ ONLINE
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26277071/viewspace-713718/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle 無備份情況下undo檔案損壞處理Oracle
- 沒有備份的情況下如何處理logical & physical corrupt blockBloC
- 資料庫在沒有備份的情況下的資料檔案損壞的恢復資料庫
- 沒有備份undo segment出現問題的處理
- UNDO表空間損壞的處理
- undo表空間損壞的處理過程
- Undo和Current Online Redo損壞的處理方法
- Current online Redo 和 Undo 損壞的處理方法
- 沒有自動備份的情況下控制檔案全部丟失的恢復
- Oracle 10gR2 RAC 沒有備份的情況下恢復ocr和voteOracle 10g
- 【Oracle】Current online Redo 和 Undo 損壞的處理方法Oracle
- undo表空間檔案丟失恢復(2)--無備份有redo的情況下恢復
- REDO檔案丟失的恢復__沒有任何備份的情況
- Oracle塊損壞恢復(有rman備份)Oracle
- 沒有tag標識備份的情況下incremental updating backup是如何執行的REM
- 處理塊損壞
- 磁碟損壞造成RMAN備份檔案有壞塊的恢復案例
- 段頭損壞的處理
- catalog損壞情況下的資料庫恢復例項資料庫
- undo 檔案損壞
- ORACLE-00600 4194 斷電undo損壞處理過程Oracle
- rman備份後發現壞塊的處理
- undo表空間出現問題的幾種情況與處理
- RMAN備份時候檔案壞塊的處理
- xcodebuild -workspace 情況下,部分坑的處理XCodeUI
- 有整庫備份的情況rman恢復全庫
- undo表空間檔案丟失恢復(3)--無備份無redo的情況下恢復
- undo表空間檔案丟失恢復(4)--無備份無recover的情況下恢復
- Online Redo Log損壞處理實驗(下)
- Oracle RMAN備份中對壞塊(corrupt block)的處理OracleBloC
- 檢查備份情況的指令碼指令碼
- 第7章 處理塊損壞
- oracle10g rac 表決盤損壞、ocr損壞處理Oracle
- 處理表鎖定的情況
- JPA EntityManager 在沒有實體類的情況下返回Map
- 開始使用 Org 模式吧,在沒有 Emacs 的情況下模式Mac
- 如何在沒有前端框架的情況下實現元件化前端框架元件化
- undo檔案丟失或損壞