有了数据库的热备份之后,就可以通过这个热备进行恢复来挽救用户数据,但是热备份的应用还远远不止于此,你可以通过热备应用归档的恢复来辅助进行数据库迁移。
很多时候你可能遇到这样的情况:一个大型数据库在同版本、同平台、异地异机的迁移,但是只有很少的停机时间,这看起来充满困难,但可以通过各种方法来缩短停机时间。
在此情况下,可以通过一个热备份,应用归档恢复数据库到一个一致的状态,此时数据库可以被只读(read only)打开。之后可以继续应用归档进行恢复,最后只需要短时停机,复制原数据库中的在线日志及归档日志、控制文件到新库中,进行恢复,此时只需要极短时间即可完成恢复(这种方法仅能在同平台的迁移过程中使用)。
此方法可以极大缩短系统的割接时间。以下是一个示范步骤,以供参考。
(1) 确定源数据库信息。
查询源数据库归档情况,确认归档日志:
SQL> select name from v$archived_log;
NAME
--------------------------------------------------------------------------------
E:\ORACLE\ORADATA\EYGLE\ARCHIVE\ARC00001.001
E:\ORACLE\ORADATA\EYGLE\ARCHIVE\ARC00002.001
E:\ORACLE\ORADATA\EYGLE\ARCHIVE\ARC00003.001
E:\ORACLE\ORADATA\EYGLE\ARCHIVE\ARC00004.001
………
已选择15行。
归档当前日志:
SQL> alter system switch logfile;
系统已更改。
(2) 备份数据库
对源数据库进行热备,以下是简单的参考脚本:
alter tablespace system begin backup;
host copy E:\ORACLE\ORADATA\EYGLE\SYSTEM01.DBF e:\oracle\orabak\SYSTEM01.DBF
alter tablespace system end backup;
alter tablespace undotbs1 begin backup;
host copy E:\ORACLE\ORADATA\EYGLE\UNDOTBS01.DBF e:\oracle\orabak\UNDOTBS01.DBF
alter tablespace undotbs1 end backup;
alter tablespace eygle begin backup;
host copy E:\ORACLE\ORADATA\EYGLE\EYGLE01.DBF e:\oracle\orabak\EYGLE01.DBF
alter tablespace eygle end backup;
执行备份:
SQL> @e:\a.sql
表空间已更改。
已复制 1 个文件。
表空间已更改。
表空间已更改。
已复制 1 个文件。
表空间已更改。
表空间已更改。
已复制 1 个文件。
表空间已更改。
数据库已更改。
(3) 更改数据并归档部分日志。
为了测试目的,再修改部分数据,并继续归档,数据库服务继续对外提供:
SQL> insert into eygle.test select *from eygle.test;
已创建224行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into eygle.test select *from eygle.test;
已创建448行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into eygle.test select *from eygle.test;
已创建896行。
SQL> commit;
提交完成。
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
(4) 执行恢复。
在迁移过程中,可以将备份文件传输到目标主机,在目标主机恢复备份的数据文件,启动数据库:
SQL> startup mount;
ORACLE 例程已经启动。
数据库装载完毕。
可以使用备份的控制文件执行恢复:
SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 197282 (在 11/13/2004 23:30:48 生成) 对于线程 1 是必需的
ORA-00289: 建议: E:\ORACLE\ORADATA\EYGLE\ARCHIVE\ARC00008.001
ORA-00280: 更改 197282 对于线程 1 是按序列 # 8 进行的
指定日志: {=suggested | filename | AUTO | CANCEL}
ORA-00279: 更改 197393 (在 11/13/2004 23:32:22 生成) 对于线程 1 是必需的
ORA-00289: 建议: E:\ORACLE\ORADATA\EYGLE\ARCHIVE\ARC00009.001
ORA-00280: 更改 197393 对于线程 1 是按序列 # 9 进行的
ORA-00278: 此恢复不再需要日志文件
'E:\ORACLE\ORADATA\EYGLE\ARCHIVE\ARC00008.001'
指定日志: {=suggested | filename | AUTO | CANCEL}
cancel
介质恢复已取消。
应用了所有的归档日志文件之后,可以将数据库只读打开:
SQL> alter database open read only;
数据库已更改。
因为源数据库的修改还在继续,可以关闭数据库,然后重新启动,应用归档日志,再次执行数据恢复:
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
数据库装载完毕。
SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 197393 (在 11/13/2004 23:32:22 生成) 对于线程 1 是必需的
ORA-00289: 建议: E:\ORACLE\ORADATA\EYGLE\ARCHIVE\ARC00009.001
ORA-00280: 更改 197393 对于线程 1 是按序列 # 9 进行的
指定日志: {=suggested | filename | AUTO | CANCEL}
ORA-00279: 更改 197423 (在 11/13/2004 23:32:51 生成) 对于线程 1 是必需的
ORA-00289: 建议: E:\ORACLE\ORADATA\EYGLE\ARCHIVE\ARC00010.001
ORA-00280: 更改 197423 对于线程 1 是按序列 # 10 进行的
ORA-00278: 此恢复不再需要日志文件
'E:\ORACLE\ORADATA\EYGLE\ARCHIVE\ARC00009.001'
指定日志: {=suggested | filename | AUTO | CANCEL}
cancel
介质恢复已取消。
恢复完成之后,数据库仍然可以只读打开,进行数据确认:
SQL> alter database open read only;
数据库已更改。
这样通过不断应用归档日志,迁移数据库可以和主数据库不断进行数据同步,在迁移停机时间到来时,就可以通过将源数据库所有日志归档,传输到迁移数据库应用,完成恢复;或者可以直接应用重做日志,完成恢复:
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
数据库装载完毕。
SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 197423 (在 11/13/2004 23:32:51 生成) 对于线程 1 是必需的
ORA-00289: 建议: E:\ORACLE\ORADATA\EYGLE\ARCHIVE\ARC00010.001
ORA-00280: 更改 197423 对于线程 1 是按序列 # 10 进行的
指定日志: {=suggested | filename | AUTO | CANCEL}
E:\Oracle\oradata\eygle\REDO01.LOG
ORA-00310: 存档日志包含序列 9;要求序列 10
ORA-00334: 归档日志: 'E:\ORACLE\ORADATA\EYGLE\REDO01.LOG'
SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 197423 (在 11/13/2004 23:32:51 生成) 对于线程 1 是必需的
ORA-00289: 建议: E:\ORACLE\ORADATA\EYGLE\ARCHIVE\ARC00010.001
ORA-00280: 更改 197423 对于线程 1 是按序列 # 10 进行的
指定日志: {=suggested | filename | AUTO | CANCEL}
E:\Oracle\oradata\eygle\REDO02.LOG
已应用的日志。
完成介质恢复。
SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项
SQL> alter database open resetlogs;
数据库已更改。
注意:由于使用了备份的控制文件进行恢复,最后只能通过Resetlogs方式打开数据库,如果可以在源数据库关闭的情况下,传输最新的控制文件和日志文件到迁移数据库,则可以实现完全恢复,直接打开数据库。此外请大家注意中间的恢复部分,read only打开不影响数据库进一步的恢复,也就是说恢复可以分步进行。
这种恢复的方式类似于DataGuard,但是操作更为简便可控,特别是在一些跨公网的环境中,不便于使用DataGuard的环境中,通过这种方式可以极大地缩短数据库迁移时间。在实际恢复中,使用这种方法,可以将跨公网的200GB左右数据库的迁移时间控制在了10分钟之内。