转化问题和模式参考

转换工作区会将所有转换问题汇总到不同的组和类别中,以帮助您规划如何修复转换错误和警告。每个类别代表您可能需要执行的工作类型,以解决问题(审核、重构、调整数据类型)。组提供进一步的汇总,因为它们在较低级别区分特定情况:

转换工作区概览屏幕,其中显示了转换问题组和类别。
图 1. 转换工作区概览屏幕,其中显示了转换问题组和类别。
转换工作区概览屏幕,其中显示了转换问题组和类别。

下表列出了您在架构转换期间可能遇到的所有转换问题组:

问题组 ID 说明

源代码无效

潜在根本原因

当 Database Migration Service 遇到未知语法或 Oracle 源代码无效(例如,存储过程缺少 END; 关键字)时,通常会发生此组中的错误。

可能的缓解措施

更正 Oracle 源数据库中的无效对象。然后,在 Database Migration Service 中刷新源架构快照,并重试架构转换过程。或者,您也可以从迁移中排除该对象。

缺少引用的对象

潜在根本原因

Database Migration Service 会使用源树中对象的元数据来提高依赖对象的代码转换质量。如果您的代码引用了源架构中未包含的对象,您可能会遇到转换问题,因为 Database Migration Service 无法确定缺失的引用列、属性或对象的结构或数据类型。

此组中可能出现的错误包括用户定义类型 (UDT) 的数据类型不正确,或列、参数或变量的默认 VARCHAR 数据类型不正确。

可能的缓解措施

确保将所有引用的对象添加到 Database Migration Service 源树中,或者根据您对缺失依赖项的源数据模型的了解,手动调整 PostgreSQL 代码。

没有主键的表

潜在根本原因

Database Migration Service 要求所有表都必须拥有主键。对于没有主键的表,Database Migration Service 会向目标 PostgreSQL 表添加一个名为 rowid 的 NUMERIC 列。此列会填充源 Oracle ROWID 伪列中的相应数值。为确保 INSERT 语句在迁移后不会失败,Database Migration Service 会创建一个序列,并使用该序列自动递增 rowid 列。

可能的缓解措施

您可以在迁移后保留或移除 rowid 列。

不受支持的 Oracle 内置功能

潜在根本原因

您可能使用了不受支持的内置 Oracle 功能。

可能的缓解措施

在 PostgreSQL 中找到类似的功能,并相应地修改转换后的代码。在某些情况下,缺失的功能可能由 Orafce 扩展程序提供,该扩展程序可用于 Cloud SQL for PostgreSQL 和 AlloyDB for PostgreSQL 迁移。

不支持SQLCODE

潜在根本原因

不支持转换 Oracle SQLCODE 函数。SQLCODE 会返回 INTEGER,而 PostgreSQL 中最接近的等效函数是返回 TEXT 值的 SQLSTATE 函数。

可能的缓解措施

如果您的源代码不依赖于 SQLCODE 返回整数(例如,SQLCODE 仅记录在 VARCHAR2 列中或使用 DBMS_OUTPUT 消息),则可以在 PostgreSQL 代码中安全地使用 SQLSTATE。

如果您的源代码依赖于 SQLCODE 返回整数(例如,您将其与 NUMBER 或 INTEGER 变量一起使用,或将 SQLCODE 返回值保存为参数或列),则需要重构转换后的代码。

不支持 Oracle SQL 函数

潜在根本原因

Database Migration Service 不支持转换某些 Oracle 内置函数。

某些函数在 PostgreSQL 中可能有等效函数(例如 ASCII),其他函数可能具有相同的名称,但具有不同的规范(例如 REGEXP% 函数)。有些函数可能根本不存在。

可能的缓解措施

