author:skate
time:2010-09-10
undo資料表空間故障特殊恢複(二)
這個測試的是instance recover(單一實例裡就是crash recovery)的恢複需要故障undo裡的資料,
一般的情況instance recover使用聯機記錄檔的,當發生多版本更新的故障,也可需要復原段資料的。
測試表
SQL> select count(1) from tabtest;
COUNT(1)
----------
17732
SQL> insert into tabtest select * from tabtest where rownum<2001;
已建立2000行。
SQL> insert into tabtest select * from tabtest where rownum<2001;
已建立2000行。
類比斷電故障,讓復原段的資料沒來得復原,使復原段在資料庫關閉時,保留未commit的事務
SQL> shutdown abort
ORACLE 常式已經關閉。
SQL> quit
從 Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options 斷
開
只有退出sqlplus環境,才能更改復原段資料檔案,刪除復原資料檔案,類比復原段丟失
C:/Documents and Settings/Administrator>sqlplus "/as sysdba"
SQL*Plus: Release 10.2.0.4.0 - Production on 星期四 9月 9 22:23:50 2010
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
已串連到空閑常式。
SQL> startup
ORACLE 常式已經啟動。
Total System Global Area 574619648 bytes
Fixed Size 1297944 bytes
Variable Size 234881512 bytes
Database Buffers 331350016 bytes
Redo Buffers 7090176 bytes
資料庫裝載完畢。
ORA-01157: 無法標識/鎖定資料檔案 2 - 請參閱 DBWR 追蹤檔案
ORA-01110: 資料檔案 2: 'E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/UNDOTBS13.DBF'
錯誤出現了,因為我已經刪除檔案“E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/UNDOTBS13.DBF”
SQL> shutdown abort;
ORACLE 常式已經關閉。
這裡startup force是類比instance recover時需要復原段裡的資料情況,為什麼能類比出來,我也不清楚,我是經過多次測試發現的,哪位高人知道原因,請指點????
SQL> startup force;
ORACLE 常式已經啟動。
Total System Global Area 574619648 bytes
Fixed Size 1297944 bytes
Variable Size 234881512 bytes
Database Buffers 331350016 bytes
Redo Buffers 7090176 bytes
資料庫裝載完畢。
ORA-01157: 無法標識/鎖定資料檔案 2 - 請參閱 DBWR 追蹤檔案
ORA-01110: 資料檔案 2: 'E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/UNDOTBS13.DBF'
SQL> alter database datafile 2 offline drop;
資料庫已更改。
SQL> alter database open;
alter database open
*
第 1 行出現錯誤:
ORA-01092: ORACLE 執行個體終止。強制中斷連線
這裡instance recover需要復原段裡資料,但是復原段丟失,所以執行個體出現異常直接關閉
SQL> startup
ORA-24324: 未初始化服務控制代碼
ORA-01041: 內部錯誤, hostdef 副檔名不存在
SQL> quit
從 Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options 斷
開
C:/Documents and Settings/Administrator>sqlplus "/as sysdba"
SQL*Plus: Release 10.2.0.4.0 - Production on 星期四 9月 9 22:27:05 2010
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
已串連到空閑常式。
SQL> startup
ORACLE 常式已經啟動。
Total System Global Area 574619648 bytes
Fixed Size 1297944 bytes
Variable Size 234881512 bytes
Database Buffers 331350016 bytes
Redo Buffers 7090176 bytes
資料庫裝載完畢。
ORA-01092: ORACLE 執行個體終止。強制中斷連線
SQL>
在看看alertlog檔案,錯誤資訊如下:
。。。。
Errors in file e:/oracle/product/10.2.0/admin/test/bdump/test_smon_1828.trc:
ORA-00604: error occurred at recursive SQL level 1
ORA-00376: file 2 cannot be read at this time
ORA-01110: data file 2: 'E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/UNDOTBS13.DBF'
Thu Sep 09 22:27:17 2010
Errors in file e:/oracle/product/10.2.0/admin/test/udump/test_ora_3844.trc:
ORA-00604: 遞迴 SQL 層級 1 出現錯誤
ORA-00376: 此時無法讀取檔案 2
ORA-01110: 資料檔案 2: 'E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/UNDOTBS13.DBF'
Error 604 happened during db open, shutting down database
USER: terminating instance due to error 604
Thu Sep 09 22:27:17 2010
Errors in file e:/oracle/product/10.2.0/admin/test/bdump/test_pmon_5952.trc:
ORA-00604: error occurred at recursive SQL level
Thu Sep 09 22:27:18 2010
Errors in file e:/oracle/product/10.2.0/admin/test/bdump/test_reco_3988.trc:
ORA-00604: error occurred at recursive SQL level
Thu Sep 09 22:27:18 2010
Errors in file e:/oracle/product/10.2.0/admin/test/bdump/test_ckpt_5320.trc:
ORA-00604: error occurred at recursive SQL level
Thu Sep 09 22:27:18 2010
Errors in file e:/oracle/product/10.2.0/admin/test/bdump/test_lgwr_1312.trc:
ORA-00604: error occurred at recursive SQL level
Thu Sep 09 22:27:18 2010
Errors in file e:/oracle/product/10.2.0/admin/test/bdump/test_mman_4972.trc:
ORA-00604: error occurred at recursive SQL level
Thu Sep 09 22:27:18 2010
Errors in file e:/oracle/product/10.2.0/admin/test/bdump/test_dbw0_4060.trc:
ORA-00604: error occurred at recursive SQL level
Thu Sep 09 22:27:18 2010
Errors in file e:/oracle/product/10.2.0/admin/test/bdump/test_psp0_1276.trc:
ORA-00604: error occurred at recursive SQL level
Instance terminated by USER, pid = 3844
ORA-1092 signalled during: ALTER DATABASE OPEN...
。。。。。
根據錯誤資訊知道復原段資料故障會丟失,如果有備份的話,直接recover datafile 很簡單就可以恢複,這裡假設沒有備份,
那該如何處理呢?現在因為復原段資料檔案的故障,導致資料庫無法開啟,那我們想辦法讓資料庫的檢查繞過或修複復原段數
據檔案,資料庫open時,所有的資料檔案都要online,如果不能online,那就要恢複或者直接把資料檔案drop掉。我們這裡沒有
備份不能恢複,那就drop掉故障的資料檔案,然後讓資料可以開啟,然後在重新建立新的復原段資料表空間,讓資料庫使用新的復原段
資料表空間,最後在把有故障的復原段資料表空間刪除。這是解決問題的基本思路。操作步驟如下:
修改參數檔案 ,添加隱含參數
我這裡只用了“_corrupted_rollback_segments”
在文本參數檔案inittest.ora的最後追加如下一條記錄
*._corrupted_rollback_segments=( _SYSSMU12$,_SYSSMU13$,_SYSSMU14$,_SYSSMU15$,_SYSSMU16$,_SYSSMU17$,_SYSSMU18$,_SYSSMU19$,_SYSSMU20$,_SYSSMU11$)
SQL> quit
從 Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options 斷
開
C:/Documents and Settings/Administrator>sqlplus "/as sysdba"
SQL*Plus: Release 10.2.0.4.0 - Production on 星期四 9月 9 22:32:43 2010
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
已串連到空閑常式。
SQL> startup pfile='E:/oracle/product/10.2.0/db_1/database/inittest.ora'
ORACLE 常式已經啟動。
Total System Global Area 574619648 bytes
Fixed Size 1297944 bytes
Variable Size 234881512 bytes
Database Buffers 331350016 bytes
Redo Buffers 7090176 bytes
資料庫裝載完畢。
資料庫已經開啟。
現在資料庫已經開啟, 剩下就簡單多了,建立新的復原段資料表空間,刪除故障復原段資料表空間
SQL>
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
SQL> create undo tablespace undotbs4 datafile 'E:/ORACLE/PRODUCT/10.2.0/ORADATA/
TEST/UNDOTBS41.DBF' size 50m ;
資料表空間已建立。
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
SQL> alter system set undo_tablespace='undotbs4' scope=spfile;
alter system set undo_tablespace='undotbs4' scope=spfile
*
第 1 行出現錯誤:
ORA-32001: 已請求寫入 SPFILE, 但是在啟動時未指定 SPFILE
SQL> alter system set undo_tablespace='undotbs4';
系統已更改。
SQL>
SQL> shutdown immediate
資料庫已經關閉。
已經卸載資料庫。
ORACLE 常式已經關閉。
SQL> startup pfile='E:/oracle/product/10.2.0/db_1/database/inittest.ora'
ORACLE 常式已經啟動。
Total System Global Area 574619648 bytes
Fixed Size 1297944 bytes
Variable Size 234881512 bytes
Database Buffers 331350016 bytes
Redo Buffers 7090176 bytes
資料庫裝載完畢。
資料庫已經開啟。
檢查當前使用復原段情況
SQL> select segment_name,status,tablespace_name from dba_rollback_segs;
SEGMENT_NAME STATUS TABLESPACE_NAME
------------------------------ ---------------- ------------------------------
SYSTEM ONLINE SYSTEM
_SYSSMU1$ NEEDS RECOVERY UNDOTBS1
_SYSSMU2$ NEEDS RECOVERY UNDOTBS1
_SYSSMU3$ NEEDS RECOVERY UNDOTBS1
_SYSSMU4$ NEEDS RECOVERY UNDOTBS1
_SYSSMU5$ NEEDS RECOVERY UNDOTBS1
_SYSSMU6$ NEEDS RECOVERY UNDOTBS1
_SYSSMU7$ NEEDS RECOVERY UNDOTBS1
_SYSSMU8$ NEEDS RECOVERY UNDOTBS1
_SYSSMU9$ NEEDS RECOVERY UNDOTBS1
_SYSSMU10$ NEEDS RECOVERY UNDOTBS1
SEGMENT_NAME STATUS TABLESPACE_NAME
------------------------------ ---------------- ------------------------------
_SYSSMU11$ ONLINE UNDOTBS4
_SYSSMU12$ ONLINE UNDOTBS4
_SYSSMU13$ ONLINE UNDOTBS4
_SYSSMU14$ ONLINE UNDOTBS4
_SYSSMU15$ ONLINE UNDOTBS4
_SYSSMU16$ ONLINE UNDOTBS4
_SYSSMU17$ ONLINE UNDOTBS4
_SYSSMU18$ ONLINE UNDOTBS4
_SYSSMU19$ ONLINE UNDOTBS4
_SYSSMU20$ ONLINE UNDOTBS4
已選擇21行。
SQL> select * from v$recover_file;
FILE# ONLINE ONLINE_
---------- ------- -------
ERROR CHANGE#
----------------------------------------------------------------- ----------
TIME
--------------
2 OFFLINE OFFLINE
FILE NOT FOUND 0
8 OFFLINE OFFLINE
16898701
07-9月 -10
FILE# ONLINE ONLINE_
---------- ------- -------
ERROR CHANGE#
----------------------------------------------------------------- ----------
TIME
--------------
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS4
SQL> drop tablespace undotbs4 including contents and datafiles;
drop tablespace undotbs4 including contents and datafiles
*
第 1 行出現錯誤:
ORA-30013: 還原資料表空間 'UNDOTBS4' 當前正在使用中
SQL>
SQL> shutdown immediate;
資料庫已經關閉。
已經卸載資料庫。
ORACLE 常式已經關閉。
再用修改文本參數檔案,添加隱含參數
在文本參數檔案inittest.ora的最後追加如下一條記錄
*._corrupted_rollback_segments=( _SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$,_SYSSMU1$)
啟動資料庫
SQL> startup pfile='E:/oracle/product/10.2.0/db_1/database/inittest.ora'
ORACLE 常式已經啟動。
Total System Global Area 574619648 bytes
Fixed Size 1297944 bytes
Variable Size 234881512 bytes
Database Buffers 331350016 bytes
Redo Buffers 7090176 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> drop tablespace undotbs1 including contents and datafiles;
資料表空間已刪除。
SQL> select segment_name,status,tablespace_name from dba_rollback_segs;
SEGMENT_NAME STATUS TABLESPACE_NAME
------------------------------ ---------------- ------------------------------
SYSTEM ONLINE SYSTEM
_SYSSMU11$ ONLINE UNDOTBS4
_SYSSMU12$ ONLINE UNDOTBS4
_SYSSMU13$ ONLINE UNDOTBS4
_SYSSMU14$ ONLINE UNDOTBS4
_SYSSMU15$ ONLINE UNDOTBS4
_SYSSMU16$ ONLINE UNDOTBS4
_SYSSMU17$ ONLINE UNDOTBS4
_SYSSMU18$ ONLINE UNDOTBS4
_SYSSMU19$ ONLINE UNDOTBS4
_SYSSMU20$ ONLINE UNDOTBS4
已選擇11行。
SQL> shutdown immediate;
資料庫已經關閉。
已經卸載資料庫。
ORACLE 常式已經關閉。
SQL> startup pfile='E:/oracle/product/10.2.0/db_1/database/inittest.ora'
ORACLE 常式已經啟動。
Total System Global Area 574619648 bytes
Fixed Size 1297944 bytes
Variable Size 234881512 bytes
Database Buffers 331350016 bytes
Redo Buffers 7090176 bytes
資料庫裝載完畢。
資料庫已經開啟。
查看如下都正常了吧
SQL> select segment_name,status,tablespace_name from dba_rollback_segs;
SEGMENT_NAME STATUS TABLESPACE_NAME
------------------------------ ---------------- ------------------------------
SYSTEM ONLINE SYSTEM
_SYSSMU11$ ONLINE UNDOTBS4
_SYSSMU12$ ONLINE UNDOTBS4
_SYSSMU13$ ONLINE UNDOTBS4
_SYSSMU14$ ONLINE UNDOTBS4
_SYSSMU15$ ONLINE UNDOTBS4
_SYSSMU16$ ONLINE UNDOTBS4
_SYSSMU17$ ONLINE UNDOTBS4
_SYSSMU18$ ONLINE UNDOTBS4
_SYSSMU19$ ONLINE UNDOTBS4
_SYSSMU20$ ONLINE UNDOTBS4
已選擇11行。
SQL> select count(1) from tabtest;
COUNT(1)
----------
21732
SQL> create spfile from pfile;
檔案已建立。
SQL> create spfile from pfile;
檔案已建立。
SQL> shutdown immediate;
資料庫已經關閉。
已經卸載資料庫。
ORACLE 常式已經關閉。
SQL> startup
ORACLE 常式已經啟動。
Total System Global Area 574619648 bytes
Fixed Size 1297944 bytes
Variable Size 234881512 bytes
Database Buffers 331350016 bytes
Redo Buffers 7090176 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL>
已經恢複ok
說明:
其實在恢複資料庫後的善後工作很重要,不要留尾巴。做事要認真些,完美些,不要留下遺憾。細節很重要
善後處理:
0. 檢查資料庫、執行個體的狀態(v$instance,v$database),確認是否還有其他檔案恢複(v$recover_file)
1. 檢查是否有無效的對象定義
2. 檢查是否有失效的索引
3. 查看應用指令碼是否正常
4。檢查系統是否有死結
5. 檢查系統的各資源是否正常
6. 查看系統log、alertlog、tracelog等檔案
----end-----