暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

归档逐步应用辅助数据迁移

原创 eygle 2019-11-27
958

有了数据库的热备份之后,就可以通过这个热备进行恢复来挽救用户数据,但是热备份的应用还远远不止于此,你可以通过热备应用归档的恢复来辅助进行数据库迁移。

很多时候你可能遇到这样的情况:一个大型数据库在同版本、同平台、异地异机的迁移,但是只有很少的停机时间,这看起来充满困难,但可以通过各种方法来缩短停机时间。

在此情况下,可以通过一个热备份,应用归档恢复数据库到一个一致的状态,此时数据库可以被只读(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分钟之内。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论