亚马逊AWS官方博客

适用于 Oracle 向 Amazon RDS for PostgreSQL 或 Amazon Aurora PostgreSQL 迁移的架构和代码验证器

数据库迁移是从评估到转换的一系列步骤。迁移工程师或应用程序团队可能面临的其中一个关键挑战是验证迁移的数据库对象,例如表、索引、约束、程序和函数。在异构迁移过程中验证数据库对象是一项耗时的手动任务。您必须编写自定义应用程序或运行多个数据库查询来验证和比较架构对象。在迁移期间继续转换数据库对象或继续在 Oracle 数据库中添加增量更改时,需要进行此验证。在这篇文章中,我们将向您介绍一种通过生成 HTML 报告自动验证 Oracle 和 PostgreSQL 架构差异的方法。我们将 SQL 查询以及 Amazon Aurora PostgreSQL 兼容版适用于 PostgreSQL 的 Amazon Relational Database Service(Amazon RDS)支持的 oracle_fdw 扩展与 psql 命令行一起使用。

解决方案概览

该解决方案使用 Aurora PostgreSQL 或 Amazon RDS for PostgreSQL 提供的 oracle_fdw 扩展来查询 Oracle 元数据表或视图并将其与 PostgreSQL 进行比较。oracle_fdw PostgreSQL 扩展提供了一个外部数据封装器,可轻松高效地访问 Oracle 数据库。有关更多详细信息,请参阅使用 oracle_fdw 从 Amazon RDS for PostgreSQL 连接到 Oracle

在这篇文章中,我们将执行以下简要实施步骤:

  1. 安装 oracle_fdw 扩展并为 Oracle 元数据视图或表配置外表。
  2. 使用堡垒主机的 psql 命令行运行架构验证器脚本,并以 HTML 文件的形式在源和目标之间生成不匹配报告。

下图说明了 Aurora PostgreSQL 的解决方案架构,但 Amazon RDS for PostgreSQL 的架构保持不变。

先决条件

该脚本需要 oracle_fdw 扩展,它可以帮助您连接到 Oracle 数据库。目前,在 Aurora PostgreSQL 12.7 及更高版本或 Amazon RDS for PostgreSQL 12.7 及更高版本中提供了 oracle_fdw 扩展。

您的 Oracle 数据库与 Aurora PostgreSQL 12.7 或 Amazon RDS for PostgreSQL 之间的连接也可以使用 AWS Site-to-Site VPN 或 AWS Direct Connect 进行设置。

我们在基本架构 oracle_schema_compare 中启动所有外表安装,然后使用相关的外表或 Oracle 元数据视图创建必要的扩展。Oracle 凭据仅对有限的元数据表需要受限制的最小权限(SELECT_CATALOG_ROLE)。oracle_fdw 的安装封装在 installer_ora_fdw.sql 脚本中,对于 PostgreSQL 兼容数据库通过 psql 命令行运行。在堡垒主机上,通过以下命令,使用首选编辑器创建一个文件(installer_ora_fdw.sql)。

create a "installer_ora_fdw.sql" file with the following commands.

drop schema if exists oracle_schema_compare cascade;

create schema if not exists oracle_schema_compare;
create extension if not exists oracle_fdw;

DROP SERVER IF EXISTS oradb CASCADE;
DROP USER MAPPING  IF EXISTS  FOR  :pgdbuser  SERVER oradb;

CREATE SERVER oradb FOREIGN DATA WRAPPER oracle_fdw 
OPTIONS (dbserver :'oracledetails');

CREATE USER MAPPING FOR :pgdbuser SERVER oradb 
OPTIONS (user :'oracledbuser', password :'oracledbpwsd');

IMPORT FOREIGN SCHEMA "SYS" LIMIT TO (DBA_SEGMENTS, DBA_OBJECTS,  DBA_INDEXES, DBA_IND_COLUMNS, DBA_CONSTRAINTS, DBA_CONS_COLUMNS, GLOBAL_NAME, DBA_TABLES, DBA_IND_EXPRESSIONS, DBA_IND_PARTITIONS, DBA_TAB_COLUMNS, DBA_SEQUENCES, DBA_TAB_PARTITIONS, DBA_PART_KEY_COLUMNS, DBA_MVIEWS, V_$NLS_PARAMETERS,  DBA_STAT_EXTENSIONS, V_$VERSION, ALL_PROCEDURES, ALL_ARGUMENTS) 
FROM SERVER oradb INTO oracle_schema_compare;