检查哪个 Oracle 函数引发了错误。

  • 如果该函数在 PostgreSQL 中存在且行为相同,您可以忽略出错提示,因为转换后的代码在迁移后应该会以相同的方式运行。
  • 如果某个函数名称相同,但工作方式不同,或者在 PostgreSQL 中不存在,您可以尝试修复转换后的代码:

    • 在目标数据库中创建同名的用户定义的函数 (UDF)。
    • 将源代码中的函数调用替换为等效表达式。
    • 使用由 Gemini 增强的转换辅助功能。 如需了解详情,请参阅 在 Gemini 协助下转换 SQL Server 代码和架构。

    • 某些 Oracle 数据库函数或功能可以使用扩展程序(例如 Orafce)进行复制。如需详细了解目标数据库中支持的扩展程序,请参阅 支持的数据库扩展程序。

不完全支持 Oracle 内置软件包

潜在根本原因

Database Migration Service 支持某些 Oracle 内置软件包,但许多软件包不提供完整的转换支持,例如 DBMS_STATS、DBMS_UTILITY 或 DBMS_SQL。

可能的缓解措施

如果您使用任何不受支持的软件包,则可能需要:

  • 更改您的密码。例如,您可以使用更简单的命令(如 ANALYZE),而不是使用 DBMS_STATS.GATHER_TABLE_STATS。

    UTL_FILE 和 DBMS_AQ 等软件包可能需要重构,因为它们无法在 PostgreSQL 中轻松复制。

  • 某些 Oracle 数据库函数或功能可以使用扩展程序(例如 Orafce)进行复制。如需详细了解目标数据库中支持的扩展程序,请参阅 支持的数据库扩展程序。

不支持转换 Oracle 数据类型

潜在根本原因

目前,某些 Oracle 数据类型不支持转换或数据移动。

可能的缓解措施

在大多数情况下,PostgreSQL 都有等效的数据类型。您可以 使用转换映射文件自定义转换逻辑,并将不受支持的 Oracle 数据类型转换为所需的 PostgreSQL 数据类型。

如需详细了解数据类型支持,请参阅 转换工作区 - 概览和支持的对象。

命名冲突

潜在根本原因

此组会捕获多个数据库对象(例如表、物化视图)在目标数据库中转换为使用相同名称的问题。例如,如果源对象的名称仅大小写不同,则可能会出现此问题。Oracle 对象名称不区分大小写,但 PostgreSQL 区分大小写,因此对象名称会转换为使用相同的字符串。

可能的缓解措施

直接在源数据库中或在转换工作区编辑器中的转换后架构中重命名冲突的对象。您还可以 将转换映射文件与 RENAME_* 指令搭配使用。

不支持来源功能

潜在根本原因

此组会捕获与不支持转换的 Oracle 功能相关的所有一般问题。此组中的问题不属于任何其他更具体的问题组。

可能的缓解措施

不支持架构对象类型

潜在根本原因

Database Migration Service 不支持某些 Oracle 架构对象类型进行代码转换,因为 PostgreSQL 没有适当的等效项。示例包括索引组织表 (IOT)、文本搜索索引或用户定义类型 (UDT) 的主体。

可能的缓解措施

Database Migration Service 会将不受支持的对象转换为最接近的 PostgreSQL 等效对象。例如,IOT 会变成具有主键限制条件的常规表,文本搜索索引会转换为 B 树索引。请注意,这些转换可能会导致原始对象类型特有的功能丢失。

不支持 PL/SQL 功能

潜在根本原因

此组会捕获与不支持转换的 PL/SQL 功能相关的所有一般问题。此组中的问题不属于任何其他更具体的问题组。

可能的缓解措施

不支持批量绑定

潜在根本原因

Database Migration Service 代码转换目前不支持 Oracle 批量绑定功能,例如 BULK COLLECT、FORALL 或 SAVE EXCEPTIONS。

可能的缓解措施

如需解决此问题,您需要修改使用批量绑定功能的代码。 您可能需要考虑 PostgreSQL 和 Oracle 架构的差异,以及在您的用例中,PostgreSQL 是否需要数组处理。

