本章介绍如何使用DUPLICATE命令创建独立运行的数据库副本。

1.RMAN数据库复制概述

数据库复制使用DUPLICATE命令拷贝源数据库中的所有数据或数据子集。复制数据库(拷贝的数据库)完全独立于源数据库(被拷贝的数据库)运行。


1.1.数据库复制的目的

复制数据库可用于各种目的,大部分涉及测试。

可以在复制数据库中执行以下任务:
1)测试备份和恢复过程
例如,你可以复制host1上的生产数据库到host2,然后使用host2上的复制数据库练习还原和恢复这个数据库当host1上的生产数据库像平常一样运行时。
2)测试升级到一个数据库的新版本
3)测试应用程序对数据库的性能影响
4)创建备数据库
可以创建一个物理备数据库或Oracle Data Guard far sync实例。备数据库是使用来源于主数据库的归档redo日志不断更新的主数据库的副本。如果主数据库无法访问,可以故障切换到备数据库,此时备数据库成为了新的主数据库。然而,数据库副本不能以这种方式使用:它不是准备用于故障切换的场景和不支持各种备恢复和故障切换选项。
5)生成报告


1.2.数据库复制的基本概念

源数据库所在的主机称为源主机,源数据库实例(source database instance)是与源数据库关联的实例。

复制数据库所在的主机称为目标主机,源主机和目标主机可以是相同或不同的机器。

在复制过程中,与复制数据库关联的数据库实例称为辅助实例(auxiliary instance)。

RMAN必须执行时间点恢复,即使当没有明确的时间点提供给复制时。时间点恢复时必需的因为源数据库中的在线redo日志文件不能被备份和不能应用到复制数据库。复制数据库最远的恢复点是被源数据库归档的最近的redo日志文件。

RMAN分配新的DBID给复制数据库(除了当备数据库被创建时,在这种情况中保留源DBID)。然后你可以在与源数据库相同的恢复目录中注册复制数据库。

如果你使用操作系统工具而不是DUPLICATE命令拷贝数据库,那么拷贝的数据库的DBID保持与源数据库相同。为了在与原始的数据库相同的恢复目录中注册拷贝的数据库,你必须使用DBNEWID工具更改DBID。


1.2.1.辅助实例的初始化参数

必须设置辅助实例的某些强制性参数。

下表描述辅助实例的可能的初始化参数的子集。

初始化参数 状态
DB_NAME 在DUPLICATE命令中使用的相同名称。如果你使用DUPLICATE命令来创建备数据库,那么名称必须与主数据库相同。复制数据库的DB_NAME初始化参数在它的Oracle家目录的数据库当中必须是唯一的。 必需的
CONTROL_FILES 控制文件的位置 必需的
DB_BLOCK_SIZE 复制数据库的块大小。这个块大小必须匹配源数据库的块大小。如果源数据库参数文件包含DB_BLOCK_SIZE初始化参数的值,那么你必须为辅助实例指定相同的值。然而,如果在源数据库的初始化参数文件中没有指定DB_BLOCK_SIZE参数,那么在辅助实例中不要指定DB_BLOCK_SIZE参数。 必需的,如果在源数据库中设置了这个参数。
DB_FILE_NAME_CONVERT 转换数据文件和临时文件的字符串对。你也可以在DUPLICATE命令本身中指定DB_FILE_NAME_CONVERT。 可选的
LOG_FILE_NAME_CONVERT 命名在线redo日志文件的字符串对 可选的
DB_CREATE_FILE_DEST Oracle管理的数据文件位置 可选的
DB_CREATE_ONLINE_LOG_DEST_n Oracle管理的在线redo日志文件位置 可选的
DB_RECOVERY_FILE_DEST 快速恢复区域位置 可选的
Oracle RAC参数:
1)<INSTANCESIDn>.INSTANCE_NAME
2)<INSTANCESIDn>.INSTANCE_NUMBER
3)<INSTANCESIDn>.THREAD
4)<INSTANCESIDn>.UNDO_TABLESPACE
5)<INSTANCESIDn>.LOCAL_LISTENER
为每个Oracle RAC数据库实例设置这些参数 Oracle RAC配置必需的

1.2.2.关于在活动数据库复制期间并行备份集创建

RMAN多段备份通过并行备份非常大的数据文件来提供更快的备份性能。多个备份片被创建,由不同的通道写到每个备份片。从Oracle数据库12c Release 1(12.1)开始,你可以使用多段(multisection)备份集来传输执行活动数据库需要复制的源文件

在DUPLICATE命令中使用SECTION SIZE选项来创建多段备份集。以下命令创建多段备份集,每个备份片的大小是400M。假设已经通过使用网络服务名称连接到目标数据库和辅助实例。
DUPLICATE TARGET DATABASE TO dup_db
FROM ACTIVE DATABASE
PASSWORD FILE
SECTION SIZE 400M;


1.2.3.关于在活动数据库复制期间加密备份集

RMAN可以使用备份集来传输需要复制的源数据库文件。备份集通过网络传输到辅助数据库。备份集可以为额外的安全进行加密。在DUPLICATE命令之前使用SET ENCRYPTION ALGORITHM命令指定加密算法。

在执行活动数据库复制之前,使用以下的一种技术确保加密成功:
1)如果源数据库使用透明的加密,那么你必须在源数据库和辅助实例之间共享包含密钥的Oracle软件密钥库。
2)如果源数据库使用密码加密,那么你必须指定加密备份使用的密码。

以下命令设置加密密码:
SET ENCRYPTION ON IDENTIFIED BY password;


1.2.4.关于在活动数据库复制期间压缩备份集

当使用备份集来执行活动数据库复制时,RMAN可以使用备份压缩来最小化用来从源数据库传输文件到目标主机的备份集的大小。因此,压缩可以提高复制过程的性能。

从Oracle数据库12c Release 1(12.1)开始,支持活动数据库复制使用压缩备份集

在DUPLICATE命令中使用USING COMPRESSED BACKUPSE子语句压缩包含执行活动数据库需要的数据的备份集。以下命令通过使用压缩备份集来执行活动数据库复制。假设已经通过使用网络服务名称连接到目标数据库和辅助实例。

DUPLICATE TARGET DATABASE TO dup_db
FROM ACTIVE DATABASE
PASSWORD FILE
USING COMPRESSED BACKUPSET;


1.3.数据库复制的类型

RMAN可以执行两种主要类型的数据库复制。

它们包括以下:
1) 基于备份的复制
复制数据库通过使用先前存在的源数据库的RMAN备份或副本来创建。你可以通过使用基于备份的复制采取不同的技术复制数据库。
2)活动数据库复制
复制数据库通过经由网络拷贝活动的源数据库到辅助实例。复制可以通过使用备份集或映像副本来执行。

你可以使用任何类型的复制来复制数据库到本地主机或远程主机。


1.3.1. 基于备份的复制(Backup-based duplication)概述

在基于备份的复制中,使用先前存在的源数据库的RMAN备份或副本来创建复制数据库。可以使用完全和增量备份的组合。RMAN基于UNTIL条件决定必须使用哪个备份和归档redo日志文件。

在基于备份的复制中,复制数据库的主要工作在辅助通道中进行。可以按照“配置用于复制的RMAN通道”章节描述的步骤配置额外的通道。

基于备份的复制可用于以下场景中:
1)到源数据库的连接不可用,但源数据库的备份可用。
2)源主机和目标主机之间的网络带宽有限制。
当网络源主机和目标主机之间的带宽受限时,使用活动的数据库复制可能导致性能降低。例如,源主机和目标主机在不同的地理位置和通过WAN连接。在这个情况中,优先使用基于备份的复制。

使用以下三种互斥的技术的其中一种来执行基于备份的复制。

1.3.1.1. 具有target连接的基于备份的复制

在这种方法中,必须作为TARGET连接到源数据库和作为AUXILIARY连接到辅助实例。

图Figure 25-1阐述了具有target连接的基于备份的复制。你可以连接到恢复目录,但不是强制性的(图中没有)。RMAN使用源数据库的控制文件中的元数据来决定哪个备份或副本必须用于执行复制。目标主机必须可以访问创建复制数据库必需的RMAN备份。

在这里插入图片描述

1.3.1.2. 没有target连接和有恢复目录的基于备份的复制

在这种方法中,作为CATALOG连接到恢复目录(recovery catalog)数据库和作为AUXILIARY连接到辅助实例。

图Figure 25-2阐述了没有target连接的基于备份的复制。RMAN使用恢复目录中的元数据来决定哪个备份或拷贝需要用来执行复制。目标主机必须可以访问创建复制数据库必需的RMAN备份。
在这里插入图片描述

