WINDOWS下的程序员出身,偶尔也写一些linux平台下小程序, 后转行数据库行业,专注于ORACLE和DB2的运维和优化。 同时也是ios移动开发者。欢迎志同道合的朋友一起研究技术。 数据库技术交流群:58308065,23618606
全部博文(599)
分类:
2010-01-15 17:36:44
作者:yangtingkun
在执行恢复后,应该检查数据库的alert文件,看是否出现控制文件中的数据文件名称和数据字典中数据文件名称无法一一对应的现象。
这篇文章描述通过NORESETLOGS方式重建控制文件并打开数据库后,如果发现不一致情况及解决方法。
如果是利用备份的控制文件,除了数据文件的新增和删除以外,不会出现不一致的情况。这种不一致的情况更多的是出现在手工重建控制文件过程中。
SQL> CONN /@TEST AS SYSDBA
已连接。
SQL> ALTER TABLESPACE INDX READ ONLY;
表空间已更改。
SQL> ALTER TABLESPACE TOOLS OFFLINE;
表空间已更改。
SQL> CREATE TABLESPACE TEST DATAFILE 'F:ORACLEORADATATESTTEST01.DBF' SIZE 10M;
表空间已创建。
SQL> SELECT 'ALTER TABLESPACE ' || TABLESPACE_NAME || ' BEGIN BACKUP;'
2 FROM USER_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;
ALTER TABLESPACE TEST 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> ALTER TABLESPACE TEST BEGIN BACKUP;
表空间已更改。
SQL> HOST COPY F:ORACLEORADATATEST*.DBF F:ORACLEBACKUPTEST20060308
SQL> SELECT 'ALTER TABLESPACE ' || TABLESPACE_NAME || ' END BACKUP;'
2 FROM USER_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;
ALTER TABLESPACE TEST 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;
表空间已更改。
SQL> ALTER TABLESPACE TEST END BACKUP;
表空间已更改。
SQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE;
数据库已更改。
假设在恢复过程中,发现丢失了所有控制文件和备份的控制文件。那么需要手工重建控制文件,而这时候手工重建控制文件可能会遗漏部分数据文件。
创建控制文件的脚本应该如下:
CREATE CONTROLFILE REUSE DATABASE "TEST" NORESETLOGS ARCHIVELOG
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',
'F:ORACLEORADATATESTTEST01.DBF'
CHARACTER SET ZHS16GBK
;
假设由于没有将脚本保存到trace文件中,而完全通过手工创建,在创建的时候丢失了USERS01.DBF。另外在恢复操作执行之前,从数据库中删除TEST表空间,模拟在控制文件中包含数据文件但在数据字典中不包含的情况。
SQL> DROP TABLESPACE TEST INCLUDING CONTENTS AND DATAFILES;
表空间已丢弃。
SQL> SHUTDOWN IMMEDIATE
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> HOST DEL F:ORACLEORADATATEST*.CTL
SQL> HOST COPY F:ORACLEBACKUPTEST20060308* 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" NORESETLOGS 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 'F:ORACLEORADATATESTTEST01.DBF'
16 CHARACTER SET ZHS16GBK
17 ;
控制文件已创建
SQL> RECOVER DATABASE
完成介质恢复。
SQL> ALTER SYSTEM ARCHIVE LOG ALL;
系统已更改。
检查alert日志文件,会发现下面的信息:
Recovery deleting file #7:'F:ORACLEORADATATESTTEST01.DBF'
Recovery dropped tablespace 'TEST'
Media Recovery Complete
Completed: ALTER DATABASE RECOVER DATABASE
这说明Oracle已经通过重做日志的方式删除了TEST表空间。
SQL> ALTER DATABASE OPEN;
数据库已更改。
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.
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'
2 SIZE 41943040 REUSE AUTOEXTEND OFF;
表空间已更改。
但是,对于表空间USERS,由于没有被添加到控制文件中,因此,在恢复过程中处于脱机状态,将数据文件修改名称后无法直接联机该数据文件,必须对表空间进行恢复。
SQL> ALTER DATABASE RENAME FILE 'F:ORACLEORACLE920DATABASEMISSING00005'
2 TO 'F:ORACLEORADATATESTUSERS01.DBF';
数据库已更改。
SQL> ALTER TABLESPACE USERS ONLINE;
ALTER TABLESPACE USERS ONLINE
*
ERROR 位于第 1 行:
ORA-01113: ?? 5 ??????
ORA-01110: ???? 5: 'F:ORACLEORADATATESTUSERS01.DBF'
SQL> RECOVER TABLESPACE USERS;
完成介质恢复。
SQL> ALTER TABLESPACE USERS ONLINE;
表空间已更改。
如果采用NORESETLOGS方式打开数据库,则只有恢复数据库的日志文件不丢失,在重建控制文件时遗漏的数据文件还是可以正常恢复的。