在 PostgreSQL 中,有多种策略可用于处理 Oracle 批量绑定操作。这些工具的使用取决于您的具体场景,因此我们建议您使用 Gemini 赋能的转换辅助功能来处理您的特定需求。以下是一些其他示例建议,可帮助您快速入门:

  • 对于完整的 BULK COLLECT(无 LIMIT),您可以尝试使用 ARRAY_AGG 函数。
  • 对于具有 LIMIT 的 BULK COLLECT,您可以尝试使用 CURSOR FOR LOOP 加载和处理数组中的批量行。但是,如果您的用例允许功能更改,则可能更简单的替代方法是使用 CURSOR FOR LOOP 一次处理一行(而不是将它们加载到数组中)。
  • 对于 FORALL 操作,如果您选择使用数组处理,则可以尝试使用 UNNEST 的基于集的 DML。
  • 对于 SAVE EXCEPTIONS,您可能需要在基于行的 CURSOR FOR LOOP 中编写异常处理程序,因为 PostgreSQL 中没有等效的子句。

不支持集合

潜在根本原因

Database Migration Service 代码转换部分支持 Oracle 集合。

可能的缓解措施

您需要相应地修改转换后的 PostgreSQL 代码。在解决集合问题时,请记住,PostgreSQL 数组绝不是稀疏的。如果您稀疏地分配元素,则 PostgreSQL 数组可能会返回与 Oracle 数组不同的结果和基数计数。

由于 PostgreSQL 不支持字符串索引数组,因此您可能会发现 JSON/JSONB 或 hstore 扩展程序适合您的数据,具体取决于数据的性质。

不支持流水线函数

潜在根本原因

Database Migration Service 不支持流水线函数。

可能的缓解措施

您可以将 Oracle 流水线函数替换为 PostgreSQL 集合返回函数。我们建议您根据自己的应用场景调整代码。下面列出了一些示例,可供入门时参考:

  1. 引用从定义流水线函数行类型的源 Oracle 对象或记录类型转换而来的 PostgreSQL 类型 (UDT)。然后,根据您的具体情况,将 PostgreSQL 函数的返回子句修改为 RETURNS SETOF <type name> 或 RETURNS TABLE。

  2. 将转换后的 PIPE ROW 代码中的返回值替换为 RETURN NEXT <row or record variable>。

PostgreSQL 中不需要源流水线函数的集合类型(在 Oracle 函数的 RETURN 子句中使用)。

不支持动态 SQL

潜在根本原因

Database Migration Service 为转换动态 SQL 提供部分支持。 Oracle EXECUTE IMMEDIATE、OPEN FOR 和 USING/INTO 关键字会正确转换为其 PostgreSQL 等效项,但实际的动态 SQL、DML 或 DDL 字符串不会转换。

可能的缓解措施

您需要修改转换后的代码,以满足您的要求。 我们强烈建议您使用 Gemini 赋能的转换辅助功能来处理动态 SQL。

不支持CONNECT BY选项

潜在根本原因

Database Migration Service 支持大多数 CONNECT BY 运算符、函数和伪列,并将其转换为 PostgreSQL 递归通用表表达式 (CTE)。但也有一些例外情况可能需要您注意。例如,ORDER SIBLINGS BY 子句仅支持升序。

可能的缓解措施

您无法以简单的方式复制 ORDER SIBLINGS BY 子句来实现降序排序,因此您可能需要重构代码以使用升序排序。

查看报告的 CONNECT BY 运算符问题,并根据需要调整代码。我们建议您探索由 Gemini 提供支持的自动转换功能,以加快此类修复。如需了解详情,请参阅 在 Gemini 协助下转换 Oracle 代码和架构。

不支持 JSON

潜在根本原因

Database Migration Service 在支持 JSON 进行数据移动和代码转换方面存在一些限制:

  • JSONB 不支持数据移动。
  • 代码转换不支持 Oracle 中的 JSON 查询函数或运算符(例如 JSON_TABLE、JSON_QUERY、JSON_OBJECT[AGG]、JSON_ARRAYAGG、JSON_PATCH)。
  • 在 21c 之前的 Oracle 版本中,您可以将 JSON 数据存储在 VARCHAR2、CLOB 或 BLOB 列中,并使用 IS JSON 条件进行验证。Database Migration Service 不支持转换此条件。