1.3.1.3. 没有target连接和没有恢复目录的基于备份的复制

在这种方法中,没有到源数据库或者恢复目录的连接。

图Figure 25-3阐述了没有到target和恢复目录数据库实例连接的基于备份的复制。通过连接到辅助实例,使用在目标主机的磁盘位置上存储的源数据库的备份或副本执行数据库复制。RMAN通过DUPLICATE命令的子语句BACKUP LOCATION来获取关于备份或副本位置的元数据。

包含所有复制需要的备份或副本的磁盘位置必须对目标主机可用。

注:这个方法不支持存储在磁带设备上的备份。

在这里插入图片描述

1.3.2. 活动数据库复制(Active Database Duplication)概述

活动数据库复制不需要源数据库的备份。它通过网络拷贝数据库文件到辅助实例来复制活动的源数据库到目标主机。RMAN可以作为映像拷贝或备份集来拷贝需要的文件。

对于活动数据库复制,使用的复制方法决定了哪个通道进行主要的工作。如果使用备份集来进行复制,复制的主要工作由辅助通道来完成。如果使用映像拷贝来复制,主要工作则由TARGET通道来完成。

要进行活动数据库的复制,必须要连接到TARGET数据库。Oracle建议使用活动数据库复制的方式来复制,除非源主机和目标主机之间的网络带宽有限制。活动数据库复制只需要很少的设置,而且比较容易实施。

注:对于活动数据库复制,源数据库必须使用服务器参数文件spfile

某些活动数据库复制优先使用备份集而不是映像副本的场景是:
1)当复制数据库时,你想使用多段备份,压缩,或加密。
2)源数据库没有足够的网络资源传输必需的数据库文件到复制数据库。
3)你想最少化复制过程使用的资源。

使用备份集的活动数据库复制使用源数据库上的最少的资源。

使用以下两种互斥的技术的其中一种来执行活动数据库的复制。


1.3.2.1. 使用映像副本的活动数据库复制

在这种方法中,RMAN作为TARGET连接到源数据库和作为AUXILIARY连接到辅助实例。源数据库通过网络传输需要的数据库文件到辅助实例。这种方法称作为基于推动(push-based)的活动数据库复制方法。

图Figure 25-4阐述了使用映像副本的活动数据库复制。使用映像拷贝的方式可能会在源数据库上会占用额外的资源。可以按照“配置用于复制的RMAN通道”章节描述的步骤配置额外的TARGET通道来改善复制的性能。

在这里插入图片描述

1.3.2.2. 使用备份集的活动数据库复制

从12.1版本开始,可以使用备份集的活动数据库复制。Oracle建议使用备份集来执行活动数据库复制。

在这种方法中,RMAN作为TARGET连接到源数据库和作为AUXILIARY连接到辅助实例。辅助实例通过Oracle网络服务连接到源数据库,然后通过网络从源数据库获取需要的数据库文件。这种方法称作为基于拉取(pull-based)的活动数据库复制方法。

在这里插入图片描述

使用备份集的活动数据库复制提供以下优势:
1)RMAN可以使用未使用块压缩,因此减少必须通过网络传输的备份的大小。
2)备份集可以通过使用多段备份在源数据库上并行地创建。
3)在源数据库上创建的备份集可以加密。


1.3.3.决定活动数据库复制使用备份集或映像副本的因素

RMAN可以使用备份集或映像副本来执行活动数据库复制。

RMAN使用备份集来执行活动数据库复制当使用网络服务名称建立到目标数据库的连接和满足以下任何一个条件时:
1)命令DUPLICATE … FROM ACTIVE DATABASE包含USING BACKUPSET,USING COMPRESSED BACKUPSET,或SECTION SIZE子语句。
2)辅助通道的数量等于或大于分配的TARGET通道数量

否则,RMAN使用映像副本来执行活动数据库复制。

注:Oracle建议你使用备份集来执行活动数据库复制。


1.4.RMAN如何复制数据库

RMAN自动执行一组自动的步骤来复制数据库。

步骤包括以下:
1) 为辅助实例创建一个缺省的服务器参数文件spfile,如果满足以下条件:
a.复制不涉及备数据库
b.没有复制服务器参数文件spfile
c. 没有使用服务器参数文件spfile启动辅助实例
2) 从活动数据库的备份或映像中还原满足UNTIL语句要求的最近的控制文件
3) 使用还原的控制文件或从活动数据库拷贝的备份控制文件来mount辅助实例
4)使用RMAN仓库里的元数据来选择用来还原数据文件到辅助实例的备份。这个步骤只适用于基于备份的复制。
5)拷贝数据库文件到目标主机,然后使用增量备份和归档日志文件还原它们至非当前的时间点。
6)在目标主机上关闭和重启辅助实例到NOMOUNT模式
7)创建一个新的控制文件,它将会在数据文件中创建和保存新的DBID(备数据库除外)。
8)使用RESETLOGS选项打开复制的数据库,然后创建新数据库的在线日志文件。如果不想打开复制的数据库,在DUPLICATE命令中使用NOOPEN子语句。


1.5.复制数据库的内容

复制数据库可以包含与源数据库相同的内容或源数据库中的表空间子集。

例如,你可以使用DUPLICATE命令的TABLESPACE选项只复制指定的表空间,或SKIP READONLY选项排除只读表空间。


1.5.1.关于复制源数据库的子集

命令DUPLICATE包含子语句让你能够复制整个源数据库的子集。

不是总是有必要复制数据库的所有表空间。例如,你可能计划生成只需要源数据库的表空间子集的报告。

下表描述了DUPLICATE命令的为复制数据库指定表空间子集的选项。

复制选项 说明
SKIP READONLY 排除只读表空间的数据文件
SKIP TABLESPACE ‘tablespace_name’, … 排除指定的表空间。你不能排除SYSTEM和SYSAUX表空间,含有SYS对象的表空间,undo表空间,含有undo段的表空间,含有物化视图的表空间,不是自含的表空间。
TABLESPACE ‘tablespace_name’, … 自动包括SYSTEM,SYSAUX和undo表空间。被包括的表空间必须是自含的和作为结果跳过的表空间必须不包含SYS对象或物化视图。

注:当在基于备份的复制中排除表空间而没有TARGET连接时,RMAN有特殊的要求。请参考Oracle Database Backup and Recovery Reference文档中的DUPLICATE命令的前提要求部分。


1.6.关于数据库复制的目的地主机

RMAN在特定的主机上创建复制数据库。目的地主机可以与源主机相同或不同。

当相同的主机作为源主机和目的地主机使用时,复制被称为复制到本地主机。当源主机和目的地主机在不同的机器上,复制被称为复制到远程主机。

关于复制数据库到本地主机
当复制数据库到本地主机时,你必须通过使用与源数据库不同的目录结构存储复制数据库文件。例如,如果源数据库文件存储在目录/disk1/oracle,那么复制数据库文件可以存储在/disk2/oracle目录。复制数据库文件名称可以与源数据库的相同或不同。
警告:当复制到本地主机时使用NOFILENAMECHECK会覆盖源数据库文件。

关于复制数据库到远程主机
当复制数据库到远程主机时,复制数据库文件可以使用源数据库相同或不同的目录结构和文件名称。
注:复制到远程主机需要一个密码文件和到辅助实例的Oracle网络服务连接。


1.7.关于复制数据库的文件名称

取决于使用的目的地主机和复制场景,复制数据库可以使用与源数据库相同的名称或不同的名称。数据库文件包括数据文件,控制文件,在线redo日志文件和临时文件。


1.8.关于复制数据库到过去的时间点

你可以在DUPLICATE命令中使用子语句复制数据库到过去的时间点。

缺省情况下,DUPLICATE命令使用最近的目标数据库的备份复制数据库,然后执行恢复到包含在增量备份和归档redo日志中的最近的一致点。然而,你可以使用其中一个以下的方法恢复复制数据库到过去的时间点:
1)DUPLICATE … UNTIL命令
2)DUPLICATE命令之前的SET UNTIL命令

下表列出了源数据库会被复制的文件:

