在执行恢复后,应该检查数据库的alert文件,看是否出现控制文件中的数据文件名称和数据字典中数据文件名称无法一一对应的现象。
这篇文章描述通过RESETLOGS方式打开数据库时,如果发现不一致情况及解决方法。
如果是利用备份的控制文件,除了数据文件的新增和删除以外,不会出现不一致的情况。这种不一致的情况更多的是出现在手工重建控制文件过程中。
SQL> CONN /@TEST AS SYSDBA
已连接。
SQL> ALTER TABLESPACE INDX READ ONLY;
表空间已更改。
SQL> ALTER TABLESPACE TOOLS OFFLINE;
表空间已更改。
SQL> SELECT 'ALTER TABLESPACE ' || TABLESPACE_NAME || ' BEGIN BACKUP;'
2 FROM DBA_TABLESPACES WHERE CONTENTS != 'TEMPORARY' AND STATUS = 'ONLINE';
'ALTERTABLESPACE'||TABLESPACE_NAME||'BEGINBACKUP;'
-------------------------------------------------------------
ALTER TABLESPACE SYSTEM BEGIN BACKUP;
ALTER TABLESPACE UNDOTBS1 BEGIN BACKUP;
ALTER TABLESPACE USERS BEGIN BACKUP;
ALTER TABLESPACE YANGTK BEGIN BACKUP;
SQL> ALTER TABLESPACE SYSTEM BEGIN BACKUP;
表空间已更改。
SQL> ALTER TABLESPACE UNDOTBS1 BEGIN BACKUP;
表空间已更改。
SQL> ALTER TABLESPACE USERS BEGIN BACKUP;
表空间已更改。
SQL> ALTER TABLESPACE YANGTK BEGIN BACKUP;
表空间已更改。
SQL> HOST COPY F:ORACLEORADATATEST*.DBF F:ORACLEBACKUPTEST20060307
SQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE RESETLOGS;
数据库已更改。
SQL> SELECT 'ALTER TABLESPACE ' || TABLESPACE_NAME || ' END BACKUP;'
2 FROM DBA_TABLESPACES WHERE CONTENTS != 'TEMPORARY' AND STATUS = 'ONLINE';
'ALTERTABLESPACE'||TABLESPACE_NAME||'ENDBACKUP;'
-----------------------------------------------------------
ALTER TABLESPACE SYSTEM END BACKUP;
ALTER TABLESPACE UNDOTBS1 END BACKUP;
ALTER TABLESPACE USERS END BACKUP;
ALTER TABLESPACE YANGTK END BACKUP;
SQL> ALTER TABLESPACE SYSTEM END BACKUP;
表空间已更改。
SQL> ALTER TABLESPACE UNDOTBS1 END BACKUP;
表空间已更改。
SQL> ALTER TABLESPACE USERS END BACKUP;
表空间已更改。
SQL> ALTER TABLESPACE YANGTK END BACKUP;
表空间已更改。
假设在恢复过程中,发现丢失了所有控制文件和备份的控制文件。那么需要手工重建控制文件,而这时候手工重建控制文件可能会遗漏部分数据文件。
创建控制文件的脚本应该如下:
CREATE CONTROLFILE REUSE DATABASE "TEST" RESETLOGSARCHIVELOG
MAXLOGFILES 50
MAXLOGMEMBERS 5
MAXDATAFILES 100
MAXINSTANCES 1
MAXLOGHISTORY 680
LOGFILE
GROUP 1 'F:ORACLEORADATATESTREDO01.LOG'SIZE 100M,
GROUP 2 'F:ORACLEORADATATESTREDO02.LOG'SIZE 100M,
GROUP 3 'F:ORACLEORADATATESTREDO03.LOG'SIZE 100M
DATAFILE
'F:ORACLEORADATATESTSYSTEM01.DBF',
'F:ORACLEORADATATESTUNDOTBS01.DBF',
'F:ORACLEORADATATESTUSERS01.DBF',
'F:ORACLEORADATATESTYANGTK01.DBF'
CHARACTER SET ZHS16GBK
;
但是由于没有将脚本保存到trace文件中,而完全通过手工创建。因此,在创建的时候丢失了USERS01.DBF。
SQL> SHUTDOWN IMMEDIATE
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> HOST DEL F:ORACLEORADATATEST*.CTL
SQL> HOST COPY F:ORACLEBACKUPTEST20060307* F:ORACLEORADATATEST
SQL> STARTUP NOMOUNT
ORACLE 例程已经启动。
Total System Global Area 76619308 bytes
Fixed Size 454188 bytes
Variable Size 50331648 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "TEST" RESETLOGS ARCHIVELOG
2 MAXLOGFILES 50
3 MAXLOGMEMBERS 5
4 MAXDATAFILES 100
5 MAXINSTANCES 1
6 MAXLOGHISTORY 680
7 LOGFILE
8 GROUP 1 'F:ORACLEORADATATESTREDO01.LOG' SIZE 100M,
9 GROUP 2 'F:ORACLEORADATATESTREDO02.LOG' SIZE 100M,
10 GROUP 3 'F:ORACLEORADATATESTREDO03.LOG' SIZE 100M
11 DATAFILE
12 'F:ORACLEORADATATESTSYSTEM01.DBF',
13 'F:ORACLEORADATATESTUNDOTBS01.DBF',
14 'F:ORACLEORADATATESTYANGTK01.DBF'
15 CHARACTER SET ZHS16GBK
16 ;
控制文件已创建
SQL> RECOVER DATABASE USING BACKUP CONTROLFILE
ORA-00279: ?? 46320665 (? 03/08/2006 02:49:29 ??) ???? 1 ????
ORA-00289: ??: F:ORACLEORADATATESTARCHIVEARC00001.001
ORA-00280: ?? 46320665 ???? 1 ???? # 1 ???
指定日志: {=suggested | filename | AUTO | CANCEL}
F:ORACLEORADATATESTREDO03.LOG
已应用的日志。
完成介质恢复。
SQL> ALTER DATABASE OPEN RESETLOGS;
数据库已更改。
SQL> SELECT NAME FROM V$DATAFILE;
NAME
----------------------------------------------
F:ORACLEORADATATESTSYSTEM01.DBF
F:ORACLEORADATATESTUNDOTBS01.DBF
F:ORACLEORACLE920DATABASEMISSING00003
F:ORACLEORACLE920DATABASEMISSING00004
F:ORACLEORACLE920DATABASEMISSING00005
F:ORACLEORADATATESTYANGTK01.DBF
已选择6行。
SQL> COL FILE_NAME FORMAT A50
SQL> SELECT FILE_NAME, TABLESPACE_NAME FROM DBA_DATA_FILES;
FILE_NAME TABLESPACE_NAME
-------------------------------------------------- -------------------
F:ORACLEORADATATESTSYSTEM01.DBF SYSTEM
F:ORACLEORADATATESTUNDOTBS01.DBF UNDOTBS1
F:ORACLEORACLE920DATABASEMISSING00003 INDX
F:ORACLEORACLE920DATABASEMISSING00004 TOOLS
F:ORACLEORACLE920DATABASEMISSING00005 USERS
F:ORACLEORADATATESTYANGTK01.DBF YANGTK
已选择6行。
从上面的数据字典可以看到,存在不正常的表空间和数据文件。也可以从alert日志中得到相应的信息。
Dictionary check beginning
Tablespace 'TEMP' #2 found in data dictionary,
but not in the controlfile. Adding to controlfile.
Tablespace 'INDX' #3 found in data dictionary,
but not in the controlfile. Adding to controlfile.
Tablespace 'TOOLS' #4 found in data dictionary,
but not in the controlfile. Adding to controlfile.
Tablespace 'USERS' #5 found in data dictionary,
but not in the controlfile. Adding to controlfile.
File #3 found in data dictionary but not in controlfile.
Creating OFFLINE file 'MISSING00003' in the controlfile.
File #4 found in data dictionary but not in controlfile.
Creating OFFLINE file 'MISSING00004' in the controlfile.
File #5 found in data dictionary but not in controlfile.
Creating OFFLINE file 'MISSING00005' in the controlfile.
This file can no longer be recovered so it must be dropped.
Dictionary check complete
由于TOOLS表空间在备份之前就正常脱机了。因此,TOOLS表空间不需要额外的恢复,将数据文件直接RENAME就可以了。
SQL> ALTER DATABASE RENAME FILE 'F:ORACLEORACLE920DATABASEMISSING00004'
2 TO 'F:ORACLEORADATATESTTOOLS01.DBF';
数据库已更改。
INDX表空间在备份之前就处于只读状态,因此不需要进行恢复,RENAME后ONLINE就可以了。
SQL> ALTER DATABASE RENAME FILE 'F:ORACLEORACLE920DATABASEMISSING00003'
2 TO 'F:ORACLEORADATATESTINDX01.DBF';
数据库已更改。
SQL> ALTER TABLESPACE INDX ONLINE;
表空间已更改。
SQL> SELECT STATUS FROM DBA_TABLESPACES WHERE TABLESPACE_NAME = 'INDX';
STATUS
---------
READ ONLY
对于临时表空间,直接增加临时文件就可以了。
SQL> ALTER TABLESPACE TEMP ADD TEMPFILE 'F:ORACLEORADATATESTTEMP01.DBF' SIZE 40M REUSE;
表空间已更改。
但是,对于表空间USERS,由于没有被添加到控制文件中,且数据库以RESETLOGS方式打开,用来恢复表空间的日志已经被重置,因此只能将表空间删除。
SQL> ALTER DATABASE RENAME FILE 'F:ORACLEORACLE920DATABASEMISSING00005'
2 TO 'F:ORACLEORADATATESTUSERS01.DBF';
数据库已更改。
SQL> ALTER TABLESPACE USERS ONLINE;
ALTER TABLESPACE USERS ONLINE
*
ERROR 位于第 1 行:
ORA-01190: ?????????5??????? RESETLOGS ??
ORA-01110: ???? 5: 'F:ORACLEORADATATESTUSERS01.DBF'
SQL> RECOVER TABLESPACE USERS;
ORA-00283: ??????????
ORA-01190: ?????????5??????? RESETLOGS ??
ORA-01110: ???? 5: 'F:ORACLEORADATATESTUSERS01.DBF'
SQL> DROP TABLESPACE USERS INCLUDING CONTENTS AND DATAFILES;
表空间已丢弃。
一旦重建控制文件中没有包含需要恢复的表空间,且以RESETLOGS方式打开了数据库,则被遗漏的表空间无法在正常联机,只能从数据库中删除。因此,控制文件的备份和重建操作一定要谨慎。