控制文件被破坏的数据库恢复方法

这种情况一般不需要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 /@ORA9I 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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/670493/viewspace-1029594/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值