源数据库文件 活动数据库复制 基于备份的复制
控制文件 当指定FOR STANDBY时从源数据库拷贝,否则重建 从备份中还原
数据文件 从源数据库拷贝(除非使用SKIP选项排除的文件) 从备份中还原(除非使用SKIP选项排除的文件)
临时文件 重建 重建
在线redo日志文件 重建 重建
备redo日志文件 当在主数据库定义和指定FOR STANDBY时重建 当在主数据库定义和指定FOR STANDBY时重建
归档日志文件 如果复制需要时则从源数据库复制 如果复制需要时则从备份或登记了的副本(cataloged copies)中获取
服务器参数文件 从源数据库中拷贝 如果指定了SPFILE子语句则从备份中还原
闪回日志文件 不重建 不重建
跟踪块变化文件 不重建 不重建
密码文件 缺省会为备数据库拷贝;对于非备数据库,如果指定了PASWORD FILE选项则拷贝 不重建
在快速恢复区的备份和其他文件 不拷贝 不拷贝

2. 规划复制数据库

2.1. 选择复制数据库文件名策略

在复制数据库时,RMAN为复制数据库的数据库文件生成文件名,数据库文件包含控制文件,数据文件,临时文件和在线日志文件等。

如果没有指定生成复制数据库文件名的策略,RMAN将会使用与源数据库相同的文件名和目录结构。

只有当复制到一台远程主机时,使用NOFILENAMECHECK子语句来指示RMAN在发现源数据库和复制数据库的文件名称相同时不要显示错误。当复制到本地主机时,使用NOFILENAMECHECK会覆盖TARGET数据库文件。


2.1.1. 复制数据库使用与源数据库相同的文件名

必须满足某些条件在源数据库和复制数据库中使用相同的名称。

最简单的复制策略就是配置复制数据库使用与源数据库相同的目录结构和文件名。只有复制到远程主机时才可以使用相同的目录结构和文件名。

使用相同的目录结构和文件名意味着环境满足以下要求:
1)如果源数据库使用ASM磁盘组,那么复制数据库也必须使用相同名称的ASM磁盘组。
2)如果源数据库文件是OMF(Oracle Managed Files)文件,那么辅助实例中必须设置DB_CREATE_FILE_DEST参数指向与源数据库相同的目录位置。虽然源主机和目的地主机上的目录相同,Oracle数据库为复制文件选择相对的名称。
3)如果源数据库的数据库文件的名称包含路径,那么这个路径名在复制数据库上也必须相同。
4)对于RAC环境,源数据库和目标数据库使用相同的ORACLE_SID参数值。


2.1.2. 复制数据库使用与源数据库不同的文件名

如果源主机和目标主机使用不同的目录结构,或如果它们使用相同的目录结构但你想以不同的名称命名,那么你必须指定RMAN如何生成复制数据库的文件名称。

注:建议为在源数据库和复制数据库中的ASM磁盘组使用不同的名称。


2.1.2.1. 使用SET NEWNAME命令

RMAN按照以下优先顺序设置复制数据文件的名称:
SET NEWNAME FOR DATAFILE 和SET NEWNAME FOR TEMPFILE
SET NEWNAME FOR TABLESPACE
SET NEWNAME FOR DATABASE

示例:
RUN
{
 SET NEWNAME FOR DATAFILE 1 TO ‘/oradata1/system01.dbf’;
 SET NEWNAME FOR DATAFILE 2 TO ‘/oradata2/sysaux01.dbf’;
 SET NEWNAME FOR DATAFILE 3 TO ‘/oradata3/undotbs01.dbf’;
 SET NEWNAME FOR DATAFILE 4 TO ‘/oradata4/users01.dbf’;
 SET NEWNAME FOR DATAFILE 5 TO ‘/oradata5/users02.dbf’;
 SET NEWNAME FOR TEMPFILE 1 TO ‘/oradatat/temp01.dbf’;
 DUPLICATE TARGET DATABASE TO dupdb
  SKIP TABLESPACE tools
  LOGFILE
   GROUP 1 (‘/duplogs/redo01a.log’,‘/duplogs/redo01b.log’) SIZE 4M
REUSE,
   GROUP 2 (‘/duplogs/redo02a.log’, ‘/duplogs/redo02b.log’) SIZE 4M
REUSE;
}

对于数据库或表空间,必须使用以下替换变量来定义文件名。

变量 描述
%b 指定去掉目录路径的文件名,例如数据文件文件名称为/oradata/prod/financial.dbf,那么%b 表示financial.dbf.
%f 指定数据文件的绝对文件名,例如数据文件2被复制,那么%f表示2。
%d 指定DBNAME
%I 指定 DBID.
%N 指定表空间名称
%U 指定为格式: data-D-%d_id-%I_TS-%N_FNO-%f

例如:
SET NEWNAME FOR TABLESPACE users TO ‘/oradata%f/%b’;
SET NEWNAME FOR DATABASE TO ‘/oradata/%U’;

对于OMF和ASM数据库文件,必须使用SET NEWNAME … TO NEW命令,并且不要明确地指定数据库文件的名称,只指定ASM磁盘组名称。**

使用SET NEWNAME来更改OMF或ASM的数据文件名称示例:
RUN
{
 SET NEWNAME FOR DATAFILE 1 TO “+DGROUP1”;
 SET NEWNAME FOR DATAFILE 2 TO “+DGROUP2”;
 .
 .
 .
 DUPLICATE TARGET DATABASE
  TO dupdb
  FROM ACTIVE DATABASE
  SPFILE SET DB_CREATE_FILE_DEST +DGROUP3;
}


2.1.2.2. 使用CONFIGURE AUXNAME来更改数据文件名称

指定非OMF和非ASM复制数据库文件的名称。

使用CONFIGURE AUXNAME指定的新的文件名称会记录在控制文件中,在将来每次执行复制时都可以使用。由于不是使用SET NEWNAME,所以不需要RUN命令:
CONFIGURE AUXNAME FOR DATAFILE 1 TO ‘/oradata1/system01.dbf’;
CONFIGURE AUXNAME FOR DATAFILE 2 TO ‘/oradata2/undotbs01.dbf’;
CONFIGURE AUXNAME FOR DATAFILE 3 TO ‘/oradata3/cwmlite01.dbf’;
CONFIGURE AUXNAME FOR DATAFILE 4 TO ‘/oradata4/drsys01’;
CONFIGURE AUXNAME FOR DATAFILE 5 TO ‘/oradata5/example01.dbf’;
CONFIGURE AUXNAME FOR DATAFILE 6 TO ‘/oradata6/indx01.dbf’;
DUPLICATE TARGET DATABASE
 TO dupdb
 SKIP TABLESPACE tools
 LOGFILE
  GROUP 1 (‘/duplogs/redo01a.log’,
‘/duplogs/redo01b.log’) SIZE 4M REUSE,
  GROUP 2 (‘/duplogs/redo02a.log’,
‘/duplogs/redo02b.log’) SIZE 4M REUSE;

在复制完成后,可以清除配置的辅助名称:
CONFIGURE AUXNAME FOR DATAFILE 1 CLEAR;
CONFIGURE AUXNAME FOR DATAFILE 2 CLEAR;

CONFIGURE AUXNAME FOR DATAFILE 6 CLEAR;


2.1.2.3. 使用DUPLICATE命令的SPFILE子语句

设置除了DB_FILE_NAME_CONVERT参数之外的与复制数据库文件名称相关的所有必要的初始化参数。


2.1.2.4. 使用DUPLICATE命令的LOGFILE子语句

设置复制数据库的在线redo日志文件的名称,对于创建备数据库不能使用这种方法

注:当复制到本地主机,或复制到远程主机但不使用NOFILENAMECHECK子语句时,确保不要使用源数据库当前在使用的在线redo日志文件名称。


2.1.2.5. 使用DB_FILE_NAME_CONVERT和LOG_FILE_NAME_CONVERT参数

指定转换源数据库的文件名到复制数据库的文件名的规则,可以指定多个转换对。

对于ASM的文件名,这两个参数只可用于更改ASM磁盘组名。

清空参数的值:
SQL>alter system reset log_file_name_convert scope=spfile;

注:如果源数据库使用OMF,那么不能使用这个方法来指定复制数据库文件的替代名称。


2.1.2.6. 使用DB_CREATE_FILE_DEST和DB_CREATE_ONLINE_LOG_DEST_n参数

使用这两个参数为OMF格式的文件指定创建位置,建议使用这种方法来指定OMF和ASM的新名称。

Linux ASM OMF格式文件的输出:
SQL> show parameter db_create_file_dest;

NAME                          TYPE       VALUE

db_create_file_dest          string       +DATA

Windows OMF格式文件的输出:
SQL> show parameter db_create_file_dest;

NAME                       TYPE              VALUE
db_create_file_dest       string      F:\app\oracle\oradata

2.1.2.7. OMF(Oracle Managed Files)或ASM文件更改名称

