1. 程式人生 > >Oracle UNDO表空間對應的檔案在執行過程中丟失如何恢復

Oracle UNDO表空間對應的檔案在執行過程中丟失如何恢復

上次在blog中模擬了undo表空間對應的檔案在shutdown immediate後,在重新啟動之前丟失了,這僅僅是模擬而已,現實中這個時間段(shutdown immediate --- startup)這個期間丟失undo檔案的可能性幾乎沒有.這個情況的恢復請參照http://blog.csdn.net/kkdelta/article/details/7206795

而最常發生的是在執行中undo檔案損壞或者丟失.今天來模擬一下這種情況.

1,在一個session中模擬業務正在進行:有更新發生,但是沒有提交.

create table test as select * from all_objects where 1=2
insert into test  select * from all_objects
insert into test  select * from all_objects
select count(*) from test;
  COUNT(*)
----------
    100402

2,模擬down機,SQL> shutdown abort
ORACLE instance shut down.

3,將undo檔案重新命名UNDOTBS01.DBF.1,模擬丟失.(在Windows中需要從發出shutdown abort的sqlplus中退出,SQL> exit)

4,這時候重新啟動資料庫的時候:

SQL> startup
ORACLE instance started.
Total System Global Area  612368384 bytes
Fixed Size                  1250428 bytes
Variable Size             343935876 bytes
Database Buffers          260046848 bytes
Redo Buffers                7135232 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 2 - see DBWR trace file
ORA-01110: data file 2: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF'

如果有備份的undo檔案,恢復步驟如下

1,將備份拷貝回來

2恢復檔案SQL> recover datafile 2;
Media recovery complete.
3,開啟資料庫 SQL> alter database open;
Database altered.

資料成功恢復,資料不會有錯誤.

如果沒有備份的undo檔案,恢復步驟如下

1,SQL> alter database datafile 2 offline drop;
Database altered.

2,建立一個pfile

SQL> create pfile='D:\oracle\product\10.2.0\admin\orcl\pfile\initorcl.ora' from spfile;
File created.

如果生產的pfile中有重定向的語句,如:*.SPFILE='D:\oracle\product\10.2.0\db_1/dbs/spfileorcl.ora'

SQL> create pfile='D:\oracle\product\10.2.0\admin\orcl\pfile\initorcl.ora' from SPFILE='D:\oracle\product\10.2.0\db_1/dbs/spfileorcl.ora';

將pfile的*.undo_management='AUTO'改為*.undo_management='MANUAL'

在pfile裡新增:  *._corrupted_rollback_segments=(_SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$,_SYSSMU1$)
3,重新用pfile啟動資料庫

SQL> shutdown immediate

ORACLE instance shut down.

SQL> startup  pfile='D:\oracle\product\10.2.0\admin\orcl\pfile\initorcl.ora'
ORACLE instance started.
Total System Global Area  612368384 bytes
Fixed Size                  1250428 bytes
Variable Size             377490308 bytes
Database Buffers          226492416 bytes
Redo Buffers                7135232 bytes
Database mounted.
Database opened.

資料庫成功開啟.但是資料是不一致的,可以看到test表裡沒有提交的資料也存在於資料庫.

[這一步有的時候成功,有的時候不成功,感覺更資料庫開啟的時候做例項恢復的時候是否需要做回滾有關,如果需要回滾,則會失敗。也可能是別的原因,這裡不太清楚.
錯誤的資訊為:ORA-01092: ORACLE instance terminated. Disconnection forced[]

SQL> select count(*) from test;
  COUNT(*)
----------
    100402

4,重建undo表空間

SQL> drop tablespace UNDOTBS1 including contents and datafiles;
Tablespace dropped.

SQL> create undo tablespace UNDOTBS1 datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF' size 20M;
Tablespace created.

5,用spfile重新啟動,資料庫改回自動undo管理.

SQL> startup