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

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

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

由 Rizwan Wangde 创作 () AWS

环境:生产

来源:本地 Oracle 数据库

目标:Amazon f RDS or Oracle

R 类型:更换平台

工作负载:Oracle

技术:迁移;数据库

AWS服务:AWSDMS; AWS Direct Connect; 亚马逊 RDS

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

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

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

先决条件

  • 一个有效的亚马逊 Web Services (AWS) 账户。

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

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

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

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

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

限制

  • 亚马逊上RDS适用于甲骨文的数据库大小限制为64 TiB(截至2022年12月)。

产品版本

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

  • 目标数据库:有关亚马逊上支持版本和版本的最新列表RDS,请参阅AWS文档中的 Ama zon f RDS or Oracle

源技术堆栈

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

目标技术堆栈

  • RDS适用于甲骨文的亚马逊

目标架构

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

本地部署 Oracle 数据库的满负荷迁移。
  1. Amazon f RDS or Oracle 实例连接到本地源 Oracle 数据库,通过数据库链接执行满负荷迁移。

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

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

AWS服务

其他工具

尽管 AWSDirect 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>;
DBA

准备本地源数据库以进行AWSDMSCDC迁移。

(可选)准备本地源 Oracle 数据库,以便在 Oracle 数据泵满负荷完成后进行AWSDMSCDC迁移:

  1. 配置 Oracle 数据泵迁移FLASHBACK期间管理所需的其他权限。

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

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

DBA

安装和配置SQL开发人员。

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

DBA,迁移工程师

生成脚本来创建表空间。

使用以下示例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;

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

DBA

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

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

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

DBA
任务描述所需技能

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

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

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,则连接成功。

DBA

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

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

  1. Tablespaces

  2. 配置文件

  3. 角色

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

DBA,迁移工程师
任务描述所需技能

迁移所需架构。

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

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

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

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

DBMS_DATAPUMP.SET_PARALLEL (handle => v_hdnl, degree => 4);
DBA

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

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

EXECUTE DBMS_STATS.GATHER_SCHEMA_STATS(ownname => '<schema_name>');
DBA
任务描述所需技能

在源本地部署 Oracle 数据库SCN上捕获数据。

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

要生成源数据库SCN的电流,请运行以下SQL语句。

SELECT current_scn FROM V$DATABASE;
DBA

执行架构的满负荷迁移。

要将所需的架构 (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);
DBA

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

在开始AWSDMSCDC仅限-only 的任务之前,请禁用已迁移架构TRIGGERS下的。

DBA

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

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

EXECUTE DBMS_STATS.GATHER_SCHEMA_STATS(ownname => '<schema_name>');
DBA

用于AWSDMS执行从源到目标的持续复制。

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

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

DBA,迁移工程师
任务描述所需技能

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

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

DBA,迁移工程师

停止AWSDMSCDC仅限任务(如果CDC已开启)。

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

  2. 停止AWSDMSCDC仅限的任务。

DBA

启用触发器。

启用TRIGGERS您在创建CDC任务之前禁用的。

DBA

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'')');
  • 使用AWSDMS任务(满载迁移,必要时可进行CDC复制)来迁移已识别的表。AWSDMS将从源 Oracle 数据库中提取多行,然后将它们成批插入到目标 Amazon RDS 实例,这样可以提高性能。