如果源数据库的数据库文件使用 OMF格式,那么不能使用DB_FILE_NAME_CONVERT和LOG_FILE_NAME_CONVERT初始化参数或fileNameConversionSpec子语句来生成复制数据库的新OMF文件名。

唯一例外的是可以使用以上两个参数来更改数据文件和在线日志文件所在的ASM磁盘组名称。
假设源数据库的数据文件和在线日志文件存储在ASM磁盘组“+SOURCEDSK”,而复制数据库在数据库文件存储在ASM磁盘组“+DUPDSK”,那么可以在初始化参数中设置如下
DB_FILE_NAME_CONVERT = (“+SOURCEDSK”,“+DUPDSK”)
LOG_FILE_NAME_CONVERT = (“+SOURCEDSK”,“+DUPDSK”)

可以使用以下两种方法来更改OMF格式的数据文件的名称:
1)使用SET NEWNAME为每个数据文件指定新的名称
2)设置辅助实例的DB_CREATE_FILE_DEST参数,为除了SET NEW指定的文件之外的OMF文件创建数据文件。参数指定的位置也是OMF控制文件和在线redo日志文件的缺省位置。如果设置了DB_CREATE_FILE_DEST参数,就不能再设置DB_FILE_NAME_CONVERT参数。

使用以下两个参数来设置OMF控制文件和在线redo日志文件的位置:
1) DB_CREATE_ONLINE_LOG_DEST_n,指定OMF控制文件和在线日志文件的缺省位置,如果需要设置多重控制文件和在线redo日志文件,则分别设置_1,_2等参数。
2)DB_RECOVERY_FILE_DEST,指定快速恢复区的缺省位置,快速恢复区中包含多重控制文件和在线redo日志文件。如果需要设置控制文件和在线redo日志文件的多重副本,则设置这个参数。

从文件系统复制数据库到ASM磁盘组示例:
DUPLICATE TARGET DATABASE TO dupdb
 FROM ACTIVE DATABASE
 SPFILE
  PARAMETER_VALUE_CONVERT ‘/oracle/oradata/prod/’, ‘+DISK1’
  SET DB_CREATE_FILE_DEST +DISK1;


2.1.2.8. 控制文件名称更改

缺省情况下,RMAN在复制数据库的默认位置创建控制文件。可以使用以下方法指定复制数据库的控制文件位置:
1) 在辅助实例的初始化参数文件中设置CONTROL_FILES参数。
2) 设置其中一个以下参数来指定创建OMF格式的控制文件的位置:
– DB_CREATE_ONLINE_LOG_DEST_n
– DB_CREATE_FILE_DEST
– DB_RECOVERY_FILE_DEST


2.2.在目的地主机上安装Oracle数据库软件

当源数据库和目的地主机不同时,你必须在目的地主机上安装Oracle数据库软件,以便辅助实例可以被创建。

注:确保在目的地主机上安装与源主机相同版本的Oracle数据库软件和相同的补丁级别。

使用以下其中一个方法安装软件:
1)使用OUI执行正常的安装
安装与源数据库相同的Oracle数据库版本。不要创建数据库,只安装软件。应用任何需要的补丁。
2)克隆源Oracle目录。
使用OUI克隆源Oracle目录。这确保所有应用到源数据库的补丁在复制数据库中也存在。


2.3.决定复制数据库的状态

当你使用RMAN的DUPLICATE命令时,复制数据库被创建和以RESETLOGS模式打开。你可以在DUPLICATE命令中使用NOOPEN子语句来指定复制数据库必须不要打开。

你可能不想在以下情形中创建之后立即打开复制数据库:
1)打开复制数据库可能造成错误。
2)你需要修改复制数据库的初始化参数。
例如,你需要修改闪回数据库设置,配置快速增量备份,或修改块更改跟踪。
3)作为升级过程的一部分创建新数据库。
在升级期间你不能使用RESETLOGS选项打开数据库。NOOPEN子语句让你复制数据库,然后将它留在准备在升级模式和随后的升级脚本执行中打开的状态。


2.4.使备份可以被辅助实例访问

复制期间使用的备份的名称存储在RMAN恢复目录或控制文件中。

注:如果在执行活动数据库复制,那么这个步骤不是必要的。

当使用TARGET连接和恢复目录连接或只有TARGET连接时,RMAN使用RMAN仓库中的元数据来定位复制要求的备份和归档redo日志文件。如果RMAN连接到恢复目录,那么RMAN从目录中获取备份元数据。如果RMAN没有连接到目录,如可能的情况当使用TARGET连接执行基于备份的复制时,那么RMAN从控制文件中获取元数据。

与记录在RMAN仓库中相同名称的备份必须可用的,除非复制时不连接到TARGET和恢复目录。确保目的地主机上的辅助实例可以访问所有数据文件备份和归档redo日志文件。这是还原和恢复复制数据库到期望的时间点要求的。如果不可访问,复制失败。归档redo日志文件可以作为映像副本或备份集可用的。

注:数据库备份不需要使用BACKUP DATABASE命令生成。你可以混合单独的数据文件的完全和增量备份,但要求有每个数据文件的完全备份。

通过备份软件使辅助实例可以访问磁带备份SBT backup。

如果没有连接到目标数据库或者恢复目录,那么必须使用BACKUP LOCATION指定备份的位置。如果备份位置包含多个不同数据库的备份文件,那么需要使用DATABASE子语句指定需要复制的数据库的名称。如果备份位置包含来自相同名称的不同的数据库备份文件,那么就需要使用DATABASE子语句同时指定需要复制的数据库的名称和DBID。


3. 准备辅助实例

RMAN使用辅助实例创建复制数据库。你必须在开始复制之前准备辅助实例。

取决于复制场景,你需要执行某些或所有本节中描述的任务。

3.1. 创建数据库目录

在目标主机上,创建存储复制数据库文件的目录,包括存储数据文件,控制文件,在线redo日志文件和临时文件的目录。


3.2. 创建初始化参数文件

使用以下方法为辅助实例创建初始化参数文件:
1) 手工创建一个初始化参数文件
如果源数据库不使用spfile,那么你必须在一个基于文本的初始化参数文件中为辅助实例设置所有必要的参数。
2) 让RMAN使用源数据库的服务器参数文件,然后使用DUPLICATE命令的SPFILE子语句的PARAMETER_VALUE_CONVERT选项或SET子语句更改辅助实例的DB_FILE_NAME_CONVERT等参数

对于基于备份的复制,spfile从备份中还原。对于活动数据库复制,spfile从源数据库复制到辅助实例。

建议在辅助实例的缺省位置创建初始化参数文件。在Linux上,缺省的pfile文件是ORACLE_HOME/dbs/initORACLE_SID.ora。在Windows上,缺省的pfile文件是ORACLE_HOME\database\initORACLE_SID.ora。

初始化参数 状态
DB_NAME 在DUPLICATE命令中使用的相同名称。如果你使用DUPLICATE命令来创建备数据库,那么名称必须与主数据库相同。复制数据库的DB_NAME初始化参数在它的Oracle家目录的数据库当中必须是唯一的。 必需的
CONTROL_FILES 控制文件的位置 必需的
DB_BLOCK_SIZE 复制数据库的块大小。这个块大小必须匹配源数据库的块大小。如果源数据库参数文件包含DB_BLOCK_SIZE初始化参数的值,那么你必须为辅助实例指定相同的值。然而,如果在源数据库的初始化参数文件中没有指定DB_BLOCK_SIZE参数,那么在辅助实例中不要指定DB_BLOCK_SIZE参数。 必需的(如果在源数据库中设置了这个参数)
DB_FILE_NAME_CONVERT 转换数据文件和临时文件的字符串对。你也可以在DUPLICATE命令本身中指定DB_FILE_NAME_CONVERT。 可选的
LOG_FILE_NAME_CONVERT 转换在线redo日志文件的字符串对 可选的
DB_CREATE_FILE_DEST Oracle管理的数据文件位置 可选的
DB_CREATE_ONLINE_LOG_DEST_n Oracle管理的在线redo日志文件位置 可选的
DB_RECOVERY_FILE_DEST 快速恢复区域位置 可选的
Oracle RAC参数:
1)<INSTANCESIDn>.INSTANCE_NAME
2)<INSTANCESIDn>.INSTANCE_NUMBER
3)<INSTANCESIDn>.THREAD
4)<INSTANCESIDn>.UNDO_TABLESPACE
5)<INSTANCESIDn>.LOCAL_LISTENER
为每个Oracle RAC数据库实例设置这些参数 Oracle RAC配置中必需的

