我直接把测试结果记录下来了。
SQL> alter system switch logfile;
系统已更改。
热备份脚本如下:
alter tablespace system begin backup;
host copy E:\ORACLE\ORASJH\SYSTEM01.DBF E:\oracle\hotbak\SYSTEM01.DBF
alter tablespace system end backup;
alter tablespace undotbs1 begin backup;
host copy E:\ORACLE\ORASJH\UNDOTBS01.DBF E:\oracle\hotbak\UNDOTBS01.DBF
alter tablespace undotbs1 end backup;
alter tablespace sysaux begin backup;
host copy E:\ORACLE\ORASJH\SYSAUX01.DBF E:\oracle\hotbak\SYSAUX01.DBF
alter tablespace sysaux end backup;
alter tablespace users begin backup;
host copy E:\ORACLE\ORASJH\USERS01.DBF E:\oracle\hotbak\USERS01.DBF
alter tablespace users end backup;
alter tablespace sjh begin backup;
host copy E:\ORACLE\ORASJH\SJH.DBF E:\oracle\hotbak\SJH.DBF
alter tablespace sjh end backup;
SQL> @E:\oracle\hot_scripts\hot_data_bak.sql --执行热备份
表空间已更改。
已复制 1 个文件。
表空间已更改。
表空间已更改。
已复制 1 个文件。
表空间已更改。
表空间已更改。
已复制 1 个文件。
表空间已更改。
表空间已更改。
已复制 1 个文件。
表空间已更改。
表空间已更改。
已复制 1 个文件。
表空间已更改。
SQL>
SQL> select * from sjh.test;
ID
----------
10
SQL> insert into sjh.test values(12);
已创建 1 行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into sjh.test values(16);
已创建 1 行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into sjh.test values(18);
已创建 1 行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。
SQL>
--以上插入几条记录,让DML操作对应的日志在不同的归档。
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
--以下开始执行恢复。
首先删除现有的数据文件,然后从E:\oracle\hotbak\下将热备的数据文件copy到原数据文件所在的目录。
当前的日志文件和控制文件保持不变。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 167772160 bytes
Fixed Size 1247876 bytes
Variable Size 71304572 bytes
Database Buffers 88080384 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
ORA-01113: 文件 1 需要介质恢复
ORA-01110: 数据文件 1: 'E:\ORACLE\ORASJH\SYSTEM01.DBF'
SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 452576 (在 03/11/2009 17:19:24 生成) 对于线程 1 是必需的
ORA-00289: 建议: E:\ORACLE\ORASJH\ARCHIVE\ARC00007_0681149880.001
ORA-00280: 更改 452576 (用于线程 1) 在序列 #7 中
指定日志: {=suggested | filename | AUTO | CANCEL}
ORA-00279: 更改 452698 (在 03/11/2009 17:21:55 生成) 对于线程 1 是必需的
ORA-00289: 建议: E:\ORACLE\ORASJH\ARCHIVE\ARC00008_0681149880.001
ORA-00280: 更改 452698 (用于线程 1) 在序列 #8 中
ORA-00278: 此恢复不再需要日志文件
'E:\ORACLE\ORASJH\ARCHIVE\ARC00007_0681149880.001'
指定日志: {=suggested | filename | AUTO | CANCEL}
cancel
介质恢复已取消。 --应用一个归档。
SQL> alter database open read only;
SQL> select * from sjh.test;
ID
----------
10
12
SQL> insert into sjh.test values(20);
insert into sjh.test values(20)
*
第 1 行出现错误:
ORA-01552: 非系统表空间 'USERS' 不能使用系统回退段
--test表的只恢复了一部分,目前数据库只能读。
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 167772160 bytes
Fixed Size 1247876 bytes
Variable Size 71304572 bytes
Database Buffers 88080384 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 452698 (在 03/11/2009 17:21:55 生成) 对于线程 1 是必需的
ORA-00289: 建议: E:\ORACLE\ORASJH\ARCHIVE\ARC00008_0681149880.001
ORA-00280: 更改 452698 (用于线程 1) 在序列 #8 中
指定日志: {=suggested | filename | AUTO | CANCEL}
ORA-00279: 更改 452757 (在 03/11/2009 17:22:50 生成) 对于线程 1 是必需的
ORA-00289: 建议: E:\ORACLE\ORASJH\ARCHIVE\ARC00009_0681149880.001
ORA-00280: 更改 452757 (用于线程 1) 在序列 #9 中
ORA-00278: 此恢复不再需要日志文件
'E:\ORACLE\ORASJH\ARCHIVE\ARC00008_0681149880.001'
指定日志: {=suggested | filename | AUTO | CANCEL}
cancel
介质恢复已取消。 --应用第二个归档。
SQL> alter database open read only;
数据库已更改。
--还剩最后一个归档没有使用。
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 167772160 bytes
Fixed Size 1247876 bytes
Variable Size 71304572 bytes
Database Buffers 88080384 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 452757 (在 03/11/2009 17:22:50 生成) 对于线程 1 是必需的
ORA-00289: 建议: E:\ORACLE\ORASJH\ARCHIVE\ARC00009_0681149880.001
ORA-00280: 更改 452757 (用于线程 1) 在序列 #9 中
指定日志: {=suggested | filename | AUTO | CANCEL}
ORA-00279: 更改 452770 (在 03/11/2009 17:23:14 生成) 对于线程 1 是必需的
ORA-00289: 建议: E:\ORACLE\ORASJH\ARCHIVE\ARC00010_0681149880.001
ORA-00280: 更改 452770 (用于线程 1) 在序列 #10 中
ORA-00278: 此恢复不再需要日志文件
'E:\ORACLE\ORASJH\ARCHIVE\ARC00009_0681149880.001'
指定日志: {=suggested | filename | AUTO | CANCEL}
E:\oracle\orasjh\REDO01.LOG
ORA-00310: 归档日志包含序列 8; 要求序列 10
ORA-00334: 归档日志: 'E:\ORACLE\ORASJH\REDO01.LOG'
SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 452770 (在 03/11/2009 17:23:14 生成) 对于线程 1 是必需的
ORA-00289: 建议: E:\ORACLE\ORASJH\ARCHIVE\ARC00010_0681149880.001
ORA-00280: 更改 452770 (用于线程 1) 在序列 #10 中
指定日志: {=suggested | filename | AUTO | CANCEL}
E:\oracle\orasjh\REDO02.LOG
ORA-00310: 归档日志包含序列 9; 要求序列 10
ORA-00334: 归档日志: 'E:\ORACLE\ORASJH\REDO02.LOG'
SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 452770 (在 03/11/2009 17:23:14 生成) 对于线程 1 是必需的
ORA-00289: 建议: E:\ORACLE\ORASJH\ARCHIVE\ARC00010_0681149880.001
ORA-00280: 更改 452770 (用于线程 1) 在序列 #10 中
指定日志: {=suggested | filename | AUTO | CANCEL}
E:\oracle\orasjh\REDO03.LOG
已应用的日志。
完成介质恢复。 --应用重做日志。
SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项
SQL> alter database open resetlogs;
数据库已更改。
SQL> select * from sjh.test;
ID
----------
10
12
16
18
--表的数据都恢复出来了。
--这个实验的关键点在于,既然是用了当前的控制文件,为什么要using backup controlfile?这样本来可以完全恢复的,造成后来只能用resetlogs打开。原因就在于能保证数据库能以read only打开。使用backup controlfile选项恢复数据库使oracle在recover时认为控制文件是旧的,这样recover就会更新控制文件中的所有datafile的检查点SCN记录,只有这样,才能保证alter database open read only前,数据库中每个数据文件头部记录的检查点SCN和controlfile中记录的是一致的,只有这样才能够以read only打开数据库,否则,oracle会认为数据库不一致,不允许read only打开。
阅读(821) | 评论(0) | 转发(0) |