使用通过数据库链接直接导入 Oracle Data Pump 将本地 Oracle 数据库迁移到 Amazon RDS for Oracle - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用通过数据库链接直接导入 Oracle Data Pump 将本地 Oracle 数据库迁移到 Amazon RDS for Oracle

由 Rizwan Wangde (AWS) 编写

环境:生产

来源:本地 Oracle 数据库

目标:Amazon RDS for Oracle

R 类型:更换平台

工作负载:Oracle

技术:迁移;数据库

AWS 服务:AWS DMS;AWS Direct Connect;Amazon RDS

许多模式包括使用 Oracle Data Pump 将本地 Oracle 数据库迁移至 Amazon RDS for Oracle,Oracle Data Pump 是一种原生 Oracle 实用程序,是迁移大型 Oracle 工作负载的首选方式。这些模式通常涉及将应用程序架构或表导出到转储文件中,将转储文件传输到 Amazon RDS for Oracle 上的数据库目录,然后从转储文件中导入应用程序架构和数据。

使用这种方法,迁移可能需要更长时间,具体取决于数据的大小以及将转储文件传输到 Amazon RDS 实例所需的时间。此外,转储文件存储在 Amazon RDS 实例的 Amazon Elastic Block Store (Amazon EBS) 卷,该卷必须足够大,可以存放数据库和转储文件。导入后删除转储文件后,空余空间将无法恢复,因此您需要继续为未使用的空间付费。

这种模式通过数据库链接使用 Oracle Data Pump API (DBMS_DATAPUMP) 在 Amazon RDS 实例执行直接导入,从而缓解了这些问题。该模式在源数据库和目标数据库之间启动同步导出和导入管道。这种模式不需要为转储文件调整 EBS 卷大小,因为该卷上不会创建或存储任何转储文件。这种方法可以节省 每月未使用磁盘空间的成本。

先决条件

  • 一个 有效的 Amazon Web Services (AWS) 账户。

  • 一种虚拟私有云 (VPC),配置了跨越至少两个可用区的私有子网,用于为 Amazon RDS 实例提供网络基础设施。

  • 本地数据中心中的 Oracle 数据库。

  • 单个可用区中现有 Amazon RDS Oracle 实例。使用单个可用区可提高迁移期间的写入性能。可以在割接前 24-48 小时启用多可用区部署。

  • AWS Direct Connect(建议用于大型数据库)。

  • 本地网络连接和防火墙规则配置为允许从 Amazon RDS 实例至本地 Oracle 数据库的入站连接。

限制

  • Amazon RDS for Oracle 的数据库大小限制为 64 TiB (截至 2022 年 12 月)。

产品版本

  • 源数据库:Oracle 数据库 10g 版本 1 及以上版本。

  • 目标数据库:有关 Amazon RDS 上支持的版本和版本的最新列表,请参阅 Amazon RDS 文档中的 Amazon RDS for Oracle

源技术堆栈

  • 在本地或云自托管式 Oracle 数据库

目标技术堆栈

  • Amazon RDS for Oracle

目标架构

下图显示了在单可用区环境中从本地 Oracle 数据库迁移至Amazon RDS for Oracle 的架构。箭头方向描绘了架构数据流。该图没有显示哪个组件正在启动连接。

""
  1. Amazon RDS for Oracle 实例连接至本地源 Oracle 数据库,通过数据库链接执行满负荷迁移。

  2. AWS DMS 连接至本地源 Oracle 数据库,以使用更改数据捕获 (CDC) 执行持续复制。

  3. CDC 更改将应用于 Amazon RDS for Oracle 数据库。

Amazon Web Services

  • AWS Database Migration Service (AWS DMS) 可帮助您将数据存储迁移到 Amazon Web Services Cloud,或者在云和本地设置的组合之间迁移。此模式使用 CDC 和仅复制数据更改设置。

  • AWS Direct Connect 通过标准的以太网光纤电缆将内部网络链接到 Direct Connect 位置。通过此连接,您可以直接创建连接到公有 Amazon Web Services 的虚拟接口,同时绕过网络路径中的互联网服务提供商。

  • Amazon Relational Database Service (Amazon RDS) for Oracle 可帮助您在 Amazon Web Services Cloud 中设置、操作和扩展 Oracle 关系数据库。