当复制 Oracle Real Application Clusters (Oracle RAC) 数据库时,设置辅助实例的CLUSTER_DATABASE参数为FALSE。在复制完成后,可以根据需要重新设置为TRUE。


3.3. 创建密码文件

可以通过使用操作系统或密码文件认证连接到辅助实例。对于基于备份的复制,可以创建密码文件或使用操作系统认证连接到辅助实例。对于活动数据库复制,你必须使用密码文件认证。

使用密码文件认证连接到数据库是,你必须为数据库创建一个密码文件。当复制数据库到远程主机时,设置一个密码文件是强制性的。

在Windows上,缺省的密码文件的位置在目录$ORACLE_HOME\database下。在Linux和UNIX上,在目录$ORACLE_BASE/dbs下,ASM组在+DATA/DB_NAME/PASSWORD下。

注:当使用RMAN复制创建备数据库时,密码文件总是会被复制。在其他情况下,只有指定DUPLICATE命令的PASSWORD FILE选项时才会复制密码文件。

在目标主机上使用以下方法来为辅助实例创建密码文件:
1) 使用操作系统工具复制源数据库的密码文件到目标主机(如果密码文件在ASM磁盘上,先使用asmcmd cp拷贝到文件系统下,再上传到目标主机),然后按照辅助实例的名称来重命名密码文件。这个只有在源主机和目的地主机是相同的平台时才适用。
2) 手工创建密码文件,确保SYSDBA和SYSBACKUP用户的密码在源数据库和辅助实例相同。
3) 使用orapwd工具创建密码文件。SYSBACKUP选项会在密码文件中创建一个SYSBACKUP的条目。
# orapwd FILE=‘/u01/oracle/dbs/orapworcl’ FORMAT=12.2
4) 指定DUPLICATE… FROM ACTIVE DATABASE命令的PASSWORD FILE选项

当使用活动数据库复制时,密码文件必须至少包含SYS用户和SYSBACKUP两个用户的密码,这些密码必须与源数据库相匹配。


3.4. 建立源数据库和辅助实例的Oracle网络连接

如果以下任何条件为真,辅助实例必须通过Oralce网络服务可以连接:
1) RMAN客户端不是运行在目标主机上
2) 选择活动数据库复制的数据库复制方式
3) 目标主机与源主机不是同一台主机

如果要执行活动数据库复制,必须拥有SYSDBA或SYSBACKUP权限通过网络服务名称连接到辅助实例。RMAN作为TARGET连接的源数据库将使用网络服务名称直接连接辅助实例。

使用以下步骤来建立源数据库和辅助实例的Oracle网络连接(假设源数据库的DB_NAME是src,源主机是src.example.com,辅助实例的DB_NAME是dup,目标主机是dup.example.com):
1) 在源数据库的tnsnames.ora文件中,增加以下对应复制数据库的行:
dupdb = (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dup.example.com)
(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=dup)))
2) 在目标主机上,建立tnsname.ora文件,增加以下对应源数据库的行:
srcdb = (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=src.example.com)
(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=src)))


3.5. 启动辅助实例

使用创建的初始化参数文件启动辅助实例。

作为复制的一部分RMAN关闭和重启辅助实例。因此,建议在缺省位置中为辅助实例创建一个服务器端的初始化参数文件。否则,你必须在DUPLICATE命令中使用PFILE参数指定客户端的初始化参数文件。

注:因为辅助实例还没有控制文件,你只能启动实例到NOMOUNT模式。不要创建控制文件或尝试挂载或打开辅助实例。

启动辅助实例:
1)启动RMAN。
% rman

2)使用SYSDBA或SYSBACKUP权限的用户连接到辅助实例。

以下示例使用密码文件认证连接到辅助实例:
RMAN> CONNECT SYS@dupdb AS SYSDBA;

以下示例使用操作系统认证连接到辅助实例:
RMAN> CONNECT / AS SYSBACKUP;

3)启动辅助实例到NOMOUNT模式。
SQL> STARTUP FORCE NOMOUNT;


4. 复制数据库

可以使用DUPLICATE命令复制全部或部分数据库。

4.1. 配置用于复制的RMAN通道

数据库复制的主要工作由RMAN通道来执行。每个通道对应于一个执行复制任务的Oracle数据库服务器会话。采用的复制技术决定了RMAN使用辅助或者目标通道执行主要的复制工作。

使用以下方法来配置通道:
1) 使用CONFIGURE命令自动分配通道
2) 使用ALLOCATE命令手工分配通道,ALLOCATE命令必须与DUPLICATE命令在相同的RUN块里。

RMAN可以使用源数据库上相同的通道配置在目的地主机上进行复制,即使源数据库通道没有指定AUXILIARY选项。


4.1.1. 配置基于备份的复制的通道

对于基于备份的复制,复制的主要工作都是由辅助实例来执行。一个辅助通道对应于目标主机上的辅助实例的一个服务器会话。RMAN使用这些通道在辅助实例中还原备份。

可以配置额外的辅助通道来提高复制操作的性能。如果不明确指定辅助通道,RMAN将会在目标主机上使用与源数据库相同的通道配置复制。即使源数据库通道不指定AUXILIARY选项,RMAN也可以使用这些配置。

注意以下额外的考虑:
1)对于基于磁盘的备份,你可以通过分配额外的通道提升复制操作的速度。
对于基于磁带的复制,你只可以分配可用的磁带设备数量的通道。
2)辅助通通的通道类型(DISK或sbt)必须匹配备份介质。通常,你为磁盘备份分配越多通道,复制越快。在磁盘达到最大的读写速率之后,你不能提高复制的速度。对于磁带备份,限制通道的数量为可用的设备数量。
3)如果辅助通道需要特别的参数(例如,指向不同的介质管理器),那么你可以使用CONFIGURE命令的AUXILIARY选项配置自动化通道。
4)当没有TARGET连接和恢复目录连接执行复制时,只有磁盘通道可以被使用。如果没有用户分配的通道被使用,那么最初只有一个通道还原控制文件。在控制文件被挂载之后,分配的通道数量取决于还原的控制文件的配置。
5)如果省略DUPLICATE命令的USING BACKUPSET子语句和分配的辅助通道的数量大于或等于目标通道的数量,那么RMAN仍然使用备份集的活动数据库复制。
6)如果辅助通道不能访问要求的数据文件和归档redo日志文件的备份,那么复制失败。

以下示例分配3个辅助通道来复制数据库到磁盘
run
{
 ALLOCATE AUXILIARY CHANNEL c1 DEVICE TYPE disk;
 ALLOCATE AUXILIARY CHANNEL c2 DEVICE TYPE disk;
 ALLOCATE AUXILIARY CHANNEL c3 DEVICE TYPE disk;
 . . .
 DUPLICATE DATABASE . . . ;
}


4.1.2. 配置活动数据库复制的通道

对于活动数据库复制,不需要更改源数据库通道的配置或者配置辅助通道,但是,可以增加源数据库磁盘通道的并行配置,从而让RMAN并行地通过网络复制文件。

活动数据库复制的类型决定了哪种通道执行复制的主要工作:
1) 当使用映像复制来执行活动数据库复制时,主要的工作由目标通道来执行。在源数据库上配置多个目标通道可以提高复制的性能。
ALLOCATE CHANNEL tgt10 TYPE DISK;
ALLOCATE CHANNEL tgt20 TYPE DISK;
ALLOCATE CHANNEL tgt30 TYPE DISK;
ALLOCATE CHANNEL tgt40 TYPE DISK;
ALLOCATE AUXILIARY CHANNEL dup1 TYPE DISK;

2)当使用备份集来执行活动数据库复制时,主要的工作由辅助通道来执行。因此,建议增加额外的辅助通道。辅助通道的数量必须大于或等于目标通道的数量。使用备份集来进行活动数据库复制也启用了并行,可以提高复制过程的速度。


4.2.将数据库置于合适的状态

如果RMAN作为TARGET连接到源数据库,那么源数据库必须为复制处于合适的状态。

注:如果执行不使用TARGET连接的基于备份的复制,那么跳到下一节“启动RMAN和连接到数据库”。

为了确保源数据库在合适的状态:
1)如果源数据库实例没有挂载或打开,那么挂载或打开它。
2)如果执行活动数据库复制,那么确保满足以下额外的要求:
a.如果源数据库时打开的,那么必须启用归档。
b.如果源数据库没有打开,那么数据库不需要实例恢复。


4.3. RMAN连接到数据库

启动RMAN客户端,按照选择的复制技术的要求连接到数据库实例。RMAN客户端可以位于任何主机只要它可以通过网络连接到需要的数据库。

