本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
通过数据库链接使用直接 Oracle 数据泵导入,将本地 Oracle 数据库迁移到 Amazon RDS for Oracle
由 Rizwan Wangde 创作 () AWS
环境:生产 | 来源:本地 Oracle 数据库 | 目标:Amazon f RDS or Oracle |
R 类型:更换平台 | 工作负载:Oracle | 技术:迁移;数据库 |
AWS服务:AWSDMS; AWS Direct Connect; 亚马逊 RDS |
Summary
许多模式包括使用 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 的架构。箭头方向描绘了架构数据流。该图没有显示哪个组件正在启动连接。
Amazon f RDS or Oracle 实例连接到本地源 Oracle 数据库,通过数据库链接执行满负荷迁移。
AWSDMS使用更改数据捕获 (CDC) 连接到本地源 Oracle 数据库以执行持续复制。
CDC更改将应用于 Amazon f RDS or Oracle 数据库。
工具
AWS服务
AWSDat@@ abase Migration Service (AWSDMS) 可帮助您将数据存储迁移到AWS云端,或者在云端和本地设置的组合之间迁移。此模式使用CDC和 “仅复制数据更改” 设置。
AWSDirect Connect 通过标准的以太网光纤电缆将您的内部网络连接到 Direct Connect 位置。通过此连接,您可以直接创建公共AWS服务的虚拟接口,同时绕过网络路径中的互联网服务提供商。
适用于 Oracle 的 Amazon Relational Database Service(亚马逊RDS)可帮助您在AWS云中设置、操作和扩展 Oracle 关系数据库。
其他工具
Oracle 数据泵
可帮助您将数据和元数据从一个数据库高速移动至另一个数据库。 诸如 Oracle Instant Client 或 SQLD
eveloper 之类的客户端 工具用于连接数据库并对数据库运行SQL查询。
最佳实践
尽管 AWSDirect Connect
使用 Amazon 的虚拟专用网络 (VPN) Site-to-Site VPN 或从本地网络到AWS网络的IPsecVPN连接
在本地 Oracle 数据库上配置的 Oracle 数据库本机网络加密
使用加密 TLS
操作说明
任务 | 描述 | 所需技能 |
---|---|---|
设置从目标数据库到源数据库的网络连接。 | 配置本地网络和防火墙,以允许从目标 Amazon RDS 实例到本地源 Oracle 数据库的传入连接。 | 网络管理员、安全工程师 |
创建具有相应权限的数据库用户。 | 在本地源 Oracle 数据库中创建具有使用 Oracle Data Pump 在源和目标之间迁移数据的权限的数据库用户。
| DBA |
准备本地源数据库以进行AWSDMSCDC迁移。 | (可选)准备本地源 Oracle 数据库,以便在 Oracle 数据泵满负荷完成后进行AWSDMSCDC迁移: | DBA |
安装和配置SQL开发人员。 | 安装并配置 D SQLe | DBA,迁移工程师 |
生成脚本来创建表空间。 | 使用以下示例SQL查询在源数据库上生成脚本。
脚本将应用至目标数据库。 | DBA |
生成用于创建用户、配置文件、角色和权限脚本。 | 要生成DDL用于创建数据库用户、配置文件、角色和权限的脚本,请使用 Oracle Support 文档《如何为用户提取》中的脚本,包括使用 dbms_metadata.get_ddl(文档 ID 2739952.1)(需要 Oracle 帐户)中的脚本( 脚本将应用至目标数据库。 | DBA |
任务 | 描述 | 所需技能 |
---|---|---|
创建到源数据库的数据库链接并验证连接性。 | 要创建到本地源数据库的数据库链接,您可以使用以下示例命令。
要验证连接,请运行以下SQL命令。
如果响应为 | DBA |
运行脚本,以准备目标实例。 | 运行之前生成的脚本,为目标 Amazon RDS for Oracle 实例做好准备:
这有助于确保 Oracle Data Pump 迁移可以创建模式及其对象。 | DBA,迁移工程师 |
任务 | 描述 | 所需技能 |
---|---|---|
迁移所需架构。 | 要将所需的架构从源本地数据库迁移到目标 Amazon RDS 实例,请使用其他信息部分中的代码:
要调整迁移的性能,您可以通过运行以下命令来调整并行进程的数量。
| DBA |
收集架构统计信息以提高性能。 | 收集架构统计信息命令返回为数据库对象收集的 Oracle 查询优化器统计信息。通过使用此信息,优化器可以为针对这些对象的任何查询选择最佳执行计划。
| DBA |
任务 | 描述 | 所需技能 |
---|---|---|
在源本地部署 Oracle 数据库SCN上捕获数据。 | 捕获源本地 Oracle 数据库上的系统更改编号 (SCN) 要生成源数据库SCN的电流,请运行以下SQL语句。
| DBA |
执行架构的满负荷迁移。 | 要将所需的架构 (
在代码中,
要调整迁移的性能,您可以调整并行进程的数量。
| DBA |
在迁移架构下禁用触发器。 | 在开始AWSDMSCDC仅限-only 的任务之前,请禁用已迁移架构 | DBA |
收集架构统计信息以提高性能。 | 收集架构统计信息命令返回为数据库对象收集的 Oracle 查询优化器统计信息。通过使用此信息,优化器可以为针对这些对象的任何查询选择最佳执行计划。
| DBA |
用于AWSDMS执行从源到目标的持续复制。 | 用于AWSDMS执行从源 Oracle 数据库到目标 Amazon for Oracle 实例RDS的持续复制。 有关更多信息,请参阅使用创建用于持续复制的任务,AWSDMS以及中的博客文章 “如何使用本机CDC支持 | DBA,迁移工程师 |
任务 | 描述 | 所需技能 |
---|---|---|
在割接前 48 小时在实例上启用多可用区以在切换之前启用。 | 如果这是生产实例,我们建议在 Amazon RDS 实例上启用多可用区部署,以提供高可用性 (HA) 和灾难恢复 (DR) 的优势。 | DBA,迁移工程师 |
停止AWSDMSCDC仅限任务(如果CDC已开启)。 |
| 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 实例,这样可以提高性能。