可能的缓解措施
  • 如需将存储在 VARCHAR2、CLOB 或 BLOB 列中的 JSON 数据移至 PostgreSQL,您可能需要使用 MODIFY_TYPE 指令编写转换映射文件。

    例如:

    MODIFY_TYPE SOURCE_TABLE_NAME:BLOB_COLUMN_NAME_WITH_JSON_DATA:JSON

    如需详细了解转化映射文件,请参阅 转化映射文件。

  • 如需将 Oracle JSON 函数和运算符转换为 PostgreSQL,您可以使用 PostgreSQL 函数,例如 JSONB_ARRAY_ELEMENTS、JSON_AGG。 如需了解详情,请参阅 PostgreSQL 文档中的 JSON 函数和运算符。

锁定和事务问题

潜在根本原因

Database Migration Service 代码转换不支持 LOCK 或 SAVEPOINT 语句。PostgreSQL 不支持 SAVEPOINT。

可能的缓解措施
  • 将 Oracle 中的 SAVEPOINT 块拆分为 PostgreSQL 中利用 ROLLBACK 语句的单独事务块。
  • 如需实现 DBMS_LOCK,请使用 PostgreSQL pg_dbms_lock 扩展程序。此扩展程序通过模拟 Oracle DBMS_LOCK 软件包的功能,简化了将 Oracle 用户定义的锁迁移到 PostgreSQL 的过程。

不支持 XML

潜在根本原因

Database Migration Service 不支持 Oracle XMLTYPE 或关联的 XML 函数和运算符。

可能的缓解措施

虽然 Database Migration Service 不直接支持 XMLTYPE,但您可以将 BLOB、CLOB、NVARCHAR2 或 VARCHAR2 列自定义为 XML 以进行数据移动。PostgreSQL 支持 XML 功能。

如需迁移 XML 数据,请按以下步骤操作:

  1. 使用 MODIFY_TYPE 指令为 XML 数据创建转换映射文件。例如:

    MODIFY_TYPE SOURCE_TABLE_NAME:BLOB_COLUMN_NAME_WITH_XML_DATA:XML

    如需详细了解转化映射文件,请参阅 转化映射文件。

  2. 启动迁移作业。此过程会将所有数据从 Oracle 迁移到 PostgreSQL,但 XMLTYPE 类型列中的数据除外。这些列在 PostgreSQL 中填充了 NULL 值。t
  3. 通过仅从 Oracle 中选择 XMLTYPE 列,在 PostgreSQL 中创建外部表。包含源表中的主键列。
  4. 将外部表中的 XML 数据合并到原始 PostgreSQL 表中。

如需详细了解 PostgreSQL 如何与 XMLTYPE 搭配使用,请参阅 PostgreSQL 文档中的 XML 函数。

不支持PIVOT

潜在根本原因

Database Migration Service 不支持使用 PIVOT 和 UNPIVOT 转置运算符进行代码转换。

可能的缓解措施

您可以通过使用 tablefunc 扩展程序或将源 PIVOT 表达式重写为条件聚合,在 PostgreSQL 中实现 PIVOT 转置。例如:

  • SUM(CASE WHEN <condition> THEN <value> ELSE 0 END)
  • COUNT(CASE WHEN <condition> THEN 1 END)

您可以通过多种方式在 PostgreSQL 中创建 UNPIVOT 转置(从一组列创建键值对):

  • 将 LATERAL 联接与一组 VALUES 组合在一起。例如: SELECT ... FROM <table> CROSS JOIN LATERAL (VALUES ('<column1-name>', <column1>), ('<column2-name>', <column2>) AS u(column_name, column_value))
  • 将 UNNEST 与 ARRAY 搭配使用。例如: SELECT ..., UNNEST(ARRAY['<column1-name>', '<column2-name>']) AS column_name, UNNEST(ARRAY[column1, column2]) AS column_value FROM <table>

不支持ALTER语句选项

潜在根本原因

Database Migration Service 不会转换 ALTER 语句(通常在动态 SQL 中执行)。

可能的缓解措施

将 Oracle ALTER 语句替换为 PostgreSQL 中的 SET 命令。我们建议您探索由 Gemini 提供支持的自动转换功能,以加快此类修复。如需了解详情,请参阅 在 Gemini 协助下转换 Oracle 代码和架构。

不支持 SQL 功能

潜在根本原因

此组会捕获与不支持转换的 SQL 功能相关的所有一般问题。此组中的问题不属于任何其他更具体的问题组。示例包括数据库事件触发器、GRANT 语句、多表 INSERT 操作、内嵌视图 (INSERT INTO (SELECT ... FROM ...)) 上的 DML、横向视图。

可能的缓解措施

不受支持的语法

潜在根本原因

此组捕获与不受支持的 Oracle SQL 或 PL/SQL 语法相关的所有一般问题。此组中的问题不属于任何其他更具体的问题组。

可能的缓解措施

更改代码以使用 PostgreSQL 功能等效的 PostgreSQL 语法。我们建议您探索由 Gemini 提供支持的自动转换功能,以调整代码。 如需了解详情,请参阅 在 Gemini 协助下转换 Oracle 代码和架构。

不受支持的 SQL 语法

潜在根本原因

您的源代码使用了 Database Migration Service 不支持的 SQL 语法或元素。例如,不支持 Oracle TO_DATE 函数中的 NLS_LANG 参数。

可能的缓解措施
不受支持的 PL/SQL 语法

潜在根本原因

您的源代码使用了 Database Migration Service 不支持的 PL/SQL 语法或元素。例如,不支持基于记录的 INSERT 语句(例如 INSERT INTO table VALUES r_variable)和 PRAGMA RESTRICT_REFERENCES。

可能的缓解措施

更改代码以使用 PostgreSQL 功能等效的 PostgreSQL 语法。我们建议您探索由 Gemini 提供支持的自动转换功能,以调整代码。 如需了解详情,请参阅 在 Gemini 协助下转换 Oracle 代码和架构。

不受支持的日期和时间戳语法

潜在根本原因

Database Migration Service 可能会针对不受支持的日期或时间戳语法、操作或表达式发出错误或警告。此类问题的示例包括不匹配的数据类型之间的比较,或在时间戳中使用 TZH:TZM 格式模型。如需详细了解支持的对象和数据类型,请参阅 转换工作区简介。

可能的缓解措施

您可以使用 PostgreSQL 等效表达式重新创建大多数日期和时间戳表达式。 我们建议您探索由 Gemini 提供支持的自动转换功能,以加快此类修复。如需了解详情,请参阅 在 Gemini 协助下转换 Oracle 代码和架构。

Oracle 异常处理语法中不受支持的元素

潜在根本原因

Database Migration Service 代码转换不支持以下 Oracle PL/SQL 异常语法元素:

  • 使用 RAISE_APPLICATION_ERROR 搭配变量错误代码,而不是字面量 -20nnn 代码。
  • 将 SQLERRM 与错误代码参数搭配使用,因为 PostgreSQL 不支持此语法。
可能的缓解措施

您必须在转换后的代码中手动解决这些问题。 我们建议您探索由 Gemini 提供支持的自动转换功能,以加快此类修复。如需了解详情,请参阅 在 Gemini 协助下转换 Oracle 代码和架构。

数据类型和转换问题

潜在根本原因

Database Migration Service 可以根据上下文对转换问题进行分组(例如, 类型比较表达式中发生的转换问题)。CW_OP0500 组会捕获不属于其他问题组的所有通用数据类型转换问题。

可能的缓解措施

在大多数情况下,Database Migration Service 会在转换后的 PostgreSQL 代码中发出 ERROR_UNIMPLEMENTED 或 ERROR_TYPE 消息。根据您对所涉及数据类型的了解来解决此错误。

日期格式模型问题

潜在根本原因