启动RMAN,分别连接到TARGET数据库和AUXILIARY实例:
1)在可以连接到需要的数据库实例的任何主机上启动RMAN客户端。
% rman

2) 在RMAN提示符下,为复制技术要求的数据库实例运行CONNECT命令。
a.对于使用映像复制的活动数据库复制,必须作为TARGET连接到源数据库,作为AUXILIARY连接到辅助实例。必须提供连接到辅助实例的网络服务名称。连接到恢复目录是可选的。在两个实例中,执行复制的用户的密码必须相同,任何具有SYSDBA或SYSBACKUP权限的用户都可以执行复制。
b.对于使用备份集的活动数据库复制,必须使用网络服务名称作为TARGET连接到源数据库。辅助实例使用这个网络服务名称连接到源数据库,然后获取复制需要的备份集。作为AUXILIARY连接到辅助实例。如果远程连接到辅助实例或者想使用DUPLICATE命令的PASSWORD FILE选项,那么使用网络服务名称连接到辅助实例。连接到恢复目录是可选的。在两个实例中,执行复制的用户的密码必须相同,任何具有SYSDBA或SYSBACKUP权限的用户都可以执行复制。到恢复目录的连接是可选的。
c.对于没有TARGET连接的基于备份的复制,必须作为AUXILIARY连接到辅助实例和作为CATALOG连接到恢复目录。
d.对于有TARGET连接的基于备份的复制,必须作为TARGET连接到源数据库,作为AUXILIARY连接到辅助实例。到恢复目录的连接是可选的。
e.对于没有TARGET连接和恢复目录连接的基于备份的复制,必须作为AUXILIARY连接到辅助实例。

注意:不能作为TARGET连接到备数据库

在以下示例中,使用网络服务名称建立到源数据库和辅助实例的连接。源数据库的网络服务名称是srcdb,辅助实例是dupdb。
% rman
RMAN> CONNECT TARGET sys@srcdb;
RMAN> CONNECT AUXILIARY sys@dupdb;


4.4. 复制数据库

RMAN通过使用DUPLICATE命令为复制数据库提供多个选项。

复制数据库命令:
DUPLICATE DATABASE

活动数据库复制命令:
DUPLICATE…ACTIVE DATABASE

创建备数据库命令:
DUPLICATE DATABASE … FOR STANDBY

创建Data Guard far sync实例命令:
DUPLICATE DATABASE … FOR FARSYNC

当你使用SET NEWNAME命令指定复制数据库文件的替换名称是,确保将DUPLICATE命令和SET NEWNAME包含在RUN块中。


5.在失败后重启复制

RMAN自动优化DUPLICATE命令,让它可以重复之前失败的DUPLICATE命令。

重复执行的DUPLICATE命令会提示哪些数据文件之前已经成功拷贝,不需要再重新拷贝。这对于所有复制类型都适用,不管是基于备份的复制(有无TARGET连接)或活动数据库复制。自动优化的DUPLICATE命令对于大型数据库在复制过程中失败时非常有用。

重启复制操作:
1)退出RMAN
2)使用SQL*Plus连接到辅助实例,然后使用最初使用的相同的SPFILE或PFILE启动实例到NOMOUNT模式。
3)退出SQL*Plus,启动RMAN。
4)像最初一样连接到相同的数据库。
5)重复执行DUPLICATE命令。
第二次的DUPLICATE命令执行以下操作:
a.定位最初的DUPLICATE命令已成功复制的数据文件。
b.为每个不需要再次复制的数据文件显示类似以下的信息:
RMAN-05560: Using previous duplicated file /oradata/new/data01.f
for datafile 1 with checkpoint SCN of 1654665
c.只还原缺失或不完整的数据文件,因此避免重新拷贝和还原所有的数据文件。

如果不想RMAN从之前失败的DUPLICATE操作中自动恢复,指定关键字NORESUME可以禁用自动优化的功能。在首次调用DUPLICATE中使用关键字NORESUME阻止后来的DUPLICATE命令为新数据库使用自动优化。


6. 复制数据库示例

6.1. 活动数据库复制

6.1.1. 使用备份集的活动数据库复制到远程ASM主机示例

以下示例假设以下场景:
1) 源主机和目标主机不同
2) 源数据库和复制数据库使用ASM来管理数据库文件
3) 复制数据库使用与源数据库不同的目录结构
4) 源主机的网络带宽有限制
5) 在复制过程完成后打开复制数据库

使用以下步骤为场景创建复制数据库:
1)按照“规划复制数据库”的步骤规划复制。包括以下任务:
a.选择适合场景和要求的复制技术。
因为源主机上的网络带宽有限,使用备份集执行活动数据库复制。
b.选择命名复制数据库文件的策略。
在这个示例中,使用初始化参数DB_CREATE_FILE_DEST指定复制数据库文件的位置。
c.在辅助示例上配置6个辅助通道。
在这个示例中,源数据库上配置了2个目标通道。为了让RMAN使用备份集执行活动数据库复制,辅助实例通道的数量必须大于或等于目标通道的数量
2)确保满足选择的复制技术的前提条件。
3)准备辅助实例。
a.在目的地主机上创建存储数据库文件的磁盘组。
如果不是已经存在,创建磁盘组+DGROUP2来存储复制数据库文件。
b.从源数据库复制密码文件到目的地数据库。
c.通过使用静态监听设置源数据库和辅助实例之间的Oracle网络服务。
d.启动辅助实例到NOMOUNT模式。
4)启动RMAN,作为TARGET连接到源数据库和作为AUXILIARY连接到辅助实例。
%rman
RMAN> CONNECT TARGET sys@srcdb as SYSDBA;
RMAN> CONNECT AUXILIARY sys@dupdb AS SYSBACKUP;
5)使用DUPLICATE命令复制数据库。SPFILE子语句指示RMAN从源数据库拷贝spfile到辅助实例。使用DB_CREATE_FILE_DEST参数指定用来存储复制数据库文件的磁盘组。
DUPLICATE DATABASE to dupdb
FROM ACTIVE DATABASE
 PASSWORD FILE
 SPFILE
 SET DB_CREATE_FILE_DEST=‘+DGROUP2’;


6.1.2. 使用映像副本的活动数据库复制到远程主机示例

以下示例假设以下场景:
1)源主机和目标主机不同
2)复制数据库使用与源数据库不同的目录结构
3)源数据库和复制数据库使用OMF来创建数据库文件
4)源数据库在复制过程中必须可用的
5)在复制过程完成后打开复制数据库

使用以下步骤为场景创建复制数据库:
1)按照“规划复制数据库”的步骤规划复制。包括以下任务:
a.选择适合场景和要求的复制技术。
因为源主机和目的地主机之间的带宽有限,使用映像副本执行活动数据库复制。
b.选择命名复制数据库文件的策略。
在这个示例中,使用初始化参数DB_ FILE_NAME_CONVERT和LOG_FILE_NAME_CONVERT指定如何转换源数据库文件名称到复制数据库文件名称。
c.当使用映像副本执行活动数据库复制时,RMAN使用映像副本要么没有配置辅助通道,要么辅助通道的数量小于目标通道的数量。因此,不需要配置额外的通道来执行映像拷贝的活动数据库复制。
2)确保满足选择的复制技术的前提条件。
3)准备辅助实例。
a.在目的地主机上创建存储数据库文件的目录。
在这个示例中,创建目录/app/db_home2/database来存储复制数据文件,控制文件和目录/app/db_home2/logfiles存储在线redo日志文件。
b.在目的地主机上,为辅助实例创建最小的初始化参数文件。文件称为initdup.ora,位于目录/app/db_home2/database目录。它包含以下行:
DB_NAME=dup
DB_DOMAIN = dup.example.com
c.从源数据库复制密码文件到目的地数据库。
d.通过使用静态监听设置源数据库和辅助实例之间的Oracle网络服务。
e.启动辅助实例到NOMOUNT模式。
4)启动RMAN,作为TARGET连接到源数据库和作为AUXILIARY连接到辅助实例。
%rman
RMAN> CONNECT TARGET sys@srcdb as SYSDBA;
RMAN> CONNECT AUXILIARY sys@dupdb AS SYSBACKUP;
5)使用DUPLICATE命令复制数据库。包含SPFILE子语句和初始化参数DB_ FILE_NAME_CONVERT和LOG_FILE_NAME_CONVERT来指定来自源数据库的spfile必须给辅助实例使用。

复制数据库文件使用OMF生成的名称存储在复制数据库。SPFILE子语句的PARAMETER_VALUE_CONVERT选项指定路径名称/app/dbhome1应该转换到/app/db_home2。