其他工具

尽管 AWS Direct Connect 在本地网络和 AWS 之间使用专用的私有网络连接,但要为传输中的数据提供额外的安全性和数据加密,请考虑使用以下选项:

任务描述所需技能

设置从目标数据库到源数据库的网络连接。

配置本地网络和防火墙以允许从目标 Amazon RDS 实例到本地源 Oracle 数据库的传入连接。

网络管理员、安全工程师

创建具有相应权限的数据库用户。

在本地源 Oracle 数据库中创建具有使用 Oracle Data Pump 在源和目标之间迁移数据的权限的数据库用户。

GRANT CONNECT to <migration_user>; GRANT DATAPUMP_EXP_FULL_DATABASE to <migration_user>; GRANT SELECT ANY TABLE to <migration_user>;
数据库管理员

为 AWS DMS CDC 迁移准备本地源数据库。

(可选)在 Oracle Data Pump 满负荷运行完成后,为本地源 Oracle 数据库准备 AWS DMS CDC 迁移:

  1. 配置在 Oracle Data Pump 迁移期间管理 FLASHBACK 所需的其他权限。

    GRANT FLASHBACK ANY TABLE to <migration_user>; GRANT FLASHBACK ARCHIVE ADMINISTER to <migration_user>;
  2. 要在 AWS DMS 的自管理 Oracle 来源上配置所需的用户账户权限,请参阅 AWS DMS 文档

  3. 要使用 AWS DMS 为 CDC 准备 Oracle 自行管理的源数据库,请参阅 AWS DMS 文档

数据库管理员

安装和配置 SQL Developer。

安装和配置 SQL Developer 以连接源数据库和目标数据库并运行 SQL 查询。

数据库管理员,迁移工程师

生成脚本来创建表空间。

使用以下示例 SQL 查询在源数据库生成脚本。

SELECT 'CREATE TABLESPACE ' tablespace_name ' DATAFILE SIZE 1G AUTOEXTEND ON MAXSIZE UNLIMITED;' from dba_tablespaces where tablespace_name not in ('SYSTEM', 'SYSAUX','TEMP','UNDOTBS1') order by 1;

脚本将应用至目标数据库。

数据库管理员

生成用于创建用户、配置文件、角色和权限脚本。

要生成用于创建数据库用户、配置文件、角色和权限的脚本,请使用 Oracle Support 文档 如何使用 dbms_metadata.get_ddl 提取用户的 DDL,包括权限和角色(文档 ID 2739952.1)(需要 Oracle 帐户)。

脚本将应用至目标数据库。

数据库管理员
任务描述所需技能

创建到源数据库的数据库链接并验证连接性。

要创建到本地源数据库的数据库链接,您可以使用以下示例命令。

CREATE DATABASE LINK link2src CONNECT TO <migration_user_account> IDENTIFIED BY <password> USING '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<dns or ip address of remote db>) (PORT=<listener port>))(CONNECT_DATA=(SID=<remote SID>)))';

若要验证连接,请运行以下 SQL 命令。

select * from dual@link2src;

如果响应为X,则连接成功。

数据库管理员

运行脚本,以准备目标实例。

运行之前生成的脚本,以准备目标 Amazon RDS for Oracle 实例:

  1. Tablespaces

  2. 配置文件

  3. 角色

这有助于确保 Oracle Data Pump 迁移可以创建模式及其对象。

数据库管理员,迁移工程师
任务描述所需技能

迁移所需架构。

要将所需的架构从源本地数据库迁移至目标 Amazon RDS 实例,请使用其他信息部分中的代码:

  • 要迁移单个架构,请运行其他信息部分中的代码 1

  • 要迁移多个架构,请运行其他信息部分中的代码 2

要调整迁移的性能,您可以通过运行以下命令来调整并行进程的数量。

DBMS_DATAPUMP.SET_PARALLEL (handle => v_hdnl, degree => 4);
数据库管理员

收集架构统计信息以提高性能。

收集架构统计信息命令返回为数据库对象收集的 Oracle 查询优化器统计信息。通过使用此信息,优化器可以为针对这些对象的任何查询选择最佳执行计划。

EXECUTE DBMS_STATS.GATHER_SCHEMA_STATS(ownname => '<schema_name>');
数据库管理员
任务描述所需技能