在根据格式模型将日期或时间戳表达式转换为字符串或从字符串转换时,您可能会遇到警告或问题。当 Oracle 源代码中的类型转换不包含显式日期或时间戳格式模型时,Database Migration Service 会使用默认模型(目前为 DD-MON-RR)。

如果为隐式转换发出的格式模型与同一表达式中的显式格式模型冲突,有时可能会导致转换后的代码出现问题。如果您的数据可能会受到 Oracle RR 格式和 PostgreSQL YY 格式之间差异的影响,您也可能会看到此问题。

可能的缓解措施

在转换工作区中查看并验证转换后的 PostgreSQL 表达式。

数字格式模型问题

潜在根本原因

Database Migration Service 不支持所有 Oracle 格式模型。例如,不支持 'L' 或 'X'。 您可能会遇到根据 Oracle 格式模型将字符串转换为数字的代码问题或警告。

可能的缓解措施

对于在 PostgreSQL 中没有等效项的 Oracle 格式模型,您可能需要重构表达式或格式模型。 我们建议您探索由 Gemini 提供支持的自动转换功能,以加快此类修复。如需了解详情,请参阅 在 Gemini 协助下转换 Oracle 代码和架构。

数据类型转换问题

潜在根本原因

您可能会因数据类型转换不受支持或不准确而遇到错误。Database Migration Service 通常会发出 ERROR_UNIMPLEMENTED。 这通常是因为元数据缺失或不完整。 Database Migration Service 可能没有足够的信息来转换类型,例如在函数实参或过程形参中。

可能的缓解措施

调整 PostgreSQL 代码,确保数据类型转换正确。 这些更正要求您熟悉所引用的属性、变量和列。

比较问题

潜在根本原因

在转换数据比较表达式时,Database Migration Service 可能没有足够的元数据或数据类型信息。例如,将用户定义类型 (UDT) 与 NULL 进行比较时,可能会发生这种情况。

可能的缓解措施

查看转换后的 PostgreSQL 表达式并解决问题。 我们建议您探索由 Gemini 提供支持的自动转换功能,以加快此类修复。如需了解详情,请参阅 在 Gemini 协助下转换 Oracle 代码和架构。

此类别中的问题表示 Oracle 源代码已正确转换为最接近的 PostgreSQL 等效代码,但生成的代码可能存在细微的语义或功能差异,需要您进行审核。这是因为 Oracle 和 PostgreSQL 处理数据类型、格式或对象的方式存在差异。

乍一看,此类别似乎与 数据类型和转换 (CW_05) 类别中的问题重叠,但请注意,它们代表不同的问题。CW_05 包含 Database Migration Service 无法将 Oracle 代码转换为等效 PostgreSQL 代码的已知问题。

查看日期格式模型

潜在根本原因

大多数 Oracle 日期和时间戳格式模型在 PostgreSQL 中都有适当的等效项,因此转换后的代码没有语义或功能差异。某些模型没有完全匹配项,其行为会有所不同。 一个示例是 Oracle RR 格式转换为 PostgreSQL YY 格式。

可能的缓解措施

查看并验证具有格式模型转换的表达式,以确保转换后的代码按预期运行。

查看数字格式模型

潜在根本原因

大多数源数字格式模型在 PostgreSQL 中都有等效项,因此转换后的代码没有语义或功能差异。 不过,某些格式模型可能没有完全匹配的模型,或者行为略有不同。

可能的缓解措施

查看并验证具有格式模型转换的表达式,以确保转换后的代码按预期运行。

查看异常代码

潜在根本原因

当您将 RAISE_APPLICATION_ERROR 与 -20000 到 -20999 范围内的错误代码搭配使用时,Database Migration Service 会将其转换为 PostgreSQL RAISE EXCEPTION,其中 SQLSTATE 范围为 CW0000 到 CW999。转换会保留来源错误代码的最后 3 位数字,并在其前面加上 CW。

可能的缓解措施

请查看此行为,确定它是否适合您的需求。 仅当源错误代码对您的应用、支持团队或文档有意义时,才需要进行此审核。如果错误代码值本身没有意义,您可以忽略此警告。