DUPLICATE DATABASE TO dupdb
FROM ACTIVE DATABASE
 PASSWORD FILE
 SPFILE PARAMETER_VALUE_CONVERT=‘/app/dbhome1’,‘/app/db_home2’
 SET db_file_name_convert=‘/app/dbhome1/dbs’,‘/app/db_home2/database/dbs’
 SET log_file_name_convert=‘/app/dbhome1/log’,‘/app/db_home2/logfiles’;


6.2. 基于备份的数据库复制

6.2.1. 没有TARGET连接或恢复目录连接的基于备份的数据库复制

以下示例假设以下场景:
1)源主机和目标主机不同
2)复制数据库使用与源数据库不同的目录结构
3)源数据库的完整备份包括控制文件,数据文件和归档日志文件,备份在目标主机的/backups/db_files目录下
4)没有连接到TARGET数据库或恢复目录
5)在复制过程完成后打开复制数据库
6)在源主机和目标主机使用相同的目录结构存储备份
7)源数据库的DB_NAME是db12,复制数据库是dup

使用以下步骤为场景创建复制数据库:
1)按照“规划复制数据库”的步骤规划复制。包括以下任务:
a.选择适合场景和要求的复制技术。
在这个示例中,执行没有TARGET连接和恢复目录连接的基于备份的复制。因此,使用BACKUP LOCATION子语句指定源数据库备份的位置。
b.因为复制数据库使用与源数据库不同的目录结构,你必须选择生成复制数据库文件的策略。
在这个示例中,命令SET NEWNAME FOR DATABASE指定数据文件和控制文件的位置。DUPLICATE命令的LOGFILE子语句指定在线redo日志文件的位置。
c.使用源数据库上使用的相同的目录结构拷贝需要的备份到目的地主机。
在这个示例中,数据文件和归档redo日志文件的备份必须存储在目的地主机的/backups/db_files中,控制文件和spfile的备份存储在/backups/cf中
2)确保满足选择的复制技术的前提条件。
3)准备辅助实例。
a.在目的地主机上创建存储数据库文件的目录。
在这个示例中,创建目录/oracle2/database来存储复制数据文件,控制文件和目录/oracle2/database/logfiles存储在线redo日志文件。
b.在目的地主机上,为辅助实例创建最小的初始化参数文件。文件称为initdup.ora,位于目录/oracle2/database目录。它包含以下行:
DB_NAME=dup
DB_DOMAIN = dup.example.com
c.使用orapwd工具为辅助实例创建密码文件。密码文件是必需的因为复制数据库在远程主机上创建。
d.通过使用静态监听设置源数据库和辅助实例之间的Oracle网络服务。
e.启动辅助实例到NOMOUNT模式。
4)启动RMAN,作为TARGET连接到源数据库和作为AUXILIARY连接到辅助实例。
%rman
RMAN> CONNECT AUXILIARY sys@dup AS SYSBACKUP;
5)使用DUPLICATE命令复制数据库。包含BACKUP LOCATOIN来指定来自源数据库的备份位置。包含SET NEWNAME FOR DATABASE和DUPLICATE命令在RUN块中。LOGFILE子语句指定在线redo日志文件的位置。

run
{
 set newname for database to ‘/oracle2/database/%b’;
 duplicate database ‘db12’ to ‘dup’
  logfile
    group 1 (‘/oracle2/database/logs/r1.f’,‘/ oracle2/database/logs/r2.f’) size 4m reuse,
    group 2 (‘/ oracle2/database/logs/r3.f’,‘/oracle2/database/logs/r4.f’) size 4m reuse
backup location ‘/backups/db_files’;
}

可以使用NFS或共享磁盘的方式来将备份给辅助实例使用。如果不使用共享的方式,则可以采用以下两种方法来进行基于备份集的数据库复制:
1)在没有TARGET和恢复目录连接时,将备份拷贝到目标主机,然后使用DUPLICATE的BACKUP LOCATION选项指定备份位置
2)源主机和目标主机使用相同的备份路径。如果源主机的备份存放在/disk1目录下,而目的地主机要使用/disk2目录来存储备份,则需要按以下步骤来执行复制:
a.在源主机上创建与目标主机相同的存放备份的目录/disk2,
b.在源主机上使用以下其中一种方法将备份从/disk1拷贝到/disk2上:
i)在源主机上使用RMAN作为TARGET连接到源数据库,然后使用BACKUP COPY OFDATABASE 命令将备份从源主机/disk1目录下拷贝到源主机的/disk2目录下。在这种情况下,RMAN会自动登记备份。
ii)使用操作系统工具将备份将备份从源主机/disk1目录下拷贝到源主机的/disk2目录下,然后使用RMAN作为TARGET连接到源数据库,使用CATALOG命令更新源控制文件里记录的备份位置信息
c.手动将源主机/disk2目录下的备份传输到目标主机的/disk2目录下,辅助实例将会在目标主机的/disk2目录下搜索备份,然后还原。


6.2.2.有恢复目录连接的不同目录结构的基于备份的数据库复制

以下示例假设以下场景:
1)源主机和目的地主机不同。目的地主机使用OMF。
2)复制数据库使用与源数据库不同的目录结构来存储数据库文件。复制数据库的数据库文件存储在/app/oracle2/dbs目录
3)源数据库的完全备份在源主机上。数据文件和归档redo日志文件的备份存储在/bkups/db_files,控制文件和spfile的备份存储在/bkups/cf。
4)没有到TARGET数据库但是有恢复目录的连接
5)在复制过程完成后不打开复制数据库
6)源数据库的只读表空间必须从复制数据库中排除
7)源数据库的DB_NAME是ora,它的网络服务名称是oradb。复制数据库的DB_NAME是dup,他的网络服务名称是dupdb。

使用以下步骤为场景创建复制数据库:
1)按照“规划复制数据库”的步骤规划复制。包括以下任务:
a.选择适合场景和要求的复制技术。
在这个示例中,执行没有TARGET连接但有恢复目录连接的基于备份的复制。
b.选择生成复制数据库文件的策略。
由于复制数据库使用OMF,在辅助实例的初始化参数文件中使用DB_CREATE_FILE_DEST参数指定复制数据库存储的目录。
c.使用DUPLICATE命令的NOOPEN子语句指定复制数据库在复制完成之后必须不要使用RESETLOGS打开。
d.使用源数据库上使用的相同的目录结构拷贝需要的备份到目的地主机。
在这个示例中,数据文件和归档redo日志文件的备份必须存储在目的地主机的/bkups/db_files中,控制文件和spfile的备份存储在/bkups/cf中。
2)确保满足选择的复制技术的前提条件。
3)准备辅助实例。
a.在目的地主机上创建存储数据库文件的目录。
在这个示例中,创建目录/app/oracle2/dbs来存储复制数据文件,控制文件,spfile和在线redo日志文件。
b.在目的地主机上,为辅助实例创建最小的初始化参数文件。文件称为initdup.ora,位于目录/app/oracle2/dbs目录。它包含以下行:
DB_NAME=dup
DB_DOMAIN = dup.example.com
DB_CREATE_FILE_DEST = /app/oracle2/dbs
c.使用orapwd工具为辅助实例创建密码文件。密码文件是必需的因为复制数据库在远程主机上创建。
d.通过使用静态监听设置源数据库和辅助实例之间的Oracle网络服务。
e.启动辅助实例到NOMOUNT模式。
4)启动RMAN,作为TARGET连接到源数据库和作为AUXILIARY连接到辅助实例。
%rman
RMAN> CONNECT CATALOG rco@catdb;
RMAN> CONNECT AUXILIARY sys@dupdb;
5)使用DUPLICATE命令复制数据库。包含SKIP READONLY子语句排除只读表空间。因为没有连接到TARGET数据库,你必须指定正在复制的TARGET数据库的名称。
DUPLICATE DATABASE db12 TO dup
SKIP READONLY;


6.2.3.有TARGET连接的相同目录结构的基于备份的数据库复制

以下示例假设以下场景:
1)源主机和目的地主机不同。
2)复制数据库使用与源数据库相同的目录结构来存储数据库文件。
在源主机上,数据文件,控制文件和spfile的存储在/app/db_home1/database,在线redo日志文件存储在/app/db_home1/logfiles。
3) 源数据库包括控制文件,数据文件,归档redo日志文件的完全备份可用。
在源主机上,数据文件和归档redo日志文件的备份存储在/bkups/oradata/db_files,控制文件和spfile的备份存储在/bkups/oradata/cf。
4)有到TARGET数据库的连接
5)在复制过程完成后打开复制数据库
6)源数据库的表空间HR和SH必须从复制数据库中排除。
源数据库中剩余的表空间是自包含的,没有链接到hr和sh表空间。
7)源数据库的DB_NAME是src,它的网络服务名称是srcdb。复制数据库的DB_NAME是dup,他的网络服务名称是dupdb。