在 psql 命令行中,我们使用以下命令启动安装:

PGPASSWORD=<pg_password> 
psql -h <postgresql endpoint> -d <postgresql database> -U <postgresql user> -v pgdbuser=<postgresql mapping user> -v oracledetails=//<oracle hostname>:<oracleport>/<sid> -v oracledbuser=<oracle username> -v oracledbpwsd=<oracle password> -f installer_ora_fdw.sql 

我们使用以下参数:

  • <postgresql user> – RDS for PostgreSQL 主用户
  • <pg_password> – PostgreSQL 用户的密码
  • <postgresql endpoint> – PostgreSQL 集群的写入器端点
  • <postgresql database> – PostgreSQL 数据库,用于创建架构和代码验证器所需的对象
  • <postgresql mapping user> – 与 <postgresql user> 相同
  • <oracle hostname> – 包含 Oracle 数据库的主机的 IP 地址或 DNS
  • <oracle port> – Oracle 数据库的端口(默认为 1521)
  • <sid> – Oracle 数据库的 SID
  • <oracle username> – 用于连接到 Oracle 数据库的用户名
  • <oracle password> – Oracle 用户的密码

Oracle 与Aurora PostgreSQL 架构验证

比较 Oracle 和 PostgreSQL 之间的数据库对象涉及到根据不同的视图和比较来查询元数据。有关获取比较数据点所涉及的脚本的更多信息,请参阅使用 AWS SCT 和 AWS DMS 在迁移后验证数据库对象。从 Oracle 迁移到 PostgreSQL 的数据类型考虑和映射很关键,它们会影响存储和整体性能。有关为什么这很重要以及如何对 NUMBER 数据类型执行此操作的更多信息,请参阅从 Oracle 到 PostgreSQL 转换 NUMBER 数据类型 – 第 1 部分从 Oracle 到 PostgreSQL 转换 NUMBER 数据类型 – 第 2 部分

作为当前脚本的一部分,我们将数据库对象比较的统一视图作为 HTML 报表,包括架构、代码和数据类型矩阵。我们的验证参考是 Oracle 中的对象及其在目标 PostgreSQL 兼容数据库中的可用性。

架构和代码验证器

脚本接受用于控制数据库对象验证的四个输入参数。在转换阶段,我们可以使用验证器脚本架构后转换或程序后代码转换。我们还可以使用它们来标识迁移期间应用于 Oracle 数据库的架构对象更改。

默认情况下,验证器脚本仅提供包括以下数据库对象不匹配详细信息的架构对象比较:

  • 数据库配置:
    • 大小
    • 校对、编码
    • 版本
  • 架构和代码对象摘要:
    • 表分区
    • 索引
    • 表列
    • 序列
    • 序列最大值(使用 seq_max_val_compare 控制)
    • 约束(主键、外键、唯一、检查、非 NULL 和默认值)
    • 视图和物化视图
    • 触发
    • 仅限 Oracle 软件包及其公共对象(通过 code_compare 控制)
    • 函数和程序(使用 code_compare 控制)
  • 数据类型矩阵:
    • 主键和外键之间的数据类型比较

您可以在 psql 命令行中提供标志,详见下表。

标志 必需 示例 描述
ora_schema* ora_schema=”DMS_SAMPLE” Oracle 源架构
pg_schema* pg_schema=”dms_sample” PostgreSQL 目标架构
seq_max_val_compare seq_max_val_compare=”Y” 验证序列最大值
code_compare code_compare=”Y” 验证程序对象,包括作为架构、程序和函数的软件包

对于验证示例,我们可以使用作为 AWS Database Migration Service(AWS DMS)示例 GitHub 存储库的一部分提供的 dms_sample 架构。

您可以从两个不同的选项中进行选择来运行脚本。第一个选项涉及验证所有对象,包括序列最大值和代码对象:

PGPASSWORD=<pgpassword> 
psql -h <hostname> -p 5432 -d dms_sample -U <pgmasteruser> -f schemavalidator.sql -v ora_schema=DMS_SAMPLE -v pg_schema=dms_sample -v seq_max_val_compare=Y -v code_compare=Y

第二个选项仅验证架构对象:

PGPASSWORD=<pgpassword> 
psql -h <hostname> -p 5432 -d dms_sample -U <pgmasteruser> -f schemavalidator.sql -v ora_schema=DMS_SAMPLE -v pg_schema=dms_sample

以下屏幕截图显示了运行脚本以验证存储对象、序列最大值和代码对象。

Oracle 与PostgreSQL 特殊情况

验证器脚本还强调了 Oracle 和 PostgreSQL 之间的一些特殊情况,这些特殊情况通常在迁移的功能测试的后期阶段确定。验证器脚本有助于我们积极主动地突显需要额外考虑的情况。

这些特殊情况包括:

  • 使用带有主键但不包括分区键的 Oracle 分区表
  • 复合唯一索引中任一列可为空
  • 长度大于 63 个字符的 Oracle 标识符
  • 用户创建的扩展统计信息可能会影响执行计划
  • Oracle 12c 默认使用 NULL 功能

迁移工程师可以在项目的早期阶段通过运行验证脚本来识别上述特殊情况,并计划如何相应地解决这些问题。

架构验证报告

您可以下载为示例 dms_sample 数据集生成的示例报告

以下屏幕截图显示了验证脚本生成的 HTML 报告中的源数据库和目标数据库的版本。

为了进行验证,我们使用 Oracle 架构作为基础,并且报告会标识 PostgreSQL 架构中缺失或不同于 Oracle 架构的对象。以下屏幕截图提供了 Oracle 和 PostgreSQL 架构中的对象类型的摘要。它还显示了 PostgreSQL 架构中缺少的表和分区。

报告的后面部分确定架构差异。

清理

完成架构验证后,使用以下命令清理脚本创建的对象。请注意,以下命令中提到的 pgdbuser 在运行脚本 installer_ora_fdw.sql 时作为参数传递。

DROP SCHEMA IF EXISTS oracle_schema_compare cascade;
DROP SERVER IF EXISTS oradb CASCADE;
DROP USER MAPPING IF EXISTS FOR :pgdbuser  SERVER oradb;

# 如果验证后不需要扩展,请删除该扩展。
DROP EXTENSION IF EXISTS oracle_fdw;

结论

架构验证器是一个工具,它提供了一种机制来验证作为源的 Oracle 与作为目标的 Aurora PostgreSQL 或 Amazon RDS for PostgreSQL 之间的对象。它消除了手动开销,也无需在迁移期间使用自定义应用程序来验证数据库对象。它还提供了 HTML 报告,用于跟踪以及与利益攸关方分享。Aurora PostgreSQL 和 Amazon RDS for PostgreSQL 中提供的 Oracle_fdw 扩展使迁移工程师能够从源数据库(Oracle)查询元数据、分析生成的报告并采取适当的措施来修复通过验证脚本确定的差异。

在这篇文章中,我们介绍了如何使用具有不同选项的自定义脚本生成比较报告,以便比较 Oracle 与 Aurora PostgreSQL 或 Amazon RDS for PostgreSQL 之间的架构对象。立即试用,然后在评论部分向我们提供反馈。我们期待您的反馈。

本篇作者

Babaiah Valluru

Babaiah Valluru 在印度海得拉巴的 AWS 专业服务团队担任数据库首席顾问,擅长于处理数据库迁移。除了帮助客户完成向云转型之旅,他目前热衷于探索和了解机器学习服务。他对 MySQL、PostgreSQL 和 MongoDB 等开源数据库有着浓厚的兴趣。他喜欢旅行,并在业余时间与家人和朋友共度时光。

Jeevan Shetty

Jeevan Shetty 是 AWS 专业服务团队的顾问。他一直在支持并帮助客户将其数据库从本地数据中心迁移到 AWS 云,以及从商用数据库引擎迁移到 Amazon 中的开源数据库。

Deepak Mahto

Deepak Mahto 曾在印度的 AWS 专业服务团队担任顾问。他热衷于自动化,并设计和实施了多个与数据库或迁移相关的工具