查看异常消息

潜在根本原因

SQLERRM 函数同时存在于 Oracle PL/SQL 和 PostgreSQL 中,但它在每个引擎中可能会返回不同的错误文本。例如,在 Oracle 中除以零会返回错误文本 ORA-01476: divisor is equal to zero,但在 PostgreSQL 中会返回 ERROR: division by zero。

可能的缓解措施

如果您的应用、支持基础架构或文档依赖于错误文本,请查看转换。否则,您可以忽略此差异。

查看 Oracle 内置函数的模拟情况

潜在根本原因

Database Migration Service 代码和架构转换旨在提供与 PostgreSQL 等效的 Oracle 函数行为,但结果可能并不总是能满足您的场景。 因此,转换工作区始终会提供建议警告,其中包含可能需要您审核的函数转换。

可能的缓解措施

我们建议您查看转换工作区在 CW_OP0605 问题组中发出警告的对象。

查看外键列数据类型

潜在根本原因

Database Migration Service 发现父对象和子对象之间的数据类型规范不匹配(例如,父列为 NUMBER(4),子列为 NUMBER(10))。

可能的缓解措施

在大多数情况下,轻微的数据类型不匹配不会导致数据库功能出现问题。不过,我们建议您检查转换后的数据模型是否存在不一致之处。

建议审核功能性
潜在根本原因

此组会捕获与 Oracle 和 PostgreSQL 代码中的潜在功能差异相关的所有一般性问题。此组中的问题不属于任何其他更具体的问题组。

可能的缓解措施

查看 Oracle 内置函数的模拟情况

潜在根本原因

许多 Oracle 内置函数在 PostgreSQL 中没有直接对应的等效函数。 为了帮助缓解迁移过程中的这一问题,Database Migration Service 会使用不同的 SQL 表达式转换代码,以便在 PostgreSQL 中产生等效的功能行为。

在某些情况下,转换后的表达式可能会很复杂。 Database Migration Service 会在 CW_OP0702 组中发出警告,以突出显示可能存在的问题,并建议使用表达式模拟函数。

可能的缓解措施

查看转换后的代码,确保转换后的函数在 PostgreSQL 环境中按预期运行。

需要重构自治事务

潜在根本原因

PostgreSQL 不支持 自治事务。

可能的缓解措施

您可以使用 dblink、 pg_background 或 PL/Proxy 扩展程序在 PostgreSQL 中实现自治事务。使用其中任何一个扩展程序进行的数据库调用都会在不同的会话中执行,因此会生成自治事务。

需要重构数据库链接

潜在根本原因

Database Migration Service 不支持 Oracle 数据库链接。使用链接的对象需要重构。

可能的缓解措施

根据数据库链接的目标,您可以使用数据库扩展程序(例如 dblink、 postgres_fdw、 oracle_fdw 或 PL/Proxy)在 PostgreSQL 中实现等效功能。

需要重构高级排队

潜在根本原因

Oracle Advanced Queuing 软件包(DBMS_AQ、DBMS_AQADM)没有 PostgreSQL 等效项,需要重构。

可能的缓解措施

您可以考虑采取以下方案:

  • 将排队功能从数据库重构到应用层。
  • 使用 PostgreSQL 表、提醒和触发器来实现等效行为。
  • 如需更多帮助,请咨询您的技术解决方案团队代表。

需要重构数据库邮件

潜在根本原因

AlloyDB for PostgreSQL 不支持直接从数据库发送电子邮件。此外,也不支持启用此功能的扩展程序。 因此,Database Migration Service 不会转换 UTL_SMTP 软件包的使用。

可能的缓解措施

重构数据库电子邮件代码,并将发送电子邮件的职责移至应用层。您仍然可以使用数据库来捕获需要发送电子邮件的条件。

一个示例实现是将电子邮件详细信息写入专用表。此表还可以充当电子邮件队列,您可以使用 Cloud Run functions 函数轮询该队列并处理实际的 SMTP 处理。

