undo資料表空間故障特殊恢複(二)——ORA-01092: ORACLE 執行個體終止。強制中斷連線

來源:互聯網
上載者:User

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-----

 

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.