1. 程式人生 > >undo資料檔案丟失的恢復

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狀態。如果 哪位大俠知道請給我留言,謝謝