控制文件出现问题,我使用一个较老的控制文件(中间改变过一个数据文件的大小)恢复并执行
ALTER DATABASE BACKUP CONTROLFILE TO TRACE
使用TRACE中的CREATE CONTROLFILE....重建了控制文件然后使用
RECOVER DATABASE USING BACKUP CONTROLFILE
数据库提示要使用第一个归档日志,但是这个日志我早就删除了,数据库还能有救么?通常大家不会一直保留所有归档日志,而它要第一个归档日志才能恢复是不是没有意义?
ALTER DATABASE BACKUP CONTROLFILE TO TRACE
使用TRACE中的CREATE CONTROLFILE....重建了控制文件然后使用
RECOVER DATABASE USING BACKUP CONTROLFILE
数据库提示要使用第一个归档日志,但是这个日志我早就删除了,数据库还能有救么?通常大家不会一直保留所有归档日志,而它要第一个归档日志才能恢复是不是没有意义?
解决方案 »
- ORA-00205: error in identifying control file, check alert log for more info
- minus怎样保留重复记录?
- 问一个非技术方面的问题,现在很混乱,请帮我看看吧。
- 这几天处于弱智期,查询语句想不出来了
- 字符串做主键,效率相比数字会低多少呢?
- 关于ORACLE时间函数
- 帮我看下这句关于日期查询的SQL语句怎么改~~本人菜菜
- 问一个sql语句,请大家进来!
- to_date問題
- 急救 出现1113错误 提示文件8需要媒体恢复
- SQL语句中视图使用CASE WHEN 就不能用DBLINK 来插入远程表了吗???急急急
- 请教ORACLE的实时同步复制技术。高手进来看一下,多谢先。(分数不多,呵)
转摘:
重新创建控制文件。
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:\ORACLE9I\ORA9I\REDO01.LOG' SIZE 5M,
10 GROUP 2 'E:\ORACLE9I\ORA9I\REDO02.LOG' SIZE 5M
11 -- STANDBY LOGFILE
12 DATAFILE
13 'E:\ORACLE9I\ORA9I\SYSTEM01.DBF',
14 'E:\ORACLE9I\ORA9I\UNDOTBS01.DBF',
15 'E:\ORACLE9I\ORA9I\DRSYS01.DBF',
16 'E:\ORACLE9I\ORA9I\INDX01.DBF',
17 'E:\ORACLE9I\ORA9I\TOOLS01.DBF',
18 'E:\ORACLE9I\ORA9I\USERS01.DBF',
19 'E:\ORACLE9I\ORA9I\XDB01.DBF',
20 'E:\ORACLE9I\ORA9I\OEM_REPOSITORY.DBF',
21 'E:\ORACLE9I\ORADATA\GAXZTEMP.DB',
22 'E:\ORACLE9I\ORADATA\GAXZUSR.DB',
23 'E:\ORACLE9I\ORADATA\GAXZRBS.DB',
24 'E:\ORACLE9I\ORADATA\GAXZWEB.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:\ORACLE9I\ORA9I\UNDOTBS01.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:\ORACLE9I\ORA9I\REDO01.LOG' SIZE 5M,
10 GROUP 2 'E:\ORACLE9I\ORA9I\REDO02.LOG' SIZE 5M
11 -- STANDBY LOGFILE
12 DATAFILE
13 'E:\ORACLE9I\ORA9I\SYSTEM01.DBF'
14 CHARACTER SET ZHS16GBK
15 ;
控制文件已创建
SQLPLUS>SHUTDOWN IMMEDIATE
ORA-01109: ??????已经卸载数据库。
ORACLE 例程已经关闭。
SQLPLUS>STARTUP MOUNT;
ORACLE 例程已经启动。
Total System Global Area 135339940
bytes
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:\ORACLE9I\ORA9I\ARCHIVE\ORA9IT001S00001.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 /@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:\ORACLE9I\ORA9I\SYSTEM01.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:\ORACLE9I\ORA9I\SYSTEM01.DBF SYSTEM 37658
1 2 E:\ORACLE9I\DATABASE\MISSING00002 RECOVER 0
3 3 E:\ORACLE9I\DATABASE\MISSING00003 RECOVER 0
4 4 E:\ORACLE9I\DATABASE\MISSING00004 RECOVER 0
5 5 E:\ORACLE9I\DATABASE\MISSING00005 RECOVER 0
6 6 E:\ORACLE9I\DATABASE\MISSING00006 RECOVER 0
7 7 E:\ORACLE9I\DATABASE\MISSING00007 RECOVER 0
8 8 E:\ORACLE9I\DATABASE\MISSING00008 RECOVER 0
13 9 E:\ORACLE9I\DATABASE\MISSING00009 RECOVER 0
14 10 E:\ORACLE9I\DATABASE\MISSING00010 RECOVER 0
15 11 E:\ORACLE9I\DATABASE\MISSING00011 RECOVER 0
TS# FILE# NAME STATUS CHECKPOINT_CHANGE#
---- ----- ---------------------------------------- ------- ------------------
16 12 E:\ORACLE9I\DATABASE\MISSING00012 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:\ORACLE9I\DATABASE\MISSING00002' TO 'E:\ORACLE9I\ORA9I\UNDOTBS01.DBF';
数据库已更改。
SQLPLUS>ALTER DATABASE RENAME FILE 'E:\ORACLE9I\DATABASE\MISSING00003' TO 'E:\ORACLE9I\ORA9I\DRSYS01.DBF';
数据库已更改。
SQLPLUS>ALTER DATABASE RENAME FILE 'E:\ORACLE9I\DATABASE\MISSING00004' TO 'E:\ORACLE9I\ORA9I\INDX01.DBF';
数据库已更改。
SQLPLUS>ALTER DATABASE RENAME FILE 'E:\ORACLE9I\DATABASE\MISSING00005' TO 'E:\ORACLE9I\ORA9I\TOOLS01.DBF';
数据库已更改。
SQLPLUS>ALTER DATABASE RENAME FILE 'E:\ORACLE9I\DATABASE\MISSING00006' TO 'E:\ORACLE9I\ORA9I\USERS01.DBF';
数据库已更改。
SQLPLUS>ALTER DATABASE RENAME FILE 'E:\ORACLE9I\DATABASE\MISSING00007' TO 'E:\ORACLE9I\ORA9I\XDB01.DBF';
数据库已更改。
SQLPLUS>ALTER DATABASE RENAME FILE 'E:\ORACLE9I\DATABASE\MISSING00008' TO 'E:\ORACLE9I\ORA9I\OEM_REPOSITORY.DBF';
数据库已更改。
SQLPLUS>ALTER DATABASE RENAME FILE 'E:\ORACLE9I\DATABASE\MISSING00009' TO 'E:\ORACLE9I\ORADATA\GAXZTEMP.DB';
数据库已更改。
SQLPLUS>ALTER DATABASE RENAME FILE 'E:\ORACLE9I\DATABASE\MISSING00010' TO 'E:\ORACLE9I\ORADATA\GAXZUSR.DB';
数据库已更改。
SQLPLUS>ALTER DATABASE RENAME FILE 'E:\ORACLE9I\DATABASE\MISSING00011' TO 'E:\ORACLE9I\ORADATA\GAXZRBS.DB';
数据库已更改。
SQLPLUS>ALTER DATABASE RENAME FILE 'E:\ORACLE9I\DATABASE\MISSING00012' TO 'E:\ORACLE9I\ORADATA\GAXZWEB.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:\ORACLE9I\ORA9I\SYSTEM01.DBF SYSTEM 37660
1 2 E:\ORACLE9I\ORA9I\UNDOTBS01.DBF RECOVER 0
3 3 E:\ORACLE9I\ORA9I\DRSYS01.DBF RECOVER 0
4 4 E:\ORACLE9I\ORA9I\INDX01.DBF RECOVER 0
5 5 E:\ORACLE9I\ORA9I\TOOLS01.DBF RECOVER 0
6 6 E:\ORACLE9I\ORA9I\USERS01.DBF RECOVER 0
7 7 E:\ORACLE9I\ORA9I\XDB01.DBF RECOVER 0
8 8 E:\ORACLE9I\ORA9I\OEM_REPOSITORY.DBF RECOVER 0
13 9 E:\ORACLE9I\ORADATA\GAXZTEMP.DB RECOVER 0
14 10 E:\ORACLE9I\ORADATA\GAXZUSR.DB RECOVER 0
15 11 E:\ORACLE9I\ORADATA\GAXZRBS.DB RECOVER 0
TS# FILE# NAME STATUS CHECKPOINT_CHANGE#
---- ----- ---------------------------------------- ------- ------------------
16 12 E:\ORACLE9I\ORADATA\GAXZWEB.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:\ORACLE9I\ORA9I\UNDOTBS01.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;系统已更改。kSQLPLUS>SHUTDOWN IMMEDIATE
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQLPLUS>STARTUP MOUNT;
ORACLE 例程已经启动。
Total System Global Area 135339940
bytes Fixed Size 454564
bytes Variable Size 109051904
bytes
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:\ORACLE9I\ORA9I\SYSTEM01.DBF SYSTEM 1041478416
1 2 E:\ORACLE9I\ORA9I\UNDOTBS01.DBF OFFLINE 0
3 3 E:\ORACLE9I\ORA9I\DRSYS01.DBF OFFLINE 0
4 4 E:\ORACLE9I\ORA9I\INDX01.DBF OFFLINE 0
5 5 E:\ORACLE9I\ORA9I\TOOLS01.DBF OFFLINE 0
6 6 E:\ORACLE9I\ORA9I\USERS01.DBF OFFLINE 0
7 7 E:\ORACLE9I\ORA9I\XDB01.DBF OFFLINE 0
8 8 E:\ORACLE9I\ORA9I\OEM_REPOSITORY.DBF OFFLINE 0
13 9 E:\ORACLE9I\ORADATA\GAXZTEMP.DB OFFLINE 0
14 10 E:\ORACLE9I\ORADATA\GAXZUSR.DB OFFLINE 0
15 11 E:\ORACLE9I\ORADATA\GAXZRBS.DB OFFLINE 0
TS# FILE# NAME STATUS CHECKPOINT_CHANGE#
---- ----- ---------------------------------------- ------- ------------------
16 12 E:\ORACLE9I\ORADATA\GAXZWEB.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:\ORACLE9I\ORA9I\SYSTEM01.DBF SYSTEM 1041478418
1 2 E:\ORACLE9I\ORA9I\UNDOTBS01.DBF ONLINE 1041478418
3 3 E:\ORACLE9I\ORA9I\DRSYS01.DBF ONLINE 1041478418
4 4 E:\ORACLE9I\ORA9I\INDX01.DBF ONLINE 1041478418
5 5 E:\ORACLE9I\ORA9I\TOOLS01.DBF ONLINE 1041478418
6 6 E:\ORACLE9I\ORA9I\USERS01.DBF ONLINE 1041478418
7 7 E:\ORACLE9I\ORA9I\XDB01.DBF ONLINE 1041478418
8 8 E:\ORACLE9I\ORA9I\OEM_REPOSITORY.DBF ONLINE 1041478418
13 9 E:\ORACLE9I\ORADATA\GAXZTEMP.DB ONLINE 1041478418
14 10 E:\ORACLE9I\ORADATA\GAXZUSR.DB ONLINE 1041478418
15 11 E:\ORACLE9I\ORADATA\GAXZRBS.DB ONLINE 1041478418TS# FILE# NAME STATUS CHECKPOINT_CHANGE#
--- ----- ---------------------------------------- ------- ------------------
16 12 E:\ORACLE9I\ORADATA\GAXZWEB.DB ONLINE 1041478418
至此,数据库已经恢复了,接下来的工作就简单了:
将临时表空间文件找回:
SQLPLUS>ALTER TABLESPACE TEMP ADD TEMPFILE 'E:\ORACLE9i\ORA9I\TEMP01.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表空间。
模拟出了同样的问题。然后用同样的方法解决了
SQL> recover database using backup controlfile;
ORA-00279: change 504360 generated at 01/15/2007 13:47:09 needed for thread 1
ORA-00289: suggestion : /home/oracle/arch/1_1_611934427.dbf
ORA-00280: change 504360 for thread 1 is in sequence #1
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
Media recovery cancelled.
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01113: file 1 needs media recovery
ORA-01110: data file 1: '/opt/oracle/oradata/orcl/system01.dbf'
需要恢复都要recocver