一般情况下,是无法利用RESETLOGS操作之前的备份进行数据库的恢复的。但是在特定条件下利用RESETLOGS之前的备份进行恢复是可行的。
本文讨论如何利用RESETLOGS操作前的数据库备份进行数据库的恢复。
利用RESETLOGS操作之前的数据库备份的前提是:数据库的备份处于一致性状态,且在以RESETLOGS方式打开数据库之前没有进一步的恢复操作或数据文件的修改。而且,恢复时必须存在RESETLOGS操作之后的控制文件。
先看下面这个简单的例子:假设服务器调整硬件,在调整之前,对数据库的数据文件进行冷备份。
SQL> CONN /@TEST AS SYSDBA
已连接。
SQL> SHUTDOWN IMMEDIATE
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> HOST COPY F:ORACLEORADATATEST*.DBF F:ORACLEBACKUPTEST20060310
SQL> HOST COPY F:ORACLEORADATATEST*.CTL F:ORACLEBACKUPTEST20060310
由于硬件故障导致数据库的所有联机日志丢失,数据库需要使用RESETLOGS方式打开。下面模仿丢失所有文件,利用刚才备份的数据以RESETLOGS方式打开数据库。
SQL> HOST DEL F:ORACLEORADATATEST*
SQL> HOST COPY F:ORACLEBACKUPTEST20060310* 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 UNTIL CANCEL
完成介质恢复。
SQL> ALTER DATABASE OPEN RESETLOGS;
数据库已更改。
由于数据库是正常关闭,因此RECOVER DATABASE UNTIL CANCEL不会进行任何实际的恢复操作,因此,这个备份可以在RESETLOGS操作后用来恢复。
SQL> SELECT COUNT(*) FROM YANGTK.TEST_BACKUP;
COUNT(*)
----------
6290
SQL> DELETE YANGTK.TEST_BACKUP WHERE ROWNUM < 6000;
已删除5999行。
SQL> COMMIT;
提交完成。
SQL> SHUTDOWN IMMEDIATE
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> HOST COPY F:ORACLEBACKUPTEST20060310*.DBF F:ORACLEORADATATEST
SQL> STARTUP MOUNT
ORACLE 例程已经启动。
Total System Global Area 76619308 bytes
Fixed Size 454188 bytes
www.ixdba.net
Variable Size 50331648 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
SQL> RECOVER DATABASE
完成介质恢复。
SQL> ALTER DATABASE OPEN;
数据库已更改。
SQL> SELECT COUNT(*) FROM YANGTK.TEST_BACKUP;
COUNT(*)
----------
291
虽然这种方法可以用来恢复数据库,但是限制条件还是相对比较多的。在执行完RESETLOGS操作后,还是应该马上进行数据库的全备。
如果数据库是OPEN RESETLOGS前不是处于正常关闭状态下,可以利用RECOVER DATABASE操作,将数据库恢复到一致性状态,然后SHUTDOWN数据库,备份数据库后再以RESETLOGS方式打开,这样得到的备份也可以用于RESETLOGS方式之后的恢复。
SQL> CONN /@TEST AS SYSDBA
已连接。
SQL> SELECT 'ALTER TABLESPACE ' || TABLESPACE_NAME || ' BEGIN BACKUP;'
2 FROM DBA_TABLESPACES WHERE CONTENTS != 'TEMPORARY';
'ALTERTABLESPACE'||TABLESPACE_NAME||'BEGINBACKUP;'
-------------------------------------------------------------
ALTER TABLESPACE SYSTEM BEGIN BACKUP;
ALTER TABLESPACE UNDOTBS1 BEGIN BACKUP;
ALTER TABLESPACE INDX BEGIN BACKUP;
ALTER TABLESPACE TOOLS BEGIN BACKUP;
ALTER TABLESPACE USERS BEGIN BACKUP;
ALTER TABLESPACE YANGTK BEGIN BACKUP;
已选择6行。
SQL> ALTER TABLESPACE SYSTEM BEGIN BACKUP;