将 Oracle 转换为 Amazon RDS for PostgreSQL 或 Amazon Aurora PostgreSQL - AWS Schema Conversion Tool

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

将 Oracle 转换为 Amazon RDS for PostgreSQL 或 Amazon Aurora PostgreSQL

将 Oracle 数据库转换为适用于 PostgreSQL 的 RDS 或 Amazon Aurora PostgreSQL 时,请注意以下几点。

将 Oracle 系统对象转换为 PostgreSQL 时,AWS SCT 按下表所示执行转换。

Oracle 系统对象 描述 转换的 PostgreSQL 对象
V$VERSION 在 Oracle 数据库中显示核心库组件的版本号 aws_oracle_ext.v$version
V$INSTANCE 显示当前实例状态的视图。 aws_oracle_ext.v$instance

您可以使用 AWS SCT 将 Oracle SQL*Plus 文件转换为 psql,psql 是 PostgreSQL 的基于终端的前端。有关更多信息,请参阅使用 AWS SCT 转换应用程序 SQL

将 PostgreSQL 用作目标数据库的权限

要使用 PostgreSQL 作为目标,AWS SCT 需要 CREATE ON DATABASE 权限。请确保为每个目标 PostgreSQL 数据库授予此权限。

要使用转换后的公共同义词,请将数据库的默认搜索路径更改为 "$user", public_synonyms, public

您可以使用以下代码示例创建数据库用户并授予权限。

CREATE ROLE user_name LOGIN PASSWORD 'your_password'; GRANT CREATE ON DATABASE db_name TO user_name; ALTER DATABASE db_name SET SEARCH_PATH = "$user", public_synonyms, public;

在前面的示例中,将 user_name 替换为用户名。然后,将 db_name 替换为目标数据库名称。最后,将 your_password 替换为安全密码。

要使用 Amazon RDS for PostgreSQL 作为目标,AWS SCT 需要 rds_superuser 权限。

在 PostgreSQL 中,只有架构所有者或 superuser 才能删除架构。即使架构的所有者并不拥有架构的某些对象,该所有者也可以删除该架构及其包含的所有对象。

使用不同的用户转换不同的架构并将其应用到目标数据库时,若 AWS SCT 无法删除架构,您可能会收到一条错误消息。要避免出现此错误消息,请使用 superuser 角色。

Oracle 到 PostgreSQL 的转换设置

要编辑 Oracle 到 PostgreSQL 的转换设置,请选择 AWS SCT 中的设置,然后选择转换设置。从上面的列表中选择 Oracle,然后选择 Oracle – PostgreSQL。AWS SCT 显示了 Oracle 到 PostgreSQL 转换的所有可用设置。

AWS SCT 中的 Oracle 到 PostgreSQL 转换设置包括以下各项的选项:

  • 限制转换后的代码中操作项的注释数量。

    对于在转换后的代码中,为所选严重性级别及更高级别的操作项添加注释,请选择操作项的严重性。AWS SCT 会在转换后的代码中为所选严重性级别及更高级别的操作项添加注释。

    例如,要最大限度地减少转换后的代码中的注释数量,请选择仅错误。要在转换后的代码中包含所有操作项的注释,请选择所有消息

  • 允许 AWS SCT 将 Oracle 实体化视图转换为 PostgreSQL 表或实体化视图。对于实体化视图转换为,请选择如何转换源实体化视图。

  • 在源 Oracle 代码中包含带有 PostgreSQL 不支持的参数的 TO_CHARTO_DATETO_NUMBER 函数时使用该代码。默认情况下,AWS SCT 会在转换后的代码中模拟这些参数的用法。

    当源 Oracle 代码仅包含 PostgreSQL 支持的参数时,可以使用原生 PostgreSQL TO_CHARTO_DATETO_NUMBER 函数。在这种情况下,转换后的代码运行更快。要仅包含这些参数,请选择以下值:

    • 函数 TO_CHAR() 不使用 Oracle 特定的格式化字符串

    • 函数 TO_DATE() 不使用 Oracle 特定的格式化字符串

    • 函数 TO_NUMBER() 不使用 Oracle 特定的格式化字符串

  • 要解决源 Oracle 数据库在 NUMBER 数据类型的主键列或外键列中仅存储整数值的问题,AWS SCT 可以将这些列转换为 BIGINT 数据类型。这种方法可提高转换后的代码的性能。要采用这种方法,请选择将 NUMBER 主/外键列转换为 BIGINT 列。请确保源在这些列中不包含浮点值,以避免数据丢失。

  • 跳过源代码中已停用的触发器和约束。为此,请选择忽略禁用的触发器和约束

  • 使用 AWS SCT 转换被称为动态 SQL 的字符串变量。数据库代码可以更改这些字符串变量的值。要确保 AWS SCT 始终转换此字符串变量的最新值,请选择转换在调用的例程中创建的动态 SQL 代码

  • 解决 PostgreSQL 版本 10 及更早版本不支持过程的问题。如果您或您的用户不熟悉在 PostgreSQL 中使用过程,AWS SCT 可以将 Oracle 过程转换为 PostgreSQL 函数。为此,请选择将过程转换为函数

  • 查看有关已发生操作项的更多信息。为此,您可以通过选择添加异常,提高迁移问题块严重性级别向扩展包中添加特定函数。然后,选择引发用户定义的异常的严重性级别。

  • 使用可能包含自动生成名称的约束的源 Oracle 数据库。如果源代码使用这些名称,请确保选择使用源的原始名称转换系统生成的约束名称。如果源代码使用这些约束,但未使用其名称,请清除此选项以提高转换速度。

  • 解决数据库和应用程序在不同的时区运行的问题。默认情况下,AWS SCT 在转换后的代码中模拟时区。但是,当数据库和应用程序使用相同的时区时,您不需要这种模拟。在这种情况下,选择客户端时区与服务器端时区相匹配

  • 解决源数据库和目标数据库在不同的时区运行的问题。如果是这样,模拟 SYSDATE 内置 Oracle 函数的函数会返回与源函数不同的值。要确保源函数和目标函数返回的值相同,请选择为 SYSDATE 模拟设置默认时区

  • 在转换后的代码中使用 orafce 扩展中的函数。为此,在使用 orafce 实施中,选择要使用的函数。有关 orafce 的更多信息,请参阅 GitHub 上的 orafce