捕获源本地 Oracle 数据库上的 SCN。

在源本地 Oracle 数据库上捕获 系统更改号 (SCN)。您将使用 SCN 进行满载导入,并用作 CDC 复制起点。

若要在源数据库上生成当前 SCN,请运行以下 SQL 语句。

SELECT current_scn FROM V$DATABASE;
数据库管理员

执行架构的满负荷迁移。

要将所需的架构 (FULL LOAD) 从源本地数据库迁移至目标 Amazon RDS 实例,请执行以下操作:

  • 要迁移单个架构,请运行其他信息部分中的代码 3

  • 要迁移多个架构,请运行其他信息部分中的代码 4

在代码中,将 <CURRENT_SCN_VALUE_IN_SOURCE_DATABASE> 替换为您从源数据库捕获的 SCN。

DBMS_DATAPUMP.SET_PARAMETER (handle => v_hdnl, name => 'FLASHBACK_SCN', value => <CURRENT_SCN_VALUE_IN_SOURCE_DATABASE>);

要调整迁移的性能,您可以调整并行进程的数量。

DBMS_DATAPUMP.SET_PARALLEL (handle => v_hdnl, degree => 4);
数据库管理员

在迁移架构下禁用触发器。

在开始仅限 AWS DMS CDC 任务之前,请在迁移的架构TRIGGERS下禁用。

数据库管理员

收集架构统计信息以提高性能。

收集架构统计信息命令返回为数据库对象收集的 Oracle 查询优化器统计信息。通过使用此信息,优化器可以为针对这些对象的任何查询选择最佳执行计划。

EXECUTE DBMS_STATS.GATHER_SCHEMA_STATS(ownname => '<schema_name>');
数据库管理员

使用 AWS DMS 执行从源至目标的持续复制。

使用 AWS DMS 执行从源 Oracle 数据库到目标 Amazon RDS for Oracle 实例的持续复制。

有关更多信息,请参阅使用 AWS DMS 创建持续复制任务 以及博客文章如何在 AWS DMS 中使用本机 CDC 支持

数据库管理员,迁移工程师
任务描述所需技能

在割接前 48 小时在实例上启用多可用区以在切换之前启用。

如果这是生产实例,我们建议在 Amazon RDS 实例上启用多可用区部署,以提供高可用性 (HA) 以及灾难恢复 (DR) 的优势。

数据库管理员,迁移工程师

停止仅限 AWS DMS CDC 的任务 (如果 CDC 已开启)。

  1. 确保 AWS DMS 任务的 Amazon CloudWatch 指标上的源延迟和目标延迟显示 0 秒。

  2. 停止仅限 AWS DMS CDC 任务。

数据库管理员

启用触发器。

启用您在创建 CDC 任务前禁用的触发器。

数据库管理员

AWS

Oracle 文档

代码 1:仅限满载迁移,单应用程序架构

DECLARE v_hdnl NUMBER; BEGIN v_hdnl := DBMS_DATAPUMP.OPEN(operation => 'IMPORT', job_mode => 'SCHEMA', remote_link => '<DB LINK Name to Source Database>', job_name => null); DBMS_DATAPUMP.ADD_FILE( handle => v_hdnl, filename => 'import_01.log', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file); DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'SCHEMA_EXPR','IN (''<schema_name>'')'); -- To migrate one selected schema DBMS_DATAPUMP.METADATA_FILTER (hdnl, 'EXCLUDE_PATH_EXPR','IN (''STATISTICS'')'); -- To prevent gathering Statistics during the import DBMS_DATAPUMP.SET_PARALLEL (handle => v_hdnl, degree => 4); -- Number of parallel processes performing export and import DBMS_DATAPUMP.START_JOB(v_hdnl); END; /

代码 2:仅限满载迁移,多应用程序架构

