亚马逊AWS官方博客

从Oracle 数据库迁移到 Amazon Aurora PostgreSQL 数据库过程简介

在本博文中,我们将构建一个用来部署资源的 AWS CloudFormation 堆栈,以帮助演示从 Oracle 数据库迁移到 Amazon Aurora PostgreSQL 数据库的过程。由于这属于异构迁移,我们将执行 How to Migrate Your Oracle Database to PostgreSQL 详细介绍的两步流程。

本博文的重点是构建迁移堆栈,以帮助您熟悉 AWS Schema Conversion Tool (AWS SCT) 和 AWS Data Migration Service (AWS DMS) 的核心概念。此外,我们还会向您演示如何使用数据库参数组,在要迁移的目标 Amazon Aurora PostgreSQL 数据库中禁用触发器。

我们使用 AWS CloudFormation 来部署一个预装了 Oracle 数据库 (HRDATA) 的Amazon EC2 实例、一个 Amazon Aurora PostgreSQL 集群和 AWS DMS 中的一个复制实例。我们将使用 Amazon Virtual Private Cloud (Amazon VPC)、Amazon Simple Storage Service (Amazon S3) 和 AWS Identity and Access Management (IAM) 角色和策略等其他必要的组件,以帮助迁移过程。

注意事项

在开始建构此迁移的组件前,请注意以下几个要点:

  • 在转换期间,AWS SCT 会在 Aurora PostgreSQL 数据库中将架构转换为大写格式。由于 Aurora PostgreSQL 引擎区分大小写,您需要在迁移阶段使用转换规则。
  • 进行批量加载时,您必须在目标 Aurora PostgreSQL 数据库中禁用所有触发器。否则,批量加载将因外键违规而失败。我们将使用一个数据库参数组并将 session_replication_role 参数设置为 replica,从而演示如何完成这一步。此操作将禁用所有触发器。在创建 Aurora 集群时,AWS CloudFormation 堆栈会根据需要设置 DBParameterGroup 资源。理想情况下,批量加载完成后,您会将 session_replication_role 参数修改会原始值,从而启用目标数据库中的触发器。

注意:禁用外键检查期间(例如在整个 AWS DMS 迁移期间)不要在目标数据库上执行任何 DDL 语句。否则可能导致数据词典崩溃。

如下代码段来自 AWS CloudFormation 的数据库参数组脚本:

"RDSDBParameterGroup": {
            "Type": "AWS::RDS::DBParameterGroup",
            "Properties": {
                "Description": "CloudFormation Sample Aurora Postgresql Instance Parameter Group",
                "Family": "aurora-postgresql9.6",
                "Parameters": {
                    "session_replication_role": "replica"
                }
            }

第 1 部分:使用 AWS CloudFormation 来部署迁移需要的资源

注意:此脚本仅在俄勒冈 (us-west-2) 和俄亥俄 (us-east-2) 区域有效。

先决条件

如要开始此项迁移,请执行如下操作:

  1. 下载并安装 AWS SCT
  2. 下载 Oracle 和 Aurora PostgreSQL 数据库驱动程序
  3. 遵照安装、验证和更新 AWS Schema Conversion Tool 的说明来配置 AWS SCT 全局设置
  4. 找到要在 US West-2(俄勒冈)或 US East-2(俄亥俄)区域使用的 Amazon EC2 密钥对。密钥是分区域的。如果您还没有密钥,请创建 Amazon EC2 密钥对
  5. 在控制台中导航至 Identity and Access Management (IAM)。在角色下简称是否有一个名为 dms-vpc-role 的角色。这是一个 API/AWS CLI 特定的角色,以编程方式启动 AWS DMS 任务需要用到它。如果该角色不存在,则在本博文的 AWS CloudFormation 启动部分,对 DMSVPCRoleExists 参数选择 no,从而确保 AWS CloudFormation 可以创建该角色。

启动堆栈

注意:堆栈部署的某些资源在使用期间会发生费用。

如要开始部署 AWS CloudFormation 模板:

  1. 选择启动堆栈。此按钮会在您的 AWS 账户中使用要启动的模板自动启动 AWS CloudFormation 服务。必要时将提示您登录。
  2. 创建堆栈时请务必选择俄亥俄 (us-east-2) 俄勒冈 (us-west-2) 区域。然后选择 Next
  3. 对于 DMSVPCRoleExists 参数,根据先决条件第 5 步的结果选择 yesno注意:如果您以前在账户中使用过 AWS DMS,dms-vpc-role 角色将已经在 IAM 中创建。为了放置 AWS CloudFormation 堆栈因已经存在角色而失败,请在 DMSVPCRoleExists 输入参数中选择 yes。否则保留默认的 no
  4. 对于 MyIP 参数,默认的 0.0.0.0/0 将允许端口 1521(针对 Oracle)和 5432 开放访问。因此,我们强烈建议您使用您用于启动堆栈的计算机的公有 IP 地址。(您可以使用 org 来查看您的 IP 地址。)
  5. 指定 EC2 实例的密钥对以及需要的其他参数。所有参数都必须填写,大多数参数都有默认值。然后选择 Next
  6. 在 Review 页面,确认 AWS CloudFormation 将因堆栈的启动创建 IAM 角色。选择 Create
  7. 如要查看堆栈创建进度,请选择 Refresh。然后在下面的 Events 部分选择要查看启动事件的堆栈。堆栈的创建大约需要 7–10 分钟。堆栈成功启动后,Status 会从 CREATE_IN_PROGRESS 变为 CREATE_COMPLETEOutputs 选项卡包含了有关 AWS CloudFormation 部署的资源的信息,您将在本博文的稍后阶段需要此信息。您可以将这些值复制到文件以便查询。这时,您还可以选择检查 Aurora PostgreSQL 数据库参数组的设置。
  8. 登录到 AWS 管理控制台并打开 Amazon Relational Database Service (Amazon RDS)。在左侧的导航窗格中,选择 Parameter groups。然后选择 AWS CloudFormation 堆栈创建的实例参数组(不是数据库集群参数组),如下所示:
  9. 在搜索框中,键入 session_replication_role。该参数的值将显示为 replica

第 2 部分:使用 AWS SCT 转换源数据库的架构

如要开始这一步,您必须按照先决条件部分所述安装了 AWS Schema Conversion Tool (AWS SCT)。AWS SCT 应当拥有接入 Internet 的权限,以便连接 AWS CloudFormation 部署的资源。

  1. 启动 AWS SCT。
  2. 选择 FileNew Project Wizard
  3. 在向导中,提供项目的名称。选择 Oracle 为源,然后选择 Next
  4. 提供 Oracle 数据库的连接信息。您可以在您之前部署的 AWS CloudFormation 堆栈的 Output 中找到此步骤需要的所有参数。选择 Test Connection 以确保 AWS SCT 可以成功连接到 Oracle 源。然后选择 Next
  5. 选择 HRDATA 为要迁移的架构,然后选择 Next
  6. 这时将会显示一个 Database Migration Assessment Report。此报告会深入分析不同目标数据库引擎的迁移挑战。它可帮助您了解相关挑战,选择最适合此项迁移的目标数据库。在本博文中,我们将使用 Aurora PostgreSQL 作为目标引擎。您可以在需要时下载此报告。选择 Next
  7. Target 部分,请输入服务器名称中的 Aurora PostgreSQL 集群终端节点。指定 5432 端口,并提供 AWS CloudFormation 堆栈预置的 Aurora 集群的用户名和密码。
  8. 选择 Test Connection 以确保 AWS SCT 可以成功连接到 Aurora PostgreSQL 目标数据库。然后选择 Finish向导完成后,将会显示包含两个窗格的主屏幕。左侧窗格为源 Oracle 数据库,右侧窗格为目标 Aurora PostgreSQL 数据库。如要生成更具体、更详细的评估报告,请在源数据库中打开 HRDATA 架构的上下文菜单(右击),然后选择 Create Report。报告中提供的 Action Items 可以帮助数据库管理员 (DBA) 解决目标数据库中的架构差异问题,从而成功完成迁移。例如,在源数据库窗格中选择 Views,然后选择 EMP_DETAILS_VIEW。有两个操作项目可解决在目标数据库中自动创建 EMP_DETAILS_VIEW 期间遇到的问题。AWS SCT 是一项强大的工具,可转换架构、函数,存储将源数据库的流程存储到目标数据库中,并提供了操作项目。由于本博文的篇幅原因,使用的数据库十分简单,无需执行重大的操作。
  9. 在源 Oracle 数据库中打开HRDATA 架构的上下文菜单(右击),然后选择 Convert Schema。HRDATA 架构将会在目标 Aurora MySQL 数据库中创建。这时将会弹出一条警告消息,提示您对象可能已经存在于目标数据库中并且将被替换。选择 Yes 继续。
  10. 在目标 Aurora PostgreSQL 数据库窗格中,打开 HRDATA 的上下文菜单(右击)。选择 Apply to database

这时,您已经成功使用 AWS SCT 生成了一份数据库迁移评估报告,并且已经在目标 Aurora PostgreSQL 数据库中创建了 HRDATA 架构。

AWS SCT 会自动将源数据库架构和大多数自定义代码转为与目标数据库兼容的格式。该工具无法自动转换的任何代码也将明确标注出来,以便您可以自行转换。为保证最佳结果,请将转换后的架构保存到 SQL 脚本文件并请目标数据库专家检查转换后的架构。在开始迁移数据前,应当检查架构并为目标数据库进行优化。

在本博文中,我们并未探索目标数据库对象的优化步骤。我们之势在 AWS SCT 中简单地将源数据库架构转换为目标数据库架构。

现在您可以进行数据迁移。

第 3 部分:使用 AWS DMS 将数据迁移到目标数据库

在这一部分,您将使用 AWS DMS 将数据从 Oracle 数据库批量加载到 Amazon Aurora PostgreSQL. 数据库。现在,如果您迁移到 Amazon AuroraAmazon RedshiftAmazon DynamoDB 数据库,AWS DMS 将提供每个实例 6 个月的免费使用优惠

  1. 登录 AWS 管理控制台并打开 AWS DMS 控制台。
  2. 确保您与第 2 部分部署的 AWS CloudFormation 堆栈位于同一区域(us-east-2 或 us-west-2)。
  3. 在左侧的导航窗格中,选择复制实例。请注意 AWS CloudFormation 堆栈已经为您创建新的复制实例。记下复制实例的 Virtual Private Cloud (VPC) 地址。它也正是 AWS CloudFormation 堆栈为本博文创建的 VPC。
  4. 在左侧的导航窗格中,选择终端节点
  5. 选择创建终端节点
  6. 创建终端节点页面,选择,然后提供有关 Oracle 源数据库的必要信息。AWS CloudFormation 的 Output 部分拥有完成此步骤所需的信息。在测试终端节点连接部分,选择 AWS CloudFormation 堆栈创建的 VPC 复制实例。确保测试成功,然后选择创建终端节点以保存终端节点的详细信息。注意:不要跳过测试终端节点步骤。它可帮助确保 AWS DMS 拥有必要的终端节点连接以刷新架构。
  7. 同样,在创建终端节点页面,选择目标,然后提供有关 Aurora PostgreSQL 目标数据库的必要信息。提供 Aurora PostgreSQL 终端节点、端口、用户名、密码和数据库名称。
  8. 测试终端节点连接部分,选择 AWS CloudFormation 堆栈创建的 AWS DMS 复制实例。确保测试成功,然后选择创建终端节点以保存终端节点的详细信息。注意:不要跳过“测试终端节点”步骤。它可帮助确保 AWS DMS 拥有必要的终端节点连接。AWS CloudFormation 的 Output 部分拥有完成此步骤所需的信息。
  9. 在左侧的导航窗格中,选择任务,然后选择创建任务
  10. 在任务设置中:
    1. 选择 AWS CloudFormation 堆栈部署的复制实例。
    2. 选择作为源数据库的 Oracle 终端节点。
    3. 选择作为目标数据库的 Aurora PostgreSQL 终端节点。
    4. 对于 Migration type(迁移类型),选择 Migrate existing data(迁移现有数据).此选项将允许您在无需捕获变更数据 (CDC) 的情况下批量加载数据。您可以选择其他选项,但您需要启用补充的日志记录以允许 CDC。有关更多信息,请参阅将 Oracle 数据库作为 AWS DMS 源
    5. 选择 Start task on create(创建后立即启动任务)复选框,以在任务创建后立即开始加载。
    6. 对于 Target table preparation(目标数据库表准备)模式,选择 Do nothing(不执行任何操作),因为我们已经使用 AWS SCT 转换了架构。
    7. 选择 Enable validation(启用验证)以比较源数据库与目标数据库中对应的每一行,验证这些行包含的数据相同。
    8. 您也可以选择启用日志记录以将任务记录在 CloudWatch 中,方便必要时的分析。
    9. Table mappings(表映射)部分,选择要迁移的源数据库 HRDATA 架构。对于表名称选项,为架构中的所有表使用 % 通配符。选择 Add selection rule(添加选择规则)以添加表映射规则。
    10. 添加完选择规则后,添加两条转换规则:
      1. 第一条规则是将架构名称 HRDATA 从大写更改为小写。这是因为 Aurora PostgreSQL 引擎是区分大小写的,而在架构转换期间,AWS SCT 以大写格式创建了架构和表。选择 Add transformation rule(添加转换规则)以将此规则添加到任务。
      2. 第二条规则是将 HRDATA 架构中的表名称从大写更改为小写。选择 Add transformation rule(添加转换规则)以将此规则添加到任务。添加完选择规则和转换规则后,您的 Table mappings(表映射)部分应该如下图所示:
    11. 选择创建任务继续。任务创建之后,它会自动开始将数据从源数据库加载到目标数据库。
  11. 选中任务,在如下的属性窗格中,选择 Table statistics(表统计)选项卡以查看进度。验证状态应会从 Pending records(待处理的记录)变为 Validated(已验证)。此外,确保 Total(总计)的计数与 Full Load Rows(完全加载行)一致

您还可以选择使用 pgAdmin 等 pgAdmin 客户端来检查 Aurora PostgreSQL 的迁移结果。

在 SQL 客户端中使用 AWS CloudFormation 堆栈的“Output”中提供的 Aurora PostgreSQL 连接信息来建立连接。

这时,您已经成功将数据从 Oracle 数据库迁移到 Amazon Aurora PostgreSQL 数据库。

清理步骤

在这一部分,您将执行清理任务以删除本博文中部署的 AWS 资源。您可以继续运行这些资源,但请注意只要您运行资源,资源都将持续产生费用。

执行如下步骤删除之前创建的资源:

  1. 在控制台中打开 AWS DMS。在左侧的导航窗格中,选择任务。选择您之前在第 3 部分创建的任务,然后选择删除
  2. 任务删除后,在左侧导航窗格中选择终端节点。删除您之前在第 2 部分创建的 Oracle 源数据库和 Aurora PostgreSQL 目标数据库终端节点。
  3. 在控制台中打开 AWS CloudFormation。选择您在第 1 部分创建的堆栈,然后选择删除堆栈

完成删除将需要大约 5–10 分钟。它会删除堆栈创建的所有资源。这时创建将会显示为 DELETE_IN_PROGRESS。删除成功后,堆栈将从堆栈列表中消失。

这时,因本博文部署的所有资源都已成功删除。

小结

在本博文中,我们演示了在 AWS 中进行异构数据库迁移的核心步骤。我们重点介绍了使用 AWS Schema Conversion Tool 和 AWS Database Migration Service 从 Oracle 数据库迁移到 Amazon Aurora PostgreSQL 的步骤。您也可以自定义 AWS CloudFormation 脚本以轻松部署其他数据库引擎,测试其他迁移。


本篇作者

Sona Rajamani

AWS 解决方案架构师。她生活在旧金山湾区,帮助客户架构和优化 AWS 上的应用程序。在她的空余时间,她喜欢远足和旅游。

Ballu Singh

AWS 解决方案架构师。他生活在旧金山湾区,帮助客户架构和优化 AWS 上的应用程序。在他的空余时间,他喜欢阅读和与家人在一起。