控制文件数据文件 备份不同时 恢复尝试
【问题与背景】
使用备份控制文件恢复,是不是一定恢复不了在线日志中的数据吗?
答案是错误的,其实也能完全恢复(当然我们用trace更好)
还原用到的主要语句
select GROUP#,SEQUENCE#,archived, STATUS from v$log;
GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
1 5 NO CURRENT
2 3 YES ACTIVE
3 4 YES ACTIVE
查看当前归档日志情况
select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
查找当前数据库重作日志文件scn号和控制文件scn号
SQL> recover database using backup controlfile until cancel; -->>这个cancel是表示每次应用一个日志时都提示一下,直到输入cancel后结束
cancel选项允许每次前滚一个日志文件,当需要停止恢复时,输入cancel
,在这种方式下不会自动运用联机日志文件.
原理:
在用备份redo日志还原到最接近控制文件scn号的时候在指定在在线日志文件进行恢复
使得在线日志文件强制应用来恢复数据文件
指定日志: {
C:\oracle\oradata\testdb\REDO01.LOG
现在开始模拟
有控制文件备份,先于控制文件备份的所有数据文件备份
使用在线日志进行完全恢复
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> create table arch (status varchar(2)) tablespace users;
表已创建。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into arch select 'ok' from dba_objects;
已创建6166行。
SQL> commit;
提交完成。
SQL> insert into arch select * from arch;
已创建6166行。
SQL> /
已创建12332行。
SQL> /
已创建24664行。
SQL> /
已创建49328行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into arch select 'no' from dba_objects;
已创建6166行。
SQL> commit;
提交完成。
SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;
GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
1 5 NO CURRENT
2 3 YES ACTIVE
3 4 YES ACTIVE
SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
68658 69410
SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
还原备份控制文件,还原所有备份数据文件
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-00314: 日志 1 (线程 1),预计序号 与 不匹配
ORA-00312: 联机日志 1 线程 1: 'C:\ORACLE\ORADATA\TESTDB\REDO01.LOG'
SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 69257 (在 02/28/2010 11:08:18 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: 更改 69257 对于线程 1 是按序列 # 3 进行的
指定日志: {
cancel
介质恢复已取消。
SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
68658 69257
SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 69257 (在 02/28/2010 11:08:18 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: 更改 69257 对于线程 1 是按序列 # 3 进行的
指定日志: {
ORA-00279: 更改 69362 (在 03/04/2010 11:21:25 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: 更改 69362 对于线程 1 是按序列 # 4 进行的
ORA-00278: 此恢复不再需要日志文件 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF'
指定日志: {
ORA-00279: 更改 69408 (在 03/04/2010 11:21:26 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69408 对于线程 1 是按序列 # 5 进行的
ORA-00278: 此恢复不再需要日志文件 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF'
指定日志: {
ORA-00308: 无法打开存档日志 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
68658 69408
~~~~~~~~~~~~~~
到此是不完全恢复
那我们是不是可以
应用在线日志呢,那
我们先应用SEQUENCE=3和4
的日志C:\oracle\oradata\testdb\REDO02.LOG
C:\oracle\oradata\testdb\REDO03.LOG
我们可以看到恢复时这个文件不需要
~~~~~~~~~~~~~~~
SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 69408 (在 03/04/2010 11:21:26 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69408 对于线程 1 是按序列 # 5 进行的
指定日志: {
C:\oracle\oradata\testdb\REDO02.LOG
ORA-00310: 存档日志包含序列 3;要求序列 5
ORA-00334: 归档日志: 'C:\ORACLE\ORADATA\TESTDB\REDO02.LOG'
SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 69408 (在 03/04/2010 11:21:26 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69408 对于线程 1 是按序列 # 5 进行的
指定日志: {
C:\oracle\oradata\testdb\REDO03.LOG
ORA-00310: 存档日志包含序列 4;要求序列 5
ORA-00334: 归档日志: 'C:\ORACLE\ORADATA\TESTDB\REDO03.LOG'
SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
68658 69408
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我们看到非活动在线日志没有被应用
我们应用SEQUENCE=5
的日志C:\oracle\oradata\testdb\REDO01.LOG
我们可以看到恢复时这个文件是需要的
~~~~~~~~~~~~~~~
SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 69408 (在 03/04/2010 11:21:26 生成) 对于线程 1 是必需的
ORA-00289: 建议: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69408 对于线程 1 是按序列 # 5 进行的
指定日志: {
C:\oracle\oradata\testdb\REDO01.LOG --这步是关键
已应用的日志。
完成介质恢复。
SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
68658 69418 --在SEQUENCE=5中的SCN被应用了
SQL> alter database open resetlogs;
数据库已更改。
SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
69418 69516
SQL> select count(*),status from arch group by status;
COUNT(*) ST
---------- --
6166 no
98656 ok
-->>完全恢复