转换 Oracle 序列

AWS SCT 将序列从 Oracle 转换为 PostgreSQL。如果您使用序列维护完整性约束,请确保迁移序列的新值不会与现有值重叠。

使用源数据库中的最后一个值填充转换后的序列
  1. 以 Oracle 为源打开 AWS SCT 项目。

  2. 选择设置,然后选择转换设置

  3. 从上面的列表中选择 Oracle,然后选择 Oracle – PostgreSQL。AWS SCT 显示了 Oracle 到 PostgreSQL 转换的所有可用设置。

  4. 选择使用源端生成的最后一个值填充转换后的序列

  5. 选择确定以保存设置并关闭转换设置对话框。

转换 Oracle ROWID

在 Oracle 数据库中,ROWID 伪列包含表行的地址。ROWID 伪列是 Oracle 所特有的,因此 AWS SCT 可以在 PostgreSQL 上将 ROWID 伪列转换为数据列。通过使用此转换,您可以保留 ROWID 信息。

当 AWS SCT 转换 ROWID 伪列时,将使用 bigint 数据类型创建一个数据列。如果不存在主键,AWS SCT 会将 ROWID 列设置为主键。如果存在主键,AWS SCT 将设置具有唯一约束的 ROWID 列。

如果源数据库代码包含对 ROWID 的操作(无法使用数字数据类型运行这些操作),则 AWS SCT 可以使用 character varying 数据类型创建数据列。

为项目的 Oracle ROWID 创建数据列
  1. 以 Oracle 为源打开 AWS SCT 项目。

  2. 选择设置,然后选择转换设置

  3. 从上面的列表中选择 Oracle,然后选择 Oracle – PostgreSQL。AWS SCT 显示了 Oracle 到 PostgreSQL 转换的所有可用设置。

  4. 对于生成行 ID,执行以下操作之一:

    • 选择生成为身份以创建数字数据列。

    • 选择生成为字符域类型以创建字符数据列。

  5. 选择确定以保存设置并关闭转换设置对话框。

转换 Oracle 动态 SQL

Oracle 提供了两种实施动态 SQL 的方法:使用 EXECUTE IMMEDIATE 语句或在 DBMS_SQL 包中调用过程。如果源 Oracle 数据库包含使用动态 SQL 的对象,请使用 AWS SCT 将 Oracle 动态 SQL 语句转换为 PostgreSQL。

将 Oracle 动态 SQL 转换为 PostgreSQL
  1. 以 Oracle 为源打开 AWS SCT 项目。

  2. 在 Oracle 源树视图中选择使用动态 SQL 的数据库对象。

  3. 打开该对象的上下文 (右键单击) 菜单,然后选择 转换架构,并同意替换对象(如果存在)。以下屏幕截图显示了使用动态 SQL 的 Oracle 过程下面的已转换过程。

    Dynamic SQL 转换

转换 Oracle 分区

AWS SCT 目前支持以下分区方法:

  • 范围

  • List

  • 多列范围

  • 哈希

  • 复合(列表-列表、范围-列表、列表-范围、列表-哈希、范围-哈希、哈希-哈希)