如果只读表空间存放在只读物理设置上,那么使用备份的控制文件恢复时可能会报错。Oracle在文章中介绍的方法除了上面一篇文章中介绍的使用ALTER DATABASE DATAFILE OFFLINE命令之外,还包括了一个选择正确的控制文件的方法,但是我发现这种方法并没有解决问题。
Oracle文档中原文如下:
You have these alternatives for recovering read-only and slow media when using a backup control file:
Take datafiles from read-only tablespaces offline before doing recovery with a backup control file, and then bring the files online at the end of media recovery.
Use the correct version of the control file for the recovery. If the tablespace will be read-only when recovery completes, then the control file must be from a time when the tablespace was read-only. Similarly, if the tablespace will be read/write at the end of recovery, then the control file must be from a time when the tablespace was read/write.
根据文档上的描述,我选择USERS表空间设置为READ ONLY之后的控制文件就可以了。
下面利用昨天的备份继续进行测试:
SQL> CONN /@TEST AS SYSDBA
已连接。
SQL> SHUTDOWN IMMEDIATE
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> HOST COPY F:ORACLEBACKUPTEST20060418CONTROL1.BAK F:ORACLEORADATATESTCONTROL01.CTL
SQL> HOST COPY F:ORACLEBACKUPTEST20060418CONTROL1.BAK F:ORACLEORADATATESTCONTROL02.CTL
SQL> HOST COPY F:ORACLEBACKUPTEST20060418CONTROL1.BAK F:ORACLEORADATATESTCONTROL03.CTL
SQL> HOST COPY F:ORACLEBACKUPTEST20060418*.DBF F:ORACLEORADATATEST
SQL> HOST COPY F:ORACLEBACKUPTEST20060418*.LOG F:ORACLEORADATATEST
SQL> STARTUP MOUNT
ORACLE 例程已经启动。
Total System Global Area 76619308 bytes
Fixed Size 454188 bytes
Variable Size 50331648 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
SQL> RECOVER DATABASE USING BACKUP CONTROLFILE;
ORA-00283: 恢复会话因错误而取消
ORA-01114: 将块写入文件 5 时出现 IO 错误 (块 # 1)
ORA-01110: 数据文件 5: 'F:ORACLEORADATATESTUSERS01.DBF'
ORA-27091: skgfqio: 无法进行 I/O 操作
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 5) 拒绝访问。
错误的出现是意料之中的,由于使用了备份的控制文件,且控制文件备份时,USERS表空间还不是只读状态,因此必然会出现错误。
按照文档上的描述,如果选择一个表空间处于READ ONLY状态时的控制文件,则可以避免上面的错误。下面用CONTROL2.BAK进行测试,这个控制文件是在设置了USERS表空间为只读后备份的:
IXDBA.NET技术社区SQL> SHUTDOWN IMMEDIATE
ORA-01109: 数据库未打开
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> HOST COPY F:ORACLEBACKUPTEST20060418CONTROL2.BAK F:ORACLEORADATATESTCONTROL01.CTL
SQL> HOST COPY F:ORACLEBACKUPTEST20060418CONTROL2.BAK F:ORACLEORADATATESTCONTROL02.CTL
SQL> HOST COPY F:ORACLEBACKUPTEST20060418CONTROL2.BAK F:ORACLEORADATATESTCONTROL03.CTL
SQL> HOST COPY F:ORACLEBACKUPTEST20060418*.DBF F:ORACLEORADATATEST
SQL> HOST COPY F:ORACLEBACKUPTEST20060418*.LOG F:ORACLEORADATATEST
SQL> STARTUP MOUNT
ORACLE 例程已经启动。
Total System Global Area 76619308 bytes
Fixed Size 454188 bytes
Variable Size 50331648 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes