亚马逊AWS官方博客

使用 AWS DMS 以近乎零停机时间迁移 Oracle 数据库

您的组织中是否有无法承受停机的关键 Oracle OLTP 数据库? 您是否希望在尽量缩短停机时间或不停机的情况下将 Oracle 数据库迁移到 AWS? 在当今应用程序和数据库 24/7 全天候可用的快节奏世界中,将本地数据库迁移到云时,某些应用程序可能无法承受大量停机时间。

本博文讨论了使用 AWS Database Migration Service (AWS DMS) 及其更改数据捕获 (CDC) 功能将本地 Oracle 数据库迁移到 Oracle的 Amazon Relational Database Service (RDS) 的解决方案,以最大程度地缩短停机时间。

AWS DMS 概述

AWS DMS 是一项云服务,可帮助您将数据库迁移到 AWS。AWS DMS 可以将关系数据库、数据仓库、NoSQL 数据库和其他类型的数据存储迁移到 AWS 云中。AWS DMS 支持不同数据库平台之间的同质和异类迁移。您可以执行一次迁移,也可以复制正在进行的更改,以使源数据库和目标数据库保持同步。要使用 AWS DMS,至少一个数据库端应位于 AWS 中,即源数据库或目标数据库。

当仅使用 AWS DMS 复制数据更改时,必须指定一个时间或系统更改号 (SCN),AWS DMS 将从该时间或系统更改号开始读取数据库日志更改。请务必在服务器上保留这些日志一段时间,以确保 AWS DMS 可以访问这些更改。

迁移 LOB

如果您的源数据库具有大型二进制对象 (LOB),并且您必须将其迁移到目标数据库,则 AWS DMS 提供以下选项:

  • 完全 LOB 模式 – AWS DMS 将所有 LOB 从源数据库迁移到目标数据库,无论其大小如何。尽管迁移速度较慢,但优势是数据不会被截断。为了获得更好的性能,您应该在新的复制实例上创建一个单独的任务,以迁移 LOB 大于数兆字节的表格。
  • 受限 LOB 模式 – 您指定 LOB 列数据的最大大小,使 AWS DMS 可以预分配资源并批量应用 LOB。如果 LOB 列的大小超过任务中指定的大小,则 AWS DMS 会截断数据,并将警告发送到 AWS DMS 日志文件。如果您的 LOB 数据大小在受限 LOB 大小以内,则可以通过使用受限 LOB 模式来提高性能。
  • 内联 LOB 模式 – 通过复制小型和大型 LOB,您可以迁移 LOB,而不用截断数据或降低任务性能。首先,为 InlineLobMaxSize 参数指定一个值,该值仅在完全 LOB 模式设置为 true 时可用。AWS DMS 任务以内联方式传输小型 LOB,此方式更加高效。然后,AWS DMS 通过从源表执行查找来迁移大型 LOB。但是,内联 LOB 模式仅在完全加载阶段有效。

解决方案概览

本博文使用 Amazon EC2 for Oracle 数据库实例作为源数据库,并假设您的本地数据库和 Amazon RDS for Oracle 数据库作为目标数据库。本博文还使用 Oracle Data Pump 将数据从源 Oracle 数据库导出和导入到目标 Oracle RDS for Oracle 数据库,并使用 AWS DMS 将 CDC 更改从源 Oracle 数据库复制到 Amazon RDS for Oracle 数据库。本博文假设您已在 AWS 云环境中预置 Amazon RDS for Oracle 数据库作为目标数据库。

下图展示了我们的解决方案架构。

该解决方案包括以下步骤:

  • 设置带有源和目标终端节点的 AWS DMS 复制实例
  • 使用 Oracle Data Pump 从本地 Oracle 数据库导出架构
  • 使用 Oracle 数据泵将架构导入到 Amazon RDS for Oracle 数据库中
  • 使用 CDC 创建 AWS DMS 复制任务以执行实时复制
  • 在目标 Amazon RDS for Oracle 数据库上验证数据库架构

先决条件

根据应用程序,在确定要迁移到 Amazon RDS for Oracle 数据库的 Oracle 数据库架构之后,必须在启动迁移之前收集一些架构详细信息,例如架构大小、基于对象类型的对象总数和无效对象。

要使用 AWS DMS CDC 功能,请在源 Oracle 数据库上启用数据库级和表格级补充日志记录。完成前提条件后,您可以预置 AWS DMS 实例。

预置 AWS DMS 实例

使用 DMS_instance.yaml AWS CloudFormation 模板来配置 AWS DMS 复制实例及其源和目标终端节点。请执行以下步骤:

  1. 在 AWS 管理控制台的服务下,选择 CloudFormation。
  2. 选择创建堆栈。
  3. 对于指定模板,选择上传模板文件。
  4. 选择选择文件。
  5. 选择 DMS_instance.yaml 文件。
  6. 选择下一步。
  7. 在指定堆栈详细信息页面上,根据需要编辑预定义参数:
  • 对于堆栈名称,输入您的堆栈名称。
  • 在 AWS DMS 实例参数下,输入以下参数:
    • DMSInstanceType – 为 AWS DMS 复制实例选择所需的实例。
    • DMSStorageSize – 输入 AWS DMS 实例的存储大小。
  • 在源 Oracle 数据库配置下,输入以下参数:
    • SourceOracleEndpointID – Oracle 数据库的源数据库服务器名称
    • SourceOracleDatabaseName – 源数据库服务名称或适用的 SID
    • SourceOracleUserName – 源数据库用户名。默认为系统。
    • SourceOracleDBPassword – 源数据库用户名的密码
    • SourceOracleDBPort – 源数据库端口
  • 在“目标 RDS for Oracle“数据库配置下,输入以下参数:
    • TargetRDSOracleEndpointID – 目标 RDS 数据库终端节点
    • TargetRDSOracleDatabaseName – 目标 RDS 数据库名称
    • TargetRSOracleUserName – 目标 RDS 数据库名称
    • TargetRDSOracleDBPassword – 目标 RDS 密码
    • TargetOracleDBPort – 目标 RDS 数据库端口
  • 在 VPC、子网和安全组配置下,输入以下参数:
    • VPCID – 复制实例的 VPC
    • VPCSecurityGroupId – 复制实例的 VPC 安全组
    • DMSSubnet1 – 可用区 1 的子网
    • DMSSubnet2 – 可用区 2 的子网
  1. 选择下一步。
  2. 在配置堆栈选项页上的标签”中,输入任何可选值。
  3. 选择下一步。
  4. 在 Review 页面上选中 I acknowledge that AWS CloudFormation might create IAM resources with custom names(我确认 AWS CloudFormation 可能会使用自定义名称创建 IAM 资源)。
  5. 选择创建堆栈。 预置应在大约 5 到 10 分钟内完成。当 AWS CloudFormation Stacks 控制台显示 Create Complete时,此操作完成。
  6. 在 AWS 管理控制台中,选择服务。
  7. 选择数据库迁移服务。
  8. 在资源管理下,选择复制实例。 以下屏幕截图显示复制实例页面,可用于检查输出。
  9. 在资源管理下,选择终端节点。 以下屏幕截图显示终端节点页面,您可以在其中看到源终端节点和目标终端节点。 源终端节点和目标终端节点的状态显示为“活动”后,应测试连接。为每个终端节点选择运行测试,以确保状态显示为成功。 现在,您已经创建 AWS DMS 复制实例及其源和目标终端节点,并执行了终端节点连接测试,确保其可以成功建立连接。

将源数据库架构迁移到目标数据库

现在,您可以使用 Oracle Data Pump 将 Oracle 数据库架构迁移到 Amazon RDS for Oracle 数据库。Oracle Data Pump 提供了服务器端基础结构,可在 Oracle 数据库之间快速进行数据和元数据移动。对于大型数据库而言,它是理想的选择,可通过高性能数据移动为数据库管理员节省大量时间。Data Pump 自动管理多个并行的卸载和加载流,以实现最大吞吐量。

导出数据

当源数据库处于联机状态并且正在被应用程序使用时,请使用 Oracle Data Pump 从源本地 Oracle 数据库开始数据导出。您还必须从源数据库生成 SCN,以在数据泵导出中使用 SCN,从而确保数据一致性,并在 AWS DMS 中将 SCN 用作更改数据捕获的起点。

要导出数据库模式,请完成以下步骤:

  1. 输入以下 SQL 语句,从您的源数据库生成当前的 SCN:
  1. SQL> SELECT current_scn FROM v$database;
  2. CURRENT_SCN
  3. -----------
      7097405
  4. 记录生成的 SCN,以便在导出数据和用于 AWS DMS 时使用。
  5. 创建一个参数文件以导出架构。查看参数文件的内容:
  1. # Use the generated SCN in step#1 for the flashback_scn parameter and create the required database directory if default DATA_PUMP_DIR database directory is not being used.
  2. $ cat export_sample_user.par
  3. userid=dms_sample/dms_sample
  4. directory=DATA_PUMP_DIR
  5. logfile=export_dms_sample_user.log
  6. dumpfile=export_dms_sample_data_%U.dmp
  7. schemas=DMS_SAMPLEflashback_scn=7097405
  8. 使用 expdp 实用程序执行导出。请参阅以下代码:
  9. $ expdp parfile=export_sample_user.par
  10. Export: Release 12.2.0.1.0 - Production on Wed Oct 2 01:46:05 2019
  11. 	         Copyright (c) 1982, 2017, Oracle and/or its affiliates. All rights reserved.
  12. 	         Connected to: Oracle Database 12c Standard Edition Release 12.2.0.1.0 - 64bit Production
  13. 	FLASHBACK automatically enabled to preserve database integrity.
  14. 	Starting "DMS_SAMPLE"."SYS_EXPORT_SCHEMA_01":  dms_sample/******** parfile=export_sample_user.par 
  15. .
  16. .
  17. .
  18. .
  19. 	Master table "DMS_SAMPLE"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
  20. ******************************************************************************
  21. 	Dump file set for DMS_SAMPLE.SYS_EXPORT_SCHEMA_01 is:
  22. 	 /u03/app/backup/expdp_dump/export_dms_sample_data_01.dmp
    Job "DMS_SAMPLE"."SYS_EXPORT_SCHEMA_01" successfully completed at Wed Oct 2 01:47:27 2019 elapsed 0 00:01:20

将转储文件传输到目标实例

有多种方法可以将 Oracle Data Pump 导出文件传输到 Amazon RDS for Oracle 实例。您可以使用 DBMS_FILE_TRANSFER 实用程序或 Amazon S3 集成功能来传输文件。

使用 DBMS_FILE_TRANSFER 传输转储文件

您可以使用 DBMS_FILE_TRANSFER 实用程序将数据泵文件直接传输到 RDS 实例。您必须在本地和 Amazon RDS for Oracle 数据库实例之间创建数据库链接。

以下代码创建一个数据库链接 ORARDSDB,该链接连接到目标数据库实例上的 RDS 主用户:

$ sqlplus / as sysdba

SQL> create database link orardsdb connect to admin identified by "xxxxxx" using '(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = database-1.xxxxxxxx.us-east-1.rds.amazonaws.com)(PORT = 1521))(CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl)))';

Database link created.

测试数据库链接,以确保可以使用 sqlplus 进行连接。请参阅以下代码:

SQL> select name from v$database@orardsdb;

NAME
---------
ORCL

要将转储文件复制到 Amazon RDS for Oracle 数据库,您可以使用默认的 DATA_PUMP_DIR 目录,也可以使用以下代码创建自己的目录:

exec rdsadmin.rdsadmin_util.create_directory(p_directory_name => ‘TARGET_PUMP_DIR’);

以下脚本使用名为 oradsdb 的数据库链接将名为export_dms_sample_data_01.dmp 的转储文件从源实例复制到目标 Amazon RDS for Oracle 数据库。

[oracle@ip-172-31-45-39 ~]$ sqlplus / as sysdba
SQL> 
BEGIN
DBMS_FILE_TRANSFER.PUT_FILE(
source_directory_object       => 'DATA_PUMP_DIR',
source_file_name              => 'export_dms_sample_data_01.dmp',
destination_directory_object  => 'TARGET_PUMP_DIR’',
destination_file_name         => 'export_dms_sample_data_01.dmp',
destination_database          => 'orardsdb' 
);
END;
/ 

PL/SQL procedure successfully completed.

上述 PL/SQL 过程完成后,您可以使用以下代码直接在 Amazon RDS for Oracle 数据库中列出数据转储文件:

SQL> select * from table (rdsadmin.rds_file_util.listdir(p_directory => ‘TARGET_PUMP_DIR’));

借助 S3 集成传输转储文件

借助 S3 集成,您可以将 Oracle 数据转储文件直接传输到 Amazon RDS for Oracle 实例。从源数据库实例导出数据后,可以将数据泵文件上传到 S3 存储桶,将文件从 S3 存储桶下载到 Amazon RDS for Oracle 实例,然后执行导入。您还可以使用此集成功能将数据转储文件从 Amazon RDS for Oracle DB 实例传输到本地数据库服务器。

Amazon RDS for Oracle 实例必须具有 S3 存储桶的访问权限才能与 Amazon RDS for Oracle S3 集成和 S3 结合使用。创建 IAM 策略和角色使用GetObject、ListBucket、PutObject 授予您的 IAM 策略。创建 IAM 角色,并将策略附加到该角色。

要使用 Amazon RDS for Oracle 与 S3 集成,您的 Amazon RDS for Oracle 实例必须与包含 S3_INTEGRATION 选项的选项组关联。

要创建 Amazon RDS 选项组,请完成以下步骤:

  1. 在 Amazon RDS 控制台上的选项组下,选择创建
  2. 在选项组详细信息下的名称下,输入选项组的名称。 输入rds-oracle12r2-option-group。
  3. 对于描述,输入您的组的描述。
  4. 对于引擎,选择要迁移的目标 Amazon RDS for Oracle 数据库的引擎。 本博文选择oracle-ee。
  5. 对于“主要引擎版本”,选择引擎版本。 本博文选择 12.2。
  6. 选择创建。

创建选项组后,必须将 S3_Integration 选项添加到选项组。请执行以下步骤:

  1. 在 RDS 控制台上,选择选项组。
  2. 选择您创建的组。
  3. 选择添加选项。
  4. 对于选项,选择 S3_INTEGRATION。
  5. 对于版本,选择 1.0。
  6. 对于立即申请,选择是。
  7. 选择添加选项。

在将 S3_Integration 添加到选项组之后,您必须将目标 Amazon RDS for Oracle 数据库修改为使用新的选项组。完成以下步骤,将选项组添加到现有 Amazon RDS for Oracle 数据库:

  1. 在 RDS 控制台的数据库下,选择要修改的数据库实例。
  2. 选择修改。 出现修改数据库实例页面
  3. 在数据库选项下,对于选项组,选择您新创建的选项组。
  4. 选择继续。
  5. 在安排修改下,选择立即应用。
  6. 选择修改数据库实例。

当适用于 Amazon RDS for Oracle 数据库反映了新的选项组时,您必须将 IAM 角色和 S3_Integration 功能与数据库实例相关联。请执行以下步骤:

  1. 在 RDS 控制台上,选择您的数据库实例。
  2. 在连接性和安全性标签下,选择管理 IAM 角色。
  3. 对于将 IAM 角色添加到此实例,选择 RDS_S3_Integration_Role(您创建的角色)。
  4. 对于功能,选择 S3_INTEGRATION。
  5. 选择添加角色。

在将 IAM 角色和 S3 集成功能与 Amazon RDS for Oracle 数据库关联之后,您就完成了 S3 与 Amazon RDS for Oracle 数据库的集成。现在,您可以使用以下代码将数据转储文件从本地 Oracle 数据库实例上传到 S3:

$ aws s3 cp export_dms_sample_data_01.dmp s3://mydbs3bucket/dmssample/
	
upload: ./export_dms_sample_data_01.dmp to s3:// mydbs3bucket/dmssample//export_dms_sample_data_01.dmp

将数据转储文件上传到 S3 存储桶后,连接到目标数据库实例,并将数据泵文件从 S3 上传到目标实例的 DATA_PUMP_DIR。请参阅以下代码:

SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3(
      p_bucket_name    =>  'mydbs3bucket',
      p_s3_prefix      =>  'dmssample/export_dms_sample_data_01',
      p_directory_name =>  'DATA_PUMP_DIR') 
AS TASK_ID FROM DUAL;

这将为您提供任务 ID 1572302128132-3676。使用以下 SQL 查询来验证您上传到 Amazon RDS for Oracle 实例的文件的状态:

SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-1572302364019-3676.log'));

在上述 SQL 查询输出显示文件已成功下载后,您可以使用以下代码在 Amazon RDS for Oracle 数据库中列出数据泵文件:

SELECT * FROM TABLE(RDSADMIN.RDS_FILE_UTIL.LISTDIR(‘DATA_PUMP_DIR’)) order by mtime;

开始导入

数据转储文件可用后,在启动导入之前,在目标 Amazon RDS for Oracle 数据库上创建角色、架构和表空间。

使用 RDS 主用户帐户连接到目标 Amazon RDS for Oracle 数据库以执行导入。将 Amazon RDS for Oracle 数据库 tns-entry 添加到 tnsnames.ora,并使用连接字符串的名称执行导入。

如果要导入另一个表空间或使用另一个架构名称,则可以相应地添加表空间和架构的重映射。

使用以下代码所示的连接字符串名称,从本地开始将导入到 Amazon RDS for Oracle:

$ impdp admin@orardsdb directory=DATA_PUMP_DIR logfile=import.log dumpfile=export_dms_sample_data_01.dmp

Import: Release 12.2.0.1.0 - Production on Wed Oct 2 01:52:01 2019
Copyright (c) 1982, 2017, Oracle and/or its affiliates. All rights reserved.
     Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
Master table "ADMIN"."SYS_IMPORT_FULL_01" successfully loaded/unloaded
Starting "ADMIN"."SYS_IMPORT_FULL_01":  admin/********@orardsdb directory=DATA_PUMP_DIR logfile=import.log dumpfile=export_dms_sample_data_01.dmp 
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
Processing object type SCHEMA_EXPORT/TABLE/PROCACT_INSTANCE
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
.
.
.
Processing object type SCHEMA_EXPORT/TABLE/GRANT/OWNER_GRANT/OBJECT_GRANT
Processing object type SCHEMA_EXPORT/PACKAGE/PACKAGE_SPEC
Processing object type SCHEMA_EXPORT/PACKAGE/GRANT/OWNER_GRANT/OBJECT_GRANT
Processing object type SCHEMA_EXPORT/PROCEDURE/PROCEDURE
Processing object type SCHEMA_EXPORT/PACKAGE/COMPILE_PACKAGE/PACKAGE_SPEC/ALTER_PACKAGE_SPEC
Processing object type SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE
Processing object type SCHEMA_EXPORT/VIEW/VIEW
Processing object type SCHEMA_EXPORT/PACKAGE/PACKAGE_BODY
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX

导入后检查和验证

要验证导入是否已成功完成,请查看导入日志文件中是否有任何错误。另外,比较详细信息,例如源数据库对象和目标数据库对象、行数和无效对象,如果存在无效对象,则重新编译。

导入成功完成后,为避免数据不一致,请在相关架构的目标 Amazon RDS for Oracle 数据库上禁用触发器和外键,以为 AWS DMS 复制准备目标数据库。

创建 AWS DMS 迁移任务

通过以下步骤创建 AWS DMS 迁移任务:

  • 在 AWS DMS 控制台上的转换和迁移下,选择数据库迁移任务。
  • 在任务配置下,为任务标识符输入您的任务标识符。
  • 对于复制实例,选择您创建的 DMS 复制实例。
  • 对于源数据库终端节点,选择您的源终端节点。
  • 对于目标数据库终端节点,选择目标 Amazon RDS for Oracle 数据库。
  • 对于迁移类型,选择仅复制数据更改。
  • 在任务设置下,选择指定日志序列号。
  • 对于系统更改号,输入您从源 Oracle 数据库生成的Oracle数据库 SCN。
  • 选择启用验证。
  • 选择启用 CloudWatch Logs。 这使您可以验证数据和 Amazon CloudWatch 日志来查看 AWS DMS 复制实例日志。
  • 在选择规则下,完成以下操作:
    • 对于架构,选择输入架构。
    • 对于架构名称,输入 DMS_SAMPLE。
    • 对于表名称,输入 %。
    • 对于操作,选择包括
  • 在转换规则下,完成以下操作:
    • 对于目标,选择表。
    • 对于架构名称,选择输入架构。
    • 对于架构名称,输入 DMS_SAMPLE。
    • 对于操作,选择重命名为。
  • 选择创建任务。

创建任务后,它会将 CDC 从您在 CDC 启动模式下提供的 SCN 迁移到 Amazon RDS for Oracle 数据库实例。您还可以通过查看 CloudWatch Logs 进行验证。以下屏幕截图显示了迁移的日志详细信息。

数据验证

AWS DMS 进行数据验证,以确认您的数据已成功将源数据库迁移到目标数据库。您可以查看表统计信息 页面,以确定在 AWS DMS 任务启动后发生的 DML 更改。在数据验证期间,AWS DMS 比较源数据库与目标数据库中对应的每一行,验证这些行包含的数据相同。为此,AWS DMS 发出适当的查询以检索数据。

以下屏幕截图显示了表统计信息页面及其相关条目。

您还可以对源数据库和目标数据库中的记录数进行计数和比较,以确认 CDC 数据已从源数据库复制到目标数据库。

在计划的维护窗口中,可以使用以下代码关闭所有指向源数据库的应用程序,并启用触发器和外键约束:

— Run the below statement to generate list of triggers to be enabled

 

select ‘alter trigger ‘||owner||’.’||trigger_name|| ‘ enable;’ from dba_triggers where owner=’DMS_SAMPLE’;

— Run the below statement to generate list of constraints to be enabled

 

select ‘alter table ‘||owner||’.’||table_name||’ enable constraint ‘||constraint_name ||’;’ from dba_constraints

 

where owner=’DMS_SAMPLE’ and constraint_type=’R’;

由于 DMS 不会在 CDC 期间从源数据库复制增量序列号,因此您将需要从源生成所有序列的最新序列值,并将其应用于目标 Amazon RDS for Oracle 数据库,以避免序列值不一致。

现在,通过修改连接详细信息,将应用程序指向目标 Amazon RDS for Oracle 数据库。在启动应用程序之后,您应该看到现在已在目标 Amazon RDS for Oracle 数据库上建立所有应用程序连接。确认源数据库上不再存在连接后,可以停止源数据库。

小结

本博文演示了如何通过使用 Oracle 数据泵和 AWS DMS 将本地 Oracle 数据库迁移到Amazon RDS for Oracle 数据库,同时最大程度地缩短停机时间甚至无停机。您可以使用 AWS DMS 及其 CDC 功能将关键数据库无缝迁移和复制到 Amazon RDS。

我们鼓励您尝试此解决方案,并充分发挥 AWS DMS 与Oracle 数据库结合使用带来的所有优势。有关更多信息,请参阅AWS Database Migration Service 入门AWS Database Migration Service最佳实践。 有关 Oracle 数据库迁移的更多信息,请参阅指南《将 Oracle 数据库迁移到 AWS 云》.。

请随时在评论中提出问题或请求。祝您迁移顺利!

 


本篇作者

Sagar Patel

Amazon Web Services 专业服务团队的 数据库专业架构师 。他是数据库迁移专家,负责提供技术指导,并帮助 Amazon 客户将其本地数据库迁移到 AWS。

Sharath Lingareddy

Amazon Web Services 专业服务团队的数据库架构师。他提供使用 Oracle、PostgreSQL、Amazon RDS 的解决方案。他的专注的领域是本地数据库到 Amazon RDS 和 Aurora PostgreSQL 的同质和异类迁移。

Jeevith Anumalla

Amazon Web Services 专业服务团队的 Oracle 数据库云架构师。他担任数据库迁移专家,帮助内部和外部 Amazon 客户将其本地数据库环境移至 AWS 数据存储。