DECLARE v_hdnl NUMBER; BEGIN v_hdnl := DBMS_DATAPUMP.OPEN(operation => 'IMPORT', job_mode => 'SCHEMA', remote_link => '<DB LINK Name to Source Database>', job_name  => null); DBMS_DATAPUMP.ADD_FILE( handle => v_hdnl, filename => 'import_01.log', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file); DBMS_DATAPUMP.METADATA_FILTER (v_hdnl, 'SCHEMA_LIST', '''<SCHEMA_1>'',''<SCHEMA_2>'', ''<SCHEMA_3>'''); -- To migrate multiple schemas DBMS_DATAPUMP.METADATA_FILTER (v_hdnl, 'EXCLUDE_PATH_EXPR','IN (''STATISTICS'')'); -- To prevent gathering Statistics during the import DBMS_DATAPUMP.SET_PARALLEL (handle => v_hdnl, degree => 4); -- Number of parallel processes performing export and import DBMS_DATAPUMP.START_JOB(v_hdnl); END; /

代码 3:仅限 CDC 的任务之前的满载迁移,单应用程序架构

DECLARE v_hdnl NUMBER; BEGIN v_hdnl := DBMS_DATAPUMP.OPEN(operation => 'IMPORT', job_mode => 'SCHEMA', remote_link => '<DB LINK Name to Source Database>', job_name => null); DBMS_DATAPUMP.ADD_FILE( handle => v_hdnl, filename => 'import_01.log', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file); DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'SCHEMA_EXPR','IN (''<schema_name>'')'); -- To migrate one selected schema DBMS_DATAPUMP.METADATA_FILTER (v_hdnl, 'EXCLUDE_PATH_EXPR','IN (''STATISTICS'')'); -- To prevent gathering Statistics during the import DBMS_DATAPUMP.SET_PARAMETER (handle => v_hdnl, name => 'FLASHBACK_SCN', value => <CURRENT_SCN_VALUE_IN_SOURCE_DATABASE>); -- SCN required for AWS DMS CDC only task. DBMS_DATAPUMP.SET_PARALLEL (handle => v_hdnl, degree => 4); -- Number of parallel processes performing export and import DBMS_DATAPUMP.START_JOB(v_hdnl); END; /

代码 4:仅限 CDC 任务之前的满载迁移,多应用程序架构

DECLARE v_hdnl NUMBER; BEGIN v_hdnl := DBMS_DATAPUMP.OPEN (operation => 'IMPORT', job_mode  => 'SCHEMA', remote_link => '<DB LINK Name to Source Database>', job_name => null); DBMS_DATAPUMP.ADD_FILE (handle => v_hdnl, filename => 'import_01.log', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file); DBMS_DATAPUMP.METADATA_FILTER (v_hdnl, 'SCHEMA_LIST', '''<SCHEMA_1>'',''<SCHEMA_2>'', ''<SCHEMA_3>'''); -- To migrate multiple schemas DBMS_DATAPUMP.METADATA_FILTER (v_hdnl, 'EXCLUDE_PATH_EXPR','IN (''STATISTICS'')'); -- To prevent gathering Statistics during the import DBMS_DATAPUMP.SET_PARAMETER (handle => v_hdnl, name => 'FLASHBACK_SCN', value => <CURRENT_SCN_VALUE_IN_SOURCE_DATABASE>); -- SCN required for AWS DMS CDC only task. DBMS_DATAPUMP.SET_PARALLEL (handle => v_hdnl, degree => 4); -- Number of parallel processes performing export and import DBMS_DATAPUMP.START_JOB(v_hdnl); END; /

混合迁移方法可更好地发挥作用的场景

在极少数情况下,源数据库包含具有数百万行和非常大的 LOBSEGMENT 列的表,此模式会减慢迁移速度。Oracle 通过网络链路逐一迁移 LOBSegments。它从源表中提取单行 (以及 LOB 列数据),然后将该行插入目标表,重复该过程,直到所有行都迁移完毕。通过数据库链接进行的 Oracle Data Pump 不支持 LOBSegments 批量加载或直接路径加载机制。

在这种情况下,我们建议采取以下:

  • 通过添加以下元数据过滤器,在 Oracle Data Pump 迁移期间跳过已识别表。

    dbms_datapump.metadata_filter(handle =>h1, name=>'NAME_EXPR', value => 'NOT IN (''TABLE_1'',''TABLE_2'')');
  • 使用 AWS DMS 任务 (满载迁移,必要时可复制 CDC) 迁移已识别的表。AWS DMS 将从源 Oracle 数据库提取多行,然后将它们成批插入到目标 Amazon RDS 实例,这样可以提高性能。