ORA-01189的完整解決過程(File is from a different RESETLOGS than previous files)

lhrbest發表於2016-04-12

昨天使用者報告資料庫不能啟動了,詢問使用者,使用者也不清楚原因。在解決過程中遇到了ORA-01189的問題,查遍了網上,包括metalink,也沒有找到合適的解決方案,差點就放棄了......還好,根據ORACLE的錯誤解釋,終於摸索出了下面的解決方法。:)
ORA-01189解釋:
Cause: In a CREATE CONTROLFILE command, either this file or all previous files were backups from before the last RESETLOGS. This also may occur if this is a file that is offline and has been offline since before the last RESETLOGS.
Action: If the file was taken offline normally before the last RESETLOGS and is still offline, omit it from the CREATE CONTROLFILE command. Rename and online the file after the database is open. Otherwise, find the version of the mentioned file consistent with the rest of the datafiles and retry the command.


以下是解決過程
試圖開啟資料庫:
SQLPLUS>STARTUP
ORACLE 例程已經啟動。
Total System Global Area 135339940
bytes

Fixed Size 454564
bytes

Variable Size 109051904
bytes

Database Buffers 25165824
bytes

Redo Buffers 667648
bytes

資料庫裝載完畢。
ORA-01190: 控制檔案或資料檔案1來自於最後一個 RESETLOGS 之前
ORA-01110: 資料檔案 1: 'E:ORACLE9IORA9ISYSTEM01.DBF'

SQLPLUS>SELECT TS#,FILE#,CHECKPOINT_CHANGE# FROM V$DATAFILE;
TS# FILE# CHECKPOINT_CHANGE#
---- ----- ------------------
0 1 37667
1 2 37667
3 3 37667
4 4 37667
5 5 37667
6 6 37667
7 7 37667
8 8 37667
13 9 37667
14 10 37667
15 11 37667
TS# FILE# CHECKPOINT_CHANGE#
---- ----- ------------------
16 12 37667
已選擇12行。
SQLPLUS>SELECT * FROM V$RECOVER_FILE;
FILE# ONLINE ONLINE_ ERROR CHANGE# TIME
----- ------- ------- -------------------- --------------- ----------
1 ONLINE ONLINE UNKNOWN ERROR 37650 18-12月-04
從上面中可以看出來,V$RECOVER_FILE中檔案1的CHANGE#小於V$DATAFILE的CHECKPOINT_CHANGE#。由於沒有備份,決定重新建立控制檔案。
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 進行的

指定日誌: {<RET>=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>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/26736162/viewspace-2079650/,如需轉載,請註明出處,否則將追究法律責任。

相關文章