控制檔案被破壞的資料庫恢復方法

ysping發表於2009-12-11
這種情況一般不需要restore database。[@more@]

(一)、有映象檔案時

1、如果控制檔案不同步,則從引數檔案中,將不同步的引數檔案去掉,或複製一個好的控制檔案替換壞的控制檔案或。(ora-00214)
2、如果出現ora-00205錯誤,檢查各控制檔案是否正確。
3、Sql>startup

(二)、沒有映象檔案時
Ⅰ、重建控制檔案來恢復資料庫:
1、控制檔案損壞後以NOMOUNT方式啟動,然後根據以前備份的trace檔案重新建立一個新的控制檔案。如果在備份控制檔案之後建立了新的資料檔案,並且知道資料檔案的路徑,可以把新建的表空間的資料檔案新增在重建文字中。
Sql>startup nomount
……
Sql>create controlfile reuse database prod
logfile
group 1 'D:ORACLEORADATAORA92REDO01.LOG' SIZE 10M,
GROUP 2 'D:ORACLEORADATAORA92REDO02.LOG' SIZE 10M,
GROUP 3 'D:ORACLEORADATAORA92REDO03.LOG' SIZE 10M
NORESETLOGS
datafile
'D:ORACLEORADATAORA92SYSTEM01.DBF',
'D:ORACLEORADATAORA92UNDOTBS01.DBF',
'D:ORACLEORADATAORA92INDX01.DBF',
'D:ORACLEORADATAORA92TOOLS01.DBF',
'D:ORACLEORADATAORA92USERS01.DBF'
MAXLOGHISTORY 2000
MAXDATAFILES 2000
MAXLOGMEMBERS 5
CHARACTER SET ZHS16GBK;
2、恢復資料庫
-- Recovery is required if any of the datafiles are restored backups,
-- or if the last shutdown was not normal or immediate.
先ALTER DATABASE OPEN,如果提示需要恢復,則
RECOVER DATABASE
ALTER DATABASE OPEN;
--if recover database until cancel
--ALTER DATABASE OPEN RESETLOGS;

3、如果沒有錯誤,資料庫將啟動到open狀態下。

重建的控制檔案中不包含檢查點程式記錄資訊,重建的控制檔案從資料檔案中獲得檔案狀態及檢查點資訊,控制檔案重建後,控制檔案中的歸檔、備份資訊都會丟失,上次備份控制檔案時刻之後新建的資料檔案會丟失等。

Ⅱ、用USING BACKUP CONTROLFILE做恢復的具體操作步驟:
1. SHUTDOWN資料庫
2. COPY舊的CONTROLFILE到指定目錄,覆蓋當前的CONTROLFILE.
3. STARTUP MOUNT;
4. OFFLINE所有隻讀的DATA FILE; ALTER DATABASE DATAFILE '...' OFFLINE;
5. RECOVER DATABASE USING BACKUP CONTROLFILE;
或者:RMAN>restore controlfile from ‘...’;
RMAN> recover database;
如果在備份控制檔案之後建立了新的資料檔案,此時會出錯,alter database rename file 'missingxxx' to '實際檔案';
然後recover database using backup controlfile; 或者recover database;
如果將後來新建的資料檔案先刪除再recover,需要應用的archivelog會多很多。
先recover,然後才能看到missingxxx這個檔案,否則看不到的。
6. ALTER DATABASE OPEN RESETLOG;
7. ONLINE只讀DATA FILE.
如果只是丟失了控制檔案,使用using backup controlfile可以使控制檔案恢復到最新狀態,只要在恢復的最後指定一個online redo即可。
using backup controlfile是指示ORACLE當前的CONTROLFILE是以前的備份檔案,LOG_NO不是最新的,如果不加這個引數,ORACLE會檢查LOG FILE中的LOG_NO是否和CONTROL FILE相同,然後報錯!你就無法完成RECOVER。
using backup controlfile 一發出,不管是不是當前的控制檔案,oracle一開始就認為你是要做不完全恢復,即使你apply了最新的log。 所以要求你必須ALTER DATABASE OPEN RESETLOGS,即使你apply了最新的log。
實際上,假如你有舊的控制檔案又不想resetlogs:那很簡單,將舊的控制檔案restore到其他地方restore controlfile to '...'from '...';,然後mount,然後 alter database backup controlfile to trace ,然後shutdown immediate,startup nomount,然後根據這個trace檔案手工建立控制檔案,重建時使用 reuse database ... noresetlogs .這樣就可以 recover database自動恢復並open database, 而不用 resetlogs 了。