使用以下步骤为场景创建复制数据库:
1)按照“规划复制数据库”的步骤规划复制。包括以下任务:
a.选择适合场景和要求的复制技术。
在这个示例中,执行有TARGET连接的基于备份的复制。
b.因为复制数据库使用与源数据库相同的目录结构,你不需要指定替换的文件命名策略。然而,使用DUPLICATE命令中的NOFILENAMECHECK子语句阻止RMAN检查源数据库的数据文件和在线redo日志文件使用的名称与复制数据库的是否相同
c.配置3个额外的辅助通道以增强复制过程的性能。
d.使用源数据库上相同的目录结构拷贝需要的备份到目的地主机。
在这个示例中,数据文件和归档redo日志文件的备份必须存储在目的地主机的/bkups/oradata/db_files中,控制文件和spfile的备份存储在/bkups/oradata/cf中。
2)确保满足选择的复制技术的前提条件。
3)准备辅助实例。
a.在目的地主机上创建存储数据库文件的目录。
在这个示例中,创建目录/app/db_home1/database来存储复制数据文件,控制文件和spfile,/app/db_home1/logfiles存储在线redo日志文件。
b.在目的地主机上,为辅助实例创建最小的初始化参数文件。文件称为initdup.ora,位于目录/app/oracle2/dbs目录。它包含以下行:
DB_NAME=dup
DB_DOMAIN = dup.example.com
c.通过从源数据库拷贝密码文件到复制数据库来创建辅助实例的密码文件。
d.通过使用静态监听设置源数据库和辅助实例之间的Oracle网络服务。
e.启动辅助实例到NOMOUNT模式。
4)启动RMAN,作为TARGET连接到源数据库和作为AUXILIARY连接到辅助实例。
%rman
RMAN> CONNECT TARGET sys@dupdb AS SYSBACKUP;
RMAN> CONNECT AUXILIARY /
5)使用DUPLICATE命令复制数据库。包含SKIP TABLESPACE子语句排除指定的表空间。使用SPFILE子语句指定从源数据库还原spfile和拷贝到复制数据库:

DUPLICATE DATABASE TO dup
 SPFILE
SKIP TABLESPACE HR, SH
NOFILENAMECHECK;


6.2.4.使用脚本进行基于备份的数据库复制

本示例演示如何使用脚本自动化复制TARGET数据库的过程。

示例假设以下场景:
1)TARGET数据库的备份对辅助示例是可用的。
2)存在到包含TARGET数据库元数据的RMAN恢复目录的连接(到TARGET数据库的连接不是必须的)。
3)源数据库和复制数据库都使用OMF。
4)操作系统是Linux或UNIX。
5)在辅助数据库主机上创建了审计目录。
6)满足基于备份的复制的前提要求。

在本示例中提供的脚本执行以下任务:
1)删除辅助数据库。
2)备份TARGET数据库。
3)创建虚设的辅助实例和以NOMOUNT模式打开。
4)通过使用TARGET数据库的备份和RMAN恢复目录中的元数据复制TARGET数据库。
复制数据库的控制文件存储为+REDO/ORACLE_SID/CONTROLFILE/cf3.ctl和数据文件存储在+DATA目录。
5)验证要求的对象已在复制数据库中创建。

使用没有TARGET连接的基于备份的复制来复制target数据库:
1)为辅助示例创建pfile。Pfile只包含DB_NAME初始化参数,设置复制数据库的SID。
以下pfile文件称为init_dup.ora,位于目录/home/oracle目录,设置DB_NAME参数。使用复制数据库的SID替换dup_db
*.db_name = ‘dup_db
2)使用以下的内容和适当的更改编辑脚本:
a.使用辅助实例的Oracle家目录替换ORACLE_HOME变量的值
b.使用你想用来存储日志文件的目录替换logdir变量的值
c.使用适合复制场景的值替换以下占位符:
dup_db:辅助实例的SID和服务名称
tgt_db:TARGET数据库的SID和服务名称
sys_pswd:TARGET数据库SYS用户的密码
rman_cat_user:RMAN恢复目录的用户名称
cat_user_pswd:RMAN恢复目录的用户rman_cat_user的密码
rman_catalog_db:RMAN恢复目录数据库的SID
system_pswd:TARGET数据库中SYSTEM用户的密码
d.如果你想使用与+REDO/ORACLE_SID/CONTROLFILE/cf3.ctl不同的名称和位置存储复制数据库控制文件,那么使用适合你的复制场景的值替换dup_aux_db函数中的control_files的值。
e.如果你想使用与+DATA不同的目录存储复制的数据文件,那么使用适合你的复制场景的值替换dup_aux_db函数中的db_create_file_dest的值。


在复制主机上运行脚本:

#!/bin/bash
#设置环境变量
export ORACLE_HOME=/u01/app/oracle/product/11.2.0.4/dbhome_2
export ORACLE_BASE=/uo1/app/oracle
export ORACLE_SID=dup_db
export PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin:$ORACLE_HOME/Opatch
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/rdbms/lib:/lib:/usr/lib;
export LD_LIBRARY_PATH
export logdir=/home/oracle/log
export dt=‘date +%y%m%d%H%M%S’
export NLS_DATE_FORMAT=‘DD-MM-YYYY HH24:MI:SS’

#删除辅助数据库
function drop_aux_db {
export ORACLE_SID=dup_db
$ORACLE_HOME/bin/sqlplus -s ‘/ as sysdba’ <<EOF2
set pagesize 999 linesize 999 heading off feedback off
select name, open_mode from v\$database;
shutdown immediate;
startup mount exclusive restrict;
drop database;
exit;
EOF2
}

#备份目标数据库
echo “Backup the target database”
function backup_source_db {
$ORACLE_HOME/bin/rman target sys/sys_pswd@tgt_db catalog
rman_cat_user/cat_user_pswd@rman_catalog_db <<EOF
RUN {
 backup as backupset cumulative incremental level 1 database include
current controlfile plus archivelog not backed up delete input;}
exit;
EOF
}

#列出目标数据库的备份
sleep 120
echo “List the backup of the target database”
function check_source_db_backup {
$ORACLE_HOME/bin/rman target sys/sys_pswd@tgt_db catalog
rman_cat_user/cat_user_pswd@rman_catalog_db <<EOF
LIST BACKUP OF DATABASE COMPLETED AFTER ‘(SYSDATE-1/24)’;
EOF
}

#启动辅助实例
echo “Start the auxiliary database in FORCE NOMOUNT mode”
function nomount_aux_db {
export ORACLE_SID=dup_db
$ORACLE_HOME/bin/rman target / <<EOF2
startup force nomount pfile=‘/home/oracle/init_dup.ora’;
exit;
EOF2
}

#复制目标数据库
echo “Duplicate the target database”
function dup_aux_db {
export ORACLE_SID=dup_db
$ORACLE_HOME/bin/rman catalog rman_cat_user/
cat_user_pswd@rman_catalog_db AUXILIARY / <<EOF
duplicate database tgt_db to dup_db spfile
set control_files ‘+REDO/${ORACLE_SID}/CONTROLFILE/cf3.ctl’
set db_create_file_dest ‘+DATA/’ ;
exit;
EOF
}

#检查目标数据库的模式对象
echo “Check schema objects on the target”
function check_source_db {
$ORACLE_HOME/bin/sqlplus -s system/system_pswd@tgt_db <<EOF2
set pagesize 999 linesize 999 heading off feedback off
select name, open_mode from v\$database;
select table_name, num_rows from dba_tables where owner=‘SOE’;
exit;
EOF2
}

#检查辅助实例的模式对象
echo “Check schema objects on the auxiliary”
function check_aux_db {
export ORACLE_SID=dup_db
$ORACLE_HOME/bin/sqlplus -s ‘/ as sysdba’ <<EOF2
set pagesize 999 linesize 999 heading off feedback off
select name, open_mode from v\$database;
select table_name, num_rows from dba_tables where owner=‘SOE’;
exit;
EOF2
}

drop_aux_db
backup_source_db
check_source_db_backup
nomount_aux_db
dup_aux_db
check_source_db
check_aux_db




来源:《Oracle Database Backup and Recovery User’s Guide, 19c》

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