undo資料檔案丟失的恢復
從自己的錯誤中學到知識是聰明,從別人的錯誤中學到知識是智慧
罈子裡看到一個帖子,討論的是undo表空間對應的資料檔案丟失之後的恢復問題,為了加深印象,自己模擬一下:
1.關閉資料庫
2.將undotbs1對應的資料檔案重新命名,或者刪除,隨便你,(測試庫,可不要在生產庫上做這個實驗,當然,你最好有之前的一個備份再做刪除操作)
3.重新啟動資料庫,會報找不到資料檔案錯:
sys@baal> startup
ORACLE 例程已經啟動。
Total System Global Area 159383552 bytes
Fixed Size 1295608 bytes
Variable Size 92277512 bytes
Database Buffers 62914560 bytes
Redo Buffers 2895872 bytes
資料庫裝載完畢。
ORA-01157: 無法標識/鎖定資料檔案 2 – 請參閱 DBWR 跟蹤檔案
ORA-01110: 資料檔案 2: ‘E:\ORA10G\ORADATA\BAAL\BAAL\UNDOTBS01.DBF’
4.但此時資料庫已經mount,所以可以從v$datafile中檢視undo表空間的詳細目錄資訊等。
sys@baal> select name from v$datafile;
NAME
———————————————-
E:\ORA10G\ORADATA\BAAL\BAAL\SYSTEM01.DBF
E:\ORA10G\ORADATA\BAAL\BAAL\UNDOTBS01.DBF
E:\ORA10G\ORADATA\BAAL\BAAL\SYSAUX01.DBF
E:\ORA10G\ORADATA\BAAL\BAAL\USERS01.DBF
E:\ORA10G\ORADATA\BAAL\BAAL\BAAL.DBF
E:\ORA10G\ORADATA\BAAL\BAAL\BIGTBS.DBF
E:\ORA10G\ORADATA\BAAL\BAAL\BAAL1.DBF
E:\ORA10G\ORADATA\BAAL\BAAL\TEST.DBF
5.將undo資料檔案offline drop,隨後開啟資料庫此操作可能導致資料庫的資料不一致,因為undo表空間中可能還有要恢復的資料。
sys@baal> alter database datafile ‘E:\ORA10G\ORADATA\BAAL\BAAL\UNDOTBS01.DBF’ offline drop;
資料庫已更改。
已用時間: 00: 00: 00.31
sys@baal> alter database open;
資料庫已更改。
6.為系統建立新的undo表空間,並且切換
sys@baal> create undo tablespace undotbs2 datafile ‘E:\ORA10G\ORADATA\BAAL\BAAL\UNDOTBS02.DBF’ size 500m autoextend off;
表空間已建立。
已用時間: 00: 00: 12.67
sys@baal> alter system set undo_tablespace=undotbs2;
系統已更改。
7.如果你認為此時工作已經完成,那就樂觀太早了,因為嘗試刪除undotbs1會報錯,而且此時嘗試查詢需要恢復操作的表時也會報錯。
sys@baal> drop tablespace undotbs1 including contents and datafiles;
drop tablespace undotbs1 including contents and datafiles
*
第 1 行出現錯誤:
ORA-01548: 已找到活動回退段 ‘_SYSSMU1$’, 終止刪除表空間
8.可以檢視一下回退段此時的狀態,可以看到undotbs1的狀態是need recovery
sys@baal> SELECT SEGMENT_NAME, OWNER, TABLESPACE_NAME, STATUS FROM DBA_ROLLBACK_SEGS;
SEGMENT_NAME OWNER TABLESPACE_NAME STATUS
—————————— —— —————————— —————-
SYSTEM SYS SYSTEM ONLINE
_SYSSMU1$ PUBLIC UNDOTBS1 NEEDS RECOVERY
_SYSSMU2$ PUBLIC UNDOTBS1 NEEDS RECOVERY
_SYSSMU3$ PUBLIC UNDOTBS1 NEEDS RECOVERY
_SYSSMU4$ PUBLIC UNDOTBS1 NEEDS RECOVERY
_SYSSMU5$ PUBLIC UNDOTBS1 NEEDS RECOVERY
_SYSSMU6$ PUBLIC UNDOTBS1 NEEDS RECOVERY
_SYSSMU7$ PUBLIC UNDOTBS1 NEEDS RECOVERY
_SYSSMU8$ PUBLIC UNDOTBS1 NEEDS RECOVERY
_SYSSMU9$ PUBLIC UNDOTBS1 NEEDS RECOVERY
_SYSSMU10$ PUBLIC UNDOTBS1 NEEDS RECOVERY
_SYSSMU11$ PUBLIC UNDOTBS2 ONLINE
_SYSSMU12$ PUBLIC UNDOTBS2 ONLINE
_SYSSMU13$ PUBLIC UNDOTBS2 ONLINE
_SYSSMU14$ PUBLIC UNDOTBS2 ONLINE
_SYSSMU15$ PUBLIC UNDOTBS2 ONLINE
_SYSSMU16$ PUBLIC UNDOTBS2 ONLINE
_SYSSMU17$ PUBLIC UNDOTBS2 ONLINE
_SYSSMU18$ PUBLIC UNDOTBS2 ONLINE
_SYSSMU19$ PUBLIC UNDOTBS2 ONLINE
_SYSSMU20$ PUBLIC UNDOTBS2 ONLINE
9.此時在沒有備份的情況下,可以嘗試使用隱含引數將資料庫開啟,不過這個過程會破壞資料庫的一致性,而且可能造成資料庫出現邏輯錯誤。採用下面的方法開啟資料庫後,應該馬上執行EXP備份,建重資料後庫,再匯入。
10.重新建立pfile
sys@baal> create pfile=’E:\ora10g\database\initbaal1.ora’ from spfile;
檔案已建立。
11.關閉例項並且手工編輯pfile,修改或新增以下隱含引數,用修改後的pfile開啟資料庫。
*.undo_management=’MANUAL’
_offline_rollback_segments=(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$)
sys@baal> startup pfile=E:\ora10g\database\initbaal1.ora
ORACLE 例程已經啟動。
Total System Global Area 159383552 bytes
Fixed Size 1295608 bytes
Variable Size 92277512 bytes
Database Buffers 62914560 bytes
Redo Buffers 2895872 bytes
資料庫裝載完畢。
資料庫已經開啟。
12.可以先檢視一下資料庫中回滾段的狀態,發現undotbs2的回退段也變成offline了。由於設定了隱含引數,現在可以刪除這些回滾段了。
sys@baal> SELECT SEGMENT_NAME, OWNER, TABLESPACE_NAME, STATUS FROM DBA_ROLLBACK_SEGS;
SEGMENT_NAME OWNER TABLESPACE_NAME STATUS
—————————— —— —————————— —————-
SYSTEM SYS SYSTEM ONLINE
_SYSSMU1$ PUBLIC UNDOTBS1 NEEDS RECOVERY
_SYSSMU2$ PUBLIC UNDOTBS1 NEEDS RECOVERY
_SYSSMU3$ PUBLIC UNDOTBS1 NEEDS RECOVERY
_SYSSMU4$ PUBLIC UNDOTBS1 NEEDS RECOVERY
_SYSSMU5$ PUBLIC UNDOTBS1 NEEDS RECOVERY
_SYSSMU6$ PUBLIC UNDOTBS1 NEEDS RECOVERY
_SYSSMU7$ PUBLIC UNDOTBS1 NEEDS RECOVERY
_SYSSMU8$ PUBLIC UNDOTBS1 NEEDS RECOVERY
_SYSSMU9$ PUBLIC UNDOTBS1 NEEDS RECOVERY
_SYSSMU10$ PUBLIC UNDOTBS1 NEEDS RECOVERY
_SYSSMU11$ PUBLIC UNDOTBS2 OFFLINE
_SYSSMU12$ PUBLIC UNDOTBS2 OFFLINE
_SYSSMU13$ PUBLIC UNDOTBS2 OFFLINE
_SYSSMU14$ PUBLIC UNDOTBS2 OFFLINE
_SYSSMU15$ PUBLIC UNDOTBS2 OFFLINE
_SYSSMU16$ PUBLIC UNDOTBS2 OFFLINE
_SYSSMU17$ PUBLIC UNDOTBS2 OFFLINE
_SYSSMU18$ PUBLIC UNDOTBS2 OFFLINE
_SYSSMU19$ PUBLIC UNDOTBS2 OFFLINE
_SYSSMU20$ PUBLIC UNDOTBS2 OFFLINE
sys@baal> drop rollback segment “_SYSSMU1$”;
回退段已刪除。
。。。。。
但是undotbs2中的回退段不能刪除
sys@baal> drop rollback segment “_SYSSMU11$”;
drop rollback segment “_SYSSMU11$”
*
第 1 行出現錯誤:
ORA-30025: 不允許刪除段 ‘_SYSSMU11$’ (在還原表空間中)
13.刪除undotbs1
sys@baal> DROP TABLESPACE UNDOTBS1 INCLUDING CONTENTS AND DATAFILES;
表空間已刪除。
14.重啟一下,去掉隱含引數
sys@baal> shutdown immediate;
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
sys@baal> startup
ORACLE 例程已經啟動。
Total System Global Area 159383552 bytes
Fixed Size 1295608 bytes
Variable Size 92277512 bytes
Database Buffers 62914560 bytes
Redo Buffers 2895872 bytes
資料庫裝載完畢。
資料庫已經開啟。
sys@baal> show parameter undo
NAME TYPE VALUE
———————————— ———– ——————————
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS2
sys@baal> SELECT SEGMENT_NAME, OWNER, TABLESPACE_NAME, STATUS FROM DBA_ROLLBACK_SEGS;
SEGMENT_NAME OWNER TABLESPACE_NAME STATUS
—————————— —— —————————— —————-
SYSTEM SYS SYSTEM ONLINE
_SYSSMU11$ PUBLIC UNDOTBS2 ONLINE
_SYSSMU12$ PUBLIC UNDOTBS2 ONLINE
_SYSSMU13$ PUBLIC UNDOTBS2 ONLINE
_SYSSMU14$ PUBLIC UNDOTBS2 ONLINE
_SYSSMU15$ PUBLIC UNDOTBS2 ONLINE
_SYSSMU16$ PUBLIC UNDOTBS2 ONLINE
_SYSSMU17$ PUBLIC UNDOTBS2 ONLINE
_SYSSMU18$ PUBLIC UNDOTBS2 ONLINE
_SYSSMU19$ PUBLIC UNDOTBS2 ONLINE
_SYSSMU20$ PUBLIC UNDOTBS2 ONLINE
已選擇11行。
已用時間: 00: 00: 00.31
很鬱悶的是我模擬了半天,卻一直沒有模擬出回滾段需要recovery needed狀態。如果 哪位大俠知道請給我留言,謝謝