12c rman从备份集中active duplicate

12c以前的版本中,ACTIVE DUPLICATE进程使用生产库的进程通过网络将镜像副本发送到辅助库,这会是一个很消耗时间的任务,因为复制进程是直接按照源库大小相同比例进行复制。而在现在的12c中,数据库复制进程可以使用备份集来代替镜像副本。那么需要传输的数据库大小就会大幅度减小,因为RMAN备份的时候会跳过没有使用的块和已经提交了的回滚块等。同时也可以使用压缩或者切片的方式来提高复制传输的速度。另外新的从辅助库发起的辅助通道会用来从源库进行拉取备份集,而不是以前的从源库将备份集推送到辅助库,从而降低了源库的负载压力。

12c中,一个pull进程由备份集来决定,连接最初从源库建立,辅助实例则会通过网络接收到所需的数据库文件。恢复进程则是在辅助实例上发起,因此对源库的资源消耗更少了。

基于DUPLICATE语句,RMAN动态决定使用哪种进程,pull或者push。这样保证了现有已存在的脚本仍然有效。

  • 当你指定USING BACKUPSET,RMAN使用pull方法
  • 当你在DUPLICATE之前指定SET ENCRYPTION,RMAN自动使用pull方法并且创建备份集。这些要传输到目标端的备份集是被加密的
  • SECTION SIZE语句将数据文件切分多个小块,这样在辅助实例上并行恢复的时候可以利用多个通道的优势。为了更有效的使用并发,可以配置多个辅助通道
  • 通过USING COMPRESSED BACKUPSET语句,文件会通过压缩备份集的格式进行传输。RMAN创建备份时采取对未使用的块压缩方式,因此缩小了需要通过网络传输的备份集大小

示例

sys@ORA12C> select con_id,name,open_mode from v$pdbs;

    CON_ID NAME       OPEN_MODE
---------- ---------- ----------
         2 PDB$SEED   READ ONLY
         3 PDB12C     READ WRITE
         4 PDB3       READ WRITE

登录两边实例

[oracle@testyum ~]$ rman target sys/oracle@ora12c auxiliary sys/oracle@ora12c_dg

Recovery Manager: Release 12.2.0.1.0 - Production on Tue Aug 27 13:18:24 2019

Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.

connected to target database: ORA12C (DBID=383814323)
connected to auxiliary database: ORA12C (not mounted)

开始执行复制脚本

run {
allocate channel prmy1 type disk;
allocate channel prmy2 type disk;
allocate auxiliary channel aux1 type disk;
allocate auxiliary channel aux2 type disk;
allocate auxiliary channel aux3 type disk;
allocate auxiliary channel aux4 type disk;
DUPLICATE TARGET DATABASE TO 'ora12c'
FROM ACTIVE DATABASE
USING BACKUPSET;
}

完整日志:rman_duplicate_backupset.log

通过日志可以看出一些端倪

contents of Memory Script:
{
   sql clone "alter system set  control_files = 
  ''/u01/app/oracle/oradata/ORA12C/controlfile/o1_mf_gcm27myg_.ctl'', ''/u01/app/oracle/fast_recovery_area/ora12c/ORA12C/controlfile/o1_mf_gcm27ndj_.ctl'' comment=
 ''Set by RMAN'' scope=spfile";
   sql clone "alter system set  db_name = 
 ''ORA12C'' comment=
 ''Modified by RMAN duplicate'' scope=spfile";
   shutdown clone immediate;
   startup clone force nomount
   restore clone from service  'ora12c' primary controlfile;
   alter clone database mount;
}

这里辅助库是直接通过restore from service 的方式恢复了主库的控制文件

contents of Memory Script:
{
   sql clone 'alter database flashback off';
   set newname for clone datafile  1 to new;
   set newname for clone datafile  3 to new;
   set newname for clone datafile  4 to new;
   set newname for clone datafile  5 to new;
   set newname for clone datafile  6 to new;
   set newname for clone datafile  7 to new;
   set newname for clone datafile  8 to new;
   set newname for clone datafile  9 to new;
   set newname for clone datafile  10 to new;
   set newname for clone datafile  11 to new;
   set newname for clone datafile  12 to new;
   set newname for clone datafile  134 to new;
   set newname for clone datafile  135 to new;
   set newname for clone datafile  136 to new;
   set newname for clone datafile  137 to new;
   restore
   from  nonsparse   from service 
 'ora12c'   clone database
   ;
   sql 'alter system archive log current';
}

这里是通restore from service 恢复了数据文件。

看到这里很容易就联想到之前说过的12c新特性12c新特性:Rman中通过网络恢复文件

所以从备份集中的在线复制其实就是采用了新特性,然后从辅助库发起连接,使用RESTORE FROM SERVICE的方式将数据文件恢复到本地。