(三)以下是一種較好的重建控制檔案的方法:

  1. 在重建Control前,建議備份資料庫中的資料,以防不測。
  2. sqlplus /nolog
  3. SQL>connect /as sysdbal
  4. SQL>alter database backup controlfile to trace; 備份建立控制檔案的指令碼到TRC檔案,生成的trace檔案位於udump目錄下!
  5. 在$ORACLE_HOME/admin/SID/udump下可找到最新生成的TRACE檔案,如ora_23456.trc,此檔案就包含了當前控制檔案的引數及生成語法。
  6. 提取ora_23456.trc中有關控制檔案生成的語句另存為recreatctl.sql。
  7. recreatctl.sql的內容為:
  SQL>STARTUP NOMOUNT
SQL>執行重建sql文字:
  CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS NOARCHIVELOG
  MAXLOGFILES 32
  MAXLOGMEMBERS 2
  MAXDATAFILES 50
  MAXINSTANCES 8
  MAXLOGHISTORY 800
  LOGFILE
  GROUP 1 '/dev/vg00/roraredoa1' SIZE 10M,
  GROUP 2 '/dev/vg00/roraredoa2' SIZE 10M,
  GROUP 3 '/dev/vg00/roraredoa3' SIZE10M
  DATAFILE
  '/dev/vg00/rorclsys',
  '/dev/vg00/rorclrbs',
  '/dev/vg00/rorcltemp',
  '/dev/vg00/rorcltools',
  '/dev/vg00/rorcluser'
  ;
注意:建立控制檔案的時候,正常的話使用reuse and noresetlogs,這樣就不用手工apply日誌而是直接就可以自動恢復了。

  8. 如果需要修改,可按自己的需要編輯creatctl.sql中的引數,如maxdatafiles、maxinstances等。
  9. sqlplus /nolog
  10. SQL>connect /as sysdba
  11. SQL>shutdown immediate
  12. SQL>@recreatctl.sql
  13. SQL>alter database open;
重新建控制檔案完畢。

如果建立控制檔案的時候產生01189(用resetlogs選項):

重新建立控制檔案。
SQLPLUS> ALTER DATABASE BACKUP CONTROLFILE TO TRACE;
資料庫已更改。
SQLPLUS> SHUTDOWN IMMEDIATE
ORA-01109: 資料庫未開啟

已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQLPLUS> STARTUP NOMOUNT;
ORACLE 例程已經啟動。
Total System Global Area 135339940
bytes

Fixed Size 454564
bytes

Variable Size 109051904
bytes

Database Buffers 25165824
bytes

Redo Buffers 667648
bytes

SQLPLUS> CREATE CONTROLFILE REUSE DATABASE "ORA9I " RESETLOGS NOARCHIVELOG
2 -- SET STANDBY TO MAXIMIZE PERFORMANCE
3 MAXLOGFILES 5
4 MAXLOGMEMBERS 3
5 MAXDATAFILES 100
6 MAXINSTANCES 1
7 MAXLOGHISTORY 453
8 LOGFILE
9 GROUP 1 'E:ORACLE9IORA9IREDO01.LOG ' SIZE 5M,
10 GROUP 2 'E:ORACLE9IORA9IREDO02.LOG ' SIZE 5M
11 -- STANDBY LOGFILE
12 DATAFILE
13 'E:ORACLE9IORA9ISYSTEM01.DBF ',
14 'E:ORACLE9IORA9IUNDOTBS01.DBF ',
15 'E:ORACLE9IORA9IDRSYS01.DBF ',
16 'E:ORACLE9IORA9IINDX01.DBF ',
17 'E:ORACLE9IORA9ITOOLS01.DBF ',
18 'E:ORACLE9IORA9IUSERS01.DBF ',
19 'E:ORACLE9IORA9IXDB01.DBF ',
20 'E:ORACLE9IORA9IOEM_REPOSITORY.DBF ',
21 'E:ORACLE9IORADATAGAXZTEMP.DB ',
22 'E:ORACLE9IORADATAGAXZUSR.DB ',
23 'E:ORACLE9IORADATAGAXZRBS.DB ',
24 'E:ORACLE9IORADATAGAXZWEB.DB '
25 CHARACTER SET ZHS16GBK
26 ;
CREATE CONTROLFILE REUSE DATABASE "ORA9I " RESETLOGS NOARCHIVELOG
*
ERROR 位於第 1 行:
ORA-01503: CREATE CONTROLFILE ??
ORA-01189: ????????????? RESETLOGS
ORA-01110: ???? 2: 'E:ORACLE9IORA9IUNDOTBS01.DBF '
上面按照生成的控制檔案程式碼重新建立控制檔案的時候,出現了討厭的ORA-01189! 於是將除了SYSTEM表空間對應的檔案以外,其它的檔案都去掉:
SQLPLUS> CREATE CONTROLFILE REUSE DATABASE "ORA9I " RESETLOGS NOARCHIVELOG
2 -- SET STANDBY TO MAXIMIZE PERFORMANCE
3 MAXLOGFILES 5
4 MAXLOGMEMBERS 3
5 MAXDATAFILES 100
6 MAXINSTANCES 1
7 MAXLOGHISTORY 453
8 LOGFILE
9 GROUP 1 'E:ORACLE9IORA9IREDO01.LOG ' SIZE 5M,
10 GROUP 2 'E:ORACLE9IORA9IREDO02.LOG ' SIZE 5M
11 -- STANDBY LOGFILE
12 DATAFILE
13 'E:ORACLE9IORA9ISYSTEM01.DBF '
14 CHARACTER SET ZHS16GBK
15 ;
控制檔案已建立
SQLPLUS> SHUTDOWN IMMEDIATE
ORA-01109: ??????

已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQLPLUS> STARTUP MOUNT;
ORACLE 例程已經啟動。
Total System Global Area 135339940
bytes
Fixed Size 454564
bytes

Variable Size 109051904
bytes

Database Buffers 25165824
bytes

Redo Buffers 667648
bytes