需要重构作业和调度

潜在根本原因

Database Migration Service 不会转换 DBMS_JOB 和 DBMS_SCHEDULER Oracle 软件包。您需要重构引用这些软件包的代码。

可能的缓解措施

对于没有依赖项的简单作业,您可以使用 pg_cron 扩展程序在目标 PostgreSQL 数据库中手动创建计划作业。

对于 pg_cron 不支持的更复杂的计划,您可能需要使用应用级或第三方调度器。

需要重构文件 I/O

潜在根本原因

Database Migration Service 不支持 Oracle UTL_FILE 软件包。您需要重构引用此软件包的代码。

Orafce 扩展程序包含 UTL_FILE 模拟,但由于文件 I/O 功能受限,可能无法在 Google 代管式 PostgreSQL 环境中运行。

可能的缓解措施
  • 重构代码,移除对 UTL_FILE 的依赖。
  • AlloyDB for PostgreSQL 对文件 I/O 功能有一定的限制,因此无法直接在目标数据库中实现此行为。

    一种可能的替代方案是在 VPC 中的 Compute Engine 虚拟机上安装带有 orafce 扩展程序的 PostgreSQL。然后,您可以在目标数据库中使用 PL/Proxy 扩展程序,调用在 Compute Engine 虚拟机上的数据库中运行的 与 PostgreSQL 兼容的 UTL_FILE 版本。

同义词

潜在根本原因

PostgreSQL 不支持同义词。对于代码对象,Database Migration Service 会自动将同义词引用替换为其源架构和对象名称。如果您在代码对象之外使用同义词(例如在数据库应用用户的只读架构中),则需要手动转换它们。

可能的缓解措施

对于代码对象之外的同义词用法,您可以使用 PostgreSQL SEARCH_PATH 参数,也可以重构代码以使用视图来查询对象。

需要重构全局临时表

潜在根本原因

此问题组是一条警告,表示 Database Migration Service 在 Oracle 源代码中检测到全局临时表。如需迁移全局临时表,您必须在目标数据库中安装并创建 pgtt PostgreSQL 扩展程序。

可能的缓解措施

我们建议您验证是否已在目标数据库中安装并创建 pgtt PostgreSQL 扩展程序。

查看 Gemini 建议

可能的根本原因:

此问题组会捕获与 Gemini 增强型代码转换相关的所有一般错误和警告。

可能的缓解措施:此处发现的问题不一定总是指向实际问题,但我们强烈建议您检查所有 Gemini 增强型转化,确保它们符合您的预期。

查看 AI 增强型代码

潜在根本原因:此 DDL 代码是使用 Gemini 增强功能转换的,可能需要您审核其准确性。

可能的缓解措施:我们建议您仔细检查使用 AI 增强功能转换的代码,确保最终结果与源架构的功能一致。

引用

可能的根本原因:Gemini 增强型建议可能包含引用自多个来源的内容。某些引用可能受许可限制。 我们建议您检查转换后的代码,看看是否有引用。

元数据转换问题

可能的根本原因:

此组涵盖不属于任何其他更具体问题组的所有转化问题。

可能的缓解措施

我们建议您根据对源数据模型的了解,查看转换后的代码,并根据需要调整代码。

元数据转换问题

可能的根本原因:

此组会捕获不属于任何其他更具体问题组的所有元数据跟踪问题。

可能的缓解措施:

此组中的问题示例通常与编译错误或警告有关,这些错误或警告可能会导致转换后的 PostgreSQL 中的数据类型出现问题。我们建议您根据对源数据模型的了解,检查转换后的代码并调整错误的引用。

请与支持团队联系

潜在根本原因

在特殊极端情况下,您可能会遇到有效 Oracle 源对象的内部错误。如果您遇到这种情况,请与支持团队联系,获取更多帮助。

一般转换问题

潜在根本原因

此组包含不属于任何其他更具体的问题类别或组的所有问题。

可能的缓解措施

我们建议您根据对源数据模型和代码的了解,查看转换后的代码,并根据需要进行调整。