資料庫裝載完畢。
SQLPLUS> RECOVER USING BACKUP CONTROLFILE UNTIL CANCEL;
ORA-00279: 更改 37650 (在 12/18/2004 15:06:24 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: E:ORACLE9IORA9IARCHIVEORA9IT001S00001.ARC
ORA-00280: 更改 37650 對於執行緒 1 是按序列 # 1 進行的

指定日誌: { =suggested | filename | AUTO | CANCEL}
CANCEL
介質恢復已取消。
SQLPLUS> ALTER DATABASE OPEN RESETLOGS;
ALTER DATABASE OPEN RESETLOGS
*
ERROR 位於第 1 行:
ORA-01092: ORACLE 例程終止。強行斷開連線
檢視日誌,發現了出現上面問題的原因:
ORA-30012: 撤消表空間 'UNDOTBS ' 不存在或型別不正確
SQLPLUS> CONNECT AS SYSDBA
已連線到空閒例程。
SQLPLUS> STARTUP MOUNT;
ORACLE 例程已經啟動。
Total System Global Area 135339940
bytes

Fixed Size 454564
bytes

Variable Size 109051904
bytes

Database Buffers 25165824
bytes

Redo Buffers 667648
bytes

資料庫裝載完畢。
SQLPLUS> ALTER SYSTEM SET UNDO_MANAGEMENT=MANUAL SCOPE=SPFILE;
系統已更改。
SQLPLUS> ALTER SYSTEM SET UNDO_TABLESPACE= ' ' SCOPE=SPFILE;
系統已更改。
SQLPLUS> SHUTDOWN IMMEDIATE
ORA-01109: 資料庫未開啟

已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQLPLUS> STARTUP MOUNT;
ORACLE 例程已經啟動。
Total System Global Area 135339940
bytes

Fixed Size 454564
bytes

Variable Size 109051904
bytes

Database Buffers 25165824
bytes

Redo Buffers 667648
bytes

資料庫裝載完畢。
SQLPLUS> ALTER DATABASE OPEN;
ALTER DATABASE OPEN
*
ERROR 位於第 1 行:
ORA-01113: 檔案 1 需要介質恢復
ORA-01110: 資料檔案 1: 'E:ORACLE9IORA9ISYSTEM01.DBF '

SQLPLUS> RECOVER DATAFILE 1;
完成介質恢復。
SQLPLUS> ALTER DATABASE OPEN;
資料庫已更改。
至此,資料庫已經開啟。檢視V$DATAFILE和V$RECOVER_FILE,如下所示:
SQLPLUS> SELECT TS#,FILE#,NAME,STATUS,CHECKPOINT_CHANGE# FROM V$DATAFILE;
TS# FILE# NAME STATUS CHECKPOINT_CHANGE#
---- ----- ---------------------------------------- ------- ------------------
0 1 E:ORACLE9IORA9ISYSTEM01.DBF SYSTEM 37658
1 2 E:ORACLE9IDATABASEMISSING00002 RECOVER 0
3 3 E:ORACLE9IDATABASEMISSING00003 RECOVER 0
4 4 E:ORACLE9IDATABASEMISSING00004 RECOVER 0
5 5 E:ORACLE9IDATABASEMISSING00005 RECOVER 0
6 6 E:ORACLE9IDATABASEMISSING00006 RECOVER 0
7 7 E:ORACLE9IDATABASEMISSING00007 RECOVER 0
8 8 E:ORACLE9IDATABASEMISSING00008 RECOVER 0
13 9 E:ORACLE9IDATABASEMISSING00009 RECOVER 0
14 10 E:ORACLE9IDATABASEMISSING00010 RECOVER 0
15 11 E:ORACLE9IDATABASEMISSING00011 RECOVER 0
TS# FILE# NAME STATUS CHECKPOINT_CHANGE#
---- ----- ---------------------------------------- ------- ------------------
16 12 E:ORACLE9IDATABASEMISSING00012 RECOVER 0
已選擇12行。
SQLPLUS> SELECT * FROM V$RECOVER_FILE;
FILE# ONLINE ONLINE_ ERROR CHANGE# TIME
----- ------- ------- -------------------- --------------- ----------
2 OFFLINE OFFLINE FILE MISSING 0
3 OFFLINE OFFLINE FILE MISSING 0
4 OFFLINE OFFLINE FILE MISSING 0
5 OFFLINE OFFLINE FILE MISSING 0
6 OFFLINE OFFLINE FILE MISSING 0
7 OFFLINE OFFLINE FILE MISSING 0
8 OFFLINE OFFLINE FILE MISSING 0
9 OFFLINE OFFLINE FILE MISSING 0
10 OFFLINE OFFLINE FILE MISSING 0
11 OFFLINE OFFLINE FILE MISSING 0
12 OFFLINE OFFLINE FILE MISSING 0
已選擇11行。
將丟失的資料檔案指定到正確的檔案上去。
SQLPLUS> ALTER DATABASE RENAME FILE 'E:ORACLE9IDATABASEMISSING00002 ' TO 'E:ORACLE9IORA9IUNDOTBS01.DBF ';
資料庫已更改。
SQLPLUS> ALTER DATABASE RENAME FILE 'E:ORACLE9IDATABASEMISSING00003 ' TO 'E:ORACLE9IORA9IDRSYS01.DBF ';
資料庫已更改。
SQLPLUS> ALTER DATABASE RENAME FILE 'E:ORACLE9IDATABASEMISSING00004 ' TO 'E:ORACLE9IORA9IINDX01.DBF ';
資料庫已更改。
SQLPLUS> ALTER DATABASE RENAME FILE 'E:ORACLE9IDATABASEMISSING00005 ' TO 'E:ORACLE9IORA9ITOOLS01.DBF ';
資料庫已更改。
SQLPLUS> ALTER DATABASE RENAME FILE 'E:ORACLE9IDATABASEMISSING00006 ' TO 'E:ORACLE9IORA9IUSERS01.DBF ';
資料庫已更改。
SQLPLUS> ALTER DATABASE RENAME FILE 'E:ORACLE9IDATABASEMISSING00007 ' TO 'E:ORACLE9IORA9IXDB01.DBF ';
資料庫已更改。
SQLPLUS> ALTER DATABASE RENAME FILE 'E:ORACLE9IDATABASEMISSING00008 ' TO 'E:ORACLE9IORA9IOEM_REPOSITORY.DBF ';
資料庫已更改。
SQLPLUS> ALTER DATABASE RENAME FILE 'E:ORACLE9IDATABASEMISSING00009 ' TO 'E:ORACLE9IORADATAGAXZTEMP.DB ';
資料庫已更改。
SQLPLUS> ALTER DATABASE RENAME FILE 'E:ORACLE9IDATABASEMISSING00010 ' TO 'E:ORACLE9IORADATAGAXZUSR.DB ';
資料庫已更改。
SQLPLUS> ALTER DATABASE RENAME FILE 'E:ORACLE9IDATABASEMISSING00011 ' TO 'E:ORACLE9IORADATAGAXZRBS.DB ';
資料庫已更改。
SQLPLUS> ALTER DATABASE RENAME FILE 'E:ORACLE9IDATABASEMISSING00012 ' TO 'E:ORACLE9IORADATAGAXZWEB.DB ';
資料庫已更改。
再次檢視V$DATAFILE和V$RECOVER_FILE:
SQLPLUS> SELECT TS#,FILE#,NAME,STATUS,CHECKPOINT_CHANGE# FROM V$DATAFILE;
TS# FILE# NAME STATUS CHECKPOINT_CHANGE#
---- ----- ---------------------------------------- ------- ------------------
0 1 E:ORACLE9IORA9ISYSTEM01.DBF SYSTEM 37660
1 2 E:ORACLE9IORA9IUNDOTBS01.DBF RECOVER 0
3 3 E:ORACLE9IORA9IDRSYS01.DBF RECOVER 0
4 4 E:ORACLE9IORA9IINDX01.DBF RECOVER 0
5 5 E:ORACLE9IORA9ITOOLS01.DBF RECOVER 0
6 6 E:ORACLE9IORA9IUSERS01.DBF RECOVER 0
7 7 E:ORACLE9IORA9IXDB01.DBF RECOVER 0
8 8 E:ORACLE9IORA9IOEM_REPOSITORY.DBF RECOVER 0
13 9 E:ORACLE9IORADATAGAXZTEMP.DB RECOVER 0
14 10 E:ORACLE9IORADATAGAXZUSR.DB RECOVER 0
15 11 E:ORACLE9IORADATAGAXZRBS.DB RECOVER 0
TS# FILE# NAME STATUS CHECKPOINT_CHANGE#
---- ----- ---------------------------------------- ------- ------------------
16 12 E:ORACLE9IORADATAGAXZWEB.DB RECOVER 0
已選擇12行。
SQLPLUS> SELECT * FROM V$RECOVER_FILE;
FILE# ONLINE ONLINE_ ERROR CHANGE# TIME
----- ------- ------- -------------------- --------------- ----------
2 OFFLINE OFFLINE UNKNOWN ERROR 37667 18-12月-04
3 OFFLINE OFFLINE UNKNOWN ERROR 37667 18-12月-04
4 OFFLINE OFFLINE UNKNOWN ERROR 37667 18-12月-04
5 OFFLINE OFFLINE UNKNOWN ERROR 37667 18-12月-04
6 OFFLINE OFFLINE UNKNOWN ERROR 37667 18-12月-04
7 OFFLINE OFFLINE UNKNOWN ERROR 37667 18-12月-04
8 OFFLINE OFFLINE UNKNOWN ERROR 37667 18-12月-04
9 OFFLINE OFFLINE UNKNOWN ERROR 37667 18-12月-04
10 OFFLINE OFFLINE UNKNOWN ERROR 37667 18-12月-04
11 OFFLINE OFFLINE UNKNOWN ERROR 37667 18-12月-04
12 OFFLINE OFFLINE UNKNOWN ERROR 37667 18-12月-04
已選擇11行。
SQLPLUS> ALTER DATABASE DATAFILE 2 ONLINE;
ALTER DATABASE DATAFILE 2 ONLINE
*
ERROR 位於第 1 行:
ORA-01190: 控制檔案或資料檔案2來自於最後一個 RESETLOGS 之前
ORA-01110: 資料檔案 2: 'E:ORACLE9IORA9IUNDOTBS01.DBF '
接下來由於V$DATAFILE中的CHECKPOINT_CHANGE#仍然大於V$RECOVER_FILE中的CHANGE#,決定用ADJUST_SCN來調整SCN.
首先需要設定_allow_resetlogs_corruption引數,否則不能成功(實驗了)
SQLPLUS> ALTER SYSTEM SET "_allow_resetlogs_corruption "=TRUE SCOPE=SPFILE;

系統已更改。k

SQLPLUS> SHUTDOWN IMMEDIATE
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQLPLUS> STARTUP MOUNT;
ORACLE 例程已經啟動。
Total System Global Area 135339940
bytes

Fixed Size 454564
bytes

Variable Size 109051904
bytes
Database Buffers 25165824
bytes

Redo Buffers 667648
bytes

資料庫裝載完畢。
SQLPLUS> ALTER DATABASE OPEN;
資料庫已更改。
SQLPLUS> ALTER SESSION SET EVENTS 'IMMEDIATE TRACE NAME ADJUST_SCN LEVEL 1 ';
會話已更改。
SQLPLUS> SHUTDOWN IMMEDIATE
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQLPLUS> STARTUP MOUNT;
ORACLE 例程已經啟動。
Total System Global Area 135339940
bytes

Fixed Size 454564
bytes

Variable Size 109051904
bytes

Database Buffers 25165824
bytes

Redo Buffers 667648
bytes

資料庫裝載完畢。
SQLPLUS> SELECT TS#,FILE#,NAME,STATUS,CHECKPOINT_CHANGE# FROM V$DATAFILE;
TS# FILE# NAME STATUS CHECKPOINT_CHANGE#
---- ----- ---------------------------------------- ------- ------------------
0 1 E:ORACLE9IORA9ISYSTEM01.DBF SYSTEM 1041478416
1 2 E:ORACLE9IORA9IUNDOTBS01.DBF OFFLINE 0
3 3 E:ORACLE9IORA9IDRSYS01.DBF OFFLINE 0
4 4 E:ORACLE9IORA9IINDX01.DBF OFFLINE 0
5 5 E:ORACLE9IORA9ITOOLS01.DBF OFFLINE 0
6 6 E:ORACLE9IORA9IUSERS01.DBF OFFLINE 0
7 7 E:ORACLE9IORA9IXDB01.DBF OFFLINE 0
8 8 E:ORACLE9IORA9IOEM_REPOSITORY.DBF OFFLINE 0
13 9 E:ORACLE9IORADATAGAXZTEMP.DB OFFLINE 0
14 10 E:ORACLE9IORADATAGAXZUSR.DB OFFLINE 0
15 11 E:ORACLE9IORADATAGAXZRBS.DB OFFLINE 0
TS# FILE# NAME STATUS CHECKPOINT_CHANGE#
---- ----- ---------------------------------------- ------- ------------------
16 12 E:ORACLE9IORADATAGAXZWEB.DB OFFLINE 0
已選擇12行。
SQLPLUS> SELECT * FROM V$RECOVER_FILE;
FILE# ONLINE ONLINE_ ERROR CHANGE# TIME
----- ------- ------- -------------------- --------------- ----------
2 OFFLINE OFFLINE WRONG FILE CREATE 37667 18-12月-04
3 OFFLINE OFFLINE WRONG FILE CREATE 37667 18-12月-04
4 OFFLINE OFFLINE WRONG FILE CREATE 37667 18-12月-04
5 OFFLINE OFFLINE WRONG FILE CREATE 37667 18-12月-04
6 OFFLINE OFFLINE WRONG FILE CREATE 37667 18-12月-04
7 OFFLINE OFFLINE WRONG FILE CREATE 37667 18-12月-04
8 OFFLINE OFFLINE WRONG FILE CREATE 37667 18-12月-04
9 OFFLINE OFFLINE WRONG FILE CREATE 37667 18-12月-04
10 OFFLINE OFFLINE WRONG FILE CREATE 37667 18-12月-04
11 OFFLINE OFFLINE WRONG FILE CREATE 37667 18-12月-04
12 OFFLINE OFFLINE WRONG FILE CREATE 37667 18-12月-04
已選擇11行。

SQLPLUS> RECOVER UNTIL CANCEL;
完成介質恢復。
上面這一步很重要,雖然不做這個操作也能開啟資料庫,但是我們是要用RESETLOGS來開啟資料庫,否則仍然將其它資料檔案聯機的時候
仍然會報ORA-01189.
然後將資料檔案狀態聯機。
SQLPLUS> ALTER DATABASE DATAFILE 2,3,4,5,6,7,8,9,10,11,12 ONLINE;
資料庫已更改。
開啟資料庫。
SQLPLUS> ALTER DATABASE OPEN RESETLOGS;
資料庫已更改。
檢視V$DATAFILE,檔案狀態已經是ONLINE了。
TS# FILE# NAME STATUS CHECKPOINT_CHANGE#
--- ----- ---------------------------------------- ------- ------------------
0 1 E:ORACLE9IORA9ISYSTEM01.DBF SYSTEM 1041478418
1 2 E:ORACLE9IORA9IUNDOTBS01.DBF ONLINE 1041478418
3 3 E:ORACLE9IORA9IDRSYS01.DBF ONLINE 1041478418
4 4 E:ORACLE9IORA9IINDX01.DBF ONLINE 1041478418
5 5 E:ORACLE9IORA9ITOOLS01.DBF ONLINE 1041478418
6 6 E:ORACLE9IORA9IUSERS01.DBF ONLINE 1041478418
7 7 E:ORACLE9IORA9IXDB01.DBF ONLINE 1041478418
8 8 E:ORACLE9IORA9IOEM_REPOSITORY.DBF ONLINE 1041478418
13 9 E:ORACLE9IORADATAGAXZTEMP.DB ONLINE 1041478418
14 10 E:ORACLE9IORADATAGAXZUSR.DB ONLINE 1041478418
15 11 E:ORACLE9IORADATAGAXZRBS.DB ONLINE 1041478418

TS# FILE# NAME STATUS CHECKPOINT_CHANGE#
--- ----- ---------------------------------------- ------- ------------------
16 12 E:ORACLE9IORADATAGAXZWEB.DB ONLINE 1041478418
至此,資料庫已經恢復了,接下來的工作就簡單了:
將臨時表空間檔案找回:
SQLPLUS> ALTER TABLESPACE TEMP ADD TEMPFILE 'E:ORACLE9iORA9ITEMP01.DBF ' REUSE;
表空間已更改。
將UNDO管理方式改成自動
SQLPLUS> ALTER SYSTEM SET UNDO_MANAGEMENT=AUTO SCOPE=SPFILE;
系統已更改。
SQLPLUS> ALTER SYSTEM SET UNDO_TABLESPACE=UNDOTBS SCOPE=SPFILE;
系統已更改。
用EXP匯出資料,重建資料庫。

總結:剛解決完的時候,有點不敢相信竟然解決了。因為這種由SYSTEM表空間造成的ORA-01189這個錯誤,我一直以為只能透過DUL來解決了。
在網上也同樣找不到真正解決的資料,一般都是解決ORA-01190的。這兩個問題的區別在於,建立控制檔案的時候如果不產生01189(用resetlogs選項)那麼建立時不用將其它的資料檔案去掉,而且開啟資料庫的時候只要設定_allow_resetlogs_corruption就可以了,另外也不用adjust_scn來修改change#。於是在自己的機器上又做了幾次實驗:
1關掉資料庫;
2備份SYSTEM表空間;
3開啟資料庫;
4切換日誌;
5關資料庫;
6替換舊的SYSTEM表空間。
模擬出了同樣的問題。然後用同樣的方法解決了。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/670493/viewspace-1029594/,如需轉載,請註明出處,否則將追究法律責任。

相關文章