转换工作区

转换工作区可帮助您将源数据库中的架构和对象转换为与目标数据库兼容的 SQL 语法。本页面简要介绍了 Database Migration Service 转换工作区:

无论您是使用自动架构转换还是创建其他转换映射文件,某些数据类型都不支持 Oracle 迁移。如需了解详情,请参阅 数据类型的已知限制

自动代码和架构转换

当您 创建转换工作区时,Database Migration Service 会自动执行初始架构转换。自动架构转换支持一小部分特定的 Oracle 数据库对象。

自动代码转换支持以下 Oracle 数据库对象:

  • 限制条件
  • 索引(仅限与其表在同一架构中创建的索引)
  • 具体化视图
  • 对象类型(部分支持)
  • 序列
  • 同义词
  • 查看次数
  • 触发器(仅限表级)
  • 套餐
  • 函数
  • 存储过程

交互式 SQL 编辑器

借助交互式 SQL 编辑器,您可以直接在 Database Migration Service 中修改转换后的 PostgreSQL 语法。您可以使用它来解决转化问题,或调整架构以更好地满足您的需求。部分对象无法在内置编辑器中修改。

可修改的 Oracle 对象

转换源数据库代码和架构后,您可以使用交互式编辑器修改针对特定类型对象生成的 SQL。该编辑器支持以下 Oracle 对象:

  • 表触发器(需要权限)
  • 具体化视图
  • 套餐
  • 函数、存储过程
  • 同义词
  • 查看次数
  • 限制条件
  • 索引
  • 序列

此外,某些对象虽然已转换,但无法直接在 Database Migration Service 中修改。如需修改此类对象,您需要在 应用转换的架构和代码后直接在目标数据库上执行更新。

不支持修改的对象:

  • 用户定义的对象类型
  • 架构

Gemini 辅助转化功能

Database Migration Service 将 Gemini for Workspace 集成到转换工作区,可帮助您在以下两个方面加快和改进转换流程: Google Cloud

  • 通过转换助理提供代码可解释性功能:一组专用提示,可帮助您更好地了解转换逻辑、为转换问题提出解决方案,或优化转换后的代码。

  • 借助 Gemini 代码转换建议,更快地为转换问题应用修复程序:此机制可让 Gemini 模型在您修复转换问题时进行学习,并建议对工作区中的其他有缺陷的对象进行更改。

如需详细了解 Gemini 辅助转换,请参阅以下页面:

转化对应关系文件

您可以使用转化映射文件自定义转化逻辑。转换映射文件是一种文本文件,其中包含有关如何将 Oracle 对象转换为 PostgreSQL 对象的精确说明(称为转换指令)。

支持的转化指令

Database Migration Service 支持对转换映射文件使用以下转换指令:

EXPORT_SCHEMA 是所有转化映射文件的强制性指令。Database Migration Service 需要此说明,以确保将源架构转换为正确的目标架构。 请确保您的转化映射文件包含以下代码行:

EXPORT_SCHEMA 1

Database Migration Service 必须能够确定哪个架构包含应使用转换指令修改的对象。 SCHEMA 指令会导致转化流程发生以下调整:

  • Database Migration Service 转换此架构。如果您需要在单个转换工作区中转换其他架构,则需要上传多个具有不同架构的文件。
  • 文件中提供的所有其他自定义指令仅适用于此特定架构中的对象。

请使用以下格式:

SCHEMA SCHEMA_NAME

其中 SCHEMA_NAME 是源数据库中架构的名称。

  • 如果您在转化映射文件中添加此指令,则所有自定义设置都仅应用于此特定架构中包含的对象。 如果您想自定义其他架构中的对象,则需要创建多个转化映射文件,并将其上传到转化工作区。
  • 如果您跳过此指令,则必须为由其他转换指令修改的对象提供显式架构名称。 例如,您需要使用 "SCHEMA_NAME.SOURCE_TABLE_NAME" 而不是 SOURCE_TABLE_NAME 来处理 REPLACE_TABLES 指令。

您可以使用此指令在 Oracle 和 PostgreSQL 语法之间显式映射任何受支持的数据类型。此指令需要以英文逗号分隔的映射列表。整个定义必须在单行中提供,但您可以在配置文件中添加多个 DATA_TYPE 指令。请使用以下格式:

DATA_TYPE ORACLE_DATA_TYPE1:PGSQL_DATA_TYPE1
DATA_TYPE ORACLE_DATA_TYPE2:PGSQL_DATA_TYPE2...

其中 ORACLE_DATA_TYPEPGSQL_DATA_TYPE 是您在迁移中使用的各个 Oracle 和 PostgreSQL 版本支持的数据类型。如需了解支持的版本,请参阅 场景概览

示例

DATA_TYPE REAL:double precision,SMALLINT:integer

如需详细了解 Oracle 和 PostgreSQL 数据类型,请参阅:

借助 MODIFY_TYPE 指令,您可以控制 Database Migration Service 将源表中的特定列转换为何种数据类型。此指令需要以英文逗号分隔的映射列表。 整个定义必须在单行中提供,但您可以在配置文件中添加多个 MODIFY_TYPE 指令。 请使用以下格式:

MODIFY_TYPE SOURCE_TABLE_NAME1:COLUMN_NAME:EXPECTED_END_RESULT_DATA_TYPE
MODIFY_TYPE SOURCE_TABLE_NAME2:COLUMN_NAME:EXPECTED_END_RESULT_DATA_TYPE...

其中:

  • SOURCE_TABLE_NAME 是包含要更改数据类型的列的表的名称。
  • COLUMN_NAME 是您要为其自定义转化映射的列的名称。
  • EXPECTED_END_RESULT_DATA_TYPE 是您希望转换后的列使用的 PostgreSQL 数据类型。

示例

MODIFY_TYPE events:dates_and_times:DATETIME,users:pseudonym:TEXT

默认情况下,Database Migration Service 会将 NUMBER(p,s) 类型转换为 PostgreSQL DECIMAL(p,s) 类型。

您可以使用 PG_INTEGER_TYPE 指令修改此行为。将其值设置为 1,并强制将所有具有精度和标度 (NUMBER(p,s)) 类型的 NUMBER 转换为 PostgreSQL smallintintegerbigint 类型,具体取决于精度小数位数。

在转化映射文件中添加以下设置:

PG_INTEGER_TYPE 1

如果您想将所有具有精度和标度 (NUMBER(p,s)) 的 NUMBER 类型转换为 PostgreSQL realfloat 类型(基于精度位数),请将此指令设置为 1

如果您将此指令设置为 0,您的 NUMBER(p,s) 值将保留其确切的原始值,并使用内部 PostgreSQL 数据类型。

在转化映射文件中添加以下设置:

PG_NUMERIC_TYPE 1

无论您是否还使用 PG_INTEGER_TYPE 指令,不带精度的 NUMBER 的默认转换都会发生变化:

  • 如果您使用 PG_INTEGER 指令,则没有精度的 NUMBER 会转换为 DECIMAL 值。
  • 如果您使用 PG_INTEGER 指令,则没有精度的 NUMBER 会转换为 BIGINT 值。

您可以修改此行为,并使用 DEFAULT_NUMERIC 指令指定应对没有指定精度点的 NUMBER 类型使用哪种数据类型。请使用以下格式:

DEFAULT_NUMERIC POSTGRESQL_NUMERIC_DATA_TYPE

其中,POSTGRESQL_NUMERIC_DATA_TYPE 是以下各项之一:integersmallintbigint

示例

DEFAULT_NUMERIC integer

您可以使用 REPLACE_COLS 指令重命名转换后的架构中的列。此指令需要以英文逗号分隔的映射列表。 请使用以下格式:

REPLACE_COLS SOURCE_TABLE_NAME1(SOURCE1_TABLE1_COLUMN_NAME1:DESTINATION_TABLE1_COLUMN_NAME1,SOURCE_TABLE1_COLUMN_NAME2:DESTINATION_TABLE1_COLUMN_NAME2),SOURCE_TABLE_NAME2(SOURCE_TABLE2_COLUMN_NAME1:DESTINATION_TABLE2_COLUMN_NAME1,SOURCE_TABLE2_COLUMN_NAME2:DESTINATION_TABLE2_COLUMN_NAME2)...

其中:

  • SOURCE_TABLE_NAME 是包含您要更改名称的列的表的名称。
  • SOURCE_COLUMN_NAME 是您要更改名称的来源中的列的名称。
  • DESTINATION_COLUMN_NAME 是您要为要在转换后的架构中使用的列指定的新名称。

示例

REPLACE_COLS events(dates_and_times:event_dates),users(pseudonym:nickname)

您可以使用 REPLACE_TABLES 指令重命名表或将其移至新架构。此指令需要以空格分隔的映射列表。如需详细了解每种用例的语法,请展开即可下部分。

如需重命名转换后的架构中的表,请使用以下格式:

REPLACE_TABLES SOURCE_TABLE_NAME1:DESTINATION_TABLE_NAME1 SOURCE_TABLE_NAME2:DESTINATION_TABLE_NAME2

其中:

  • SOURCE_TABLE_NAME 是您要在转换后的架构中重命名的原始表的名称。
  • DESTINATION_TABLE_NAME 是您要在转换后的架构中使用的表的新名称。

示例

REPLACE_TABLES "events:login_events" "users:platform_users"

您可以使用此指令将表从一个架构移至另一个架构,方法是将架构前缀添加到新表名称中。无论您如何对整个转化文件使用 SCHEMA 指令,都可以使用此机制。例如:

REPLACE_TABLES "events:NEW_SCHEMA_NAME.login_events"
    

用于自定义数据类型的别名

使用转换指令修改 Database Migration Service 转换不同数据类型的方式时(例如,使用 DATA_TYPE MODIFY_TYPE PG_NUMERIC_TYPE 指令),您可以使用别名,而不是源 SQL 数据类型。

展开即可下部分,查看 Database Migration Service 支持的数据类型别名列表。

别名 转换为 PostgreSQL 类型
bigintint8 BIGINT
boolboolean BOOLEAN
bytea BYTEA
charcharacter CHAR
character varyingvarchar VARCHAR
date DATE
decimalnumeric DECIMAL
double precisionfloat8 DOUBLE PRECISION
realfloat4 REAL
intintegerint4 INTEGER
int2 SMALLINT
interval INTERVAL
json JSON
smallint SMALLINT
text TEXT
time TIME
timestamp TIMESTAMP
timestamptz TIMESTAMPTZ
timetz TIMETZ
uuid UUID
XML XML

转化对应关系文件示例

请参阅以下使用所有受支持的架构转换指令的转换映射文件示例:

EXPORT_SCHEMA 1
SCHEMA root

PG_NUMERIC_TYPE 0
PG_INTEGER_TYPE 1
DEFAULT_NUMERIC integer
DATA_TYPE NUMBER(4\,0):integer
MODIFY_TYPE events:dates_and_times:TIMESTAMP
REPLACE_COLS events(dates_and_times:event_dates),users(pseudonym:nickname)
REPLACE_TABLES events:login_events users:platform_users

使用此文件的结果如下:

  • EXPORT_SCHEMA 1 是必需的指令。
  • SCHEMA root 会导致对转化流程进行以下调整:
    • Database Migration Service 仅针对 root 架构中的实体执行转换。系统不会转换任何其他架构。
    • 此文件中的所有其他自定义指令仅适用于 root 架构中定义的列和数据类型。
  • PG_INTEGER_TYPE 1 会使 Database Migration Service 将 root 架构中表中找到的所有 Oracle 数字数据类型转换为 PostgreSQL 专用类型,而不是 ANSI 可移植数字类型。
  • DEFAULT_NUMERIC 会导致 Database Migration Service 将没有指定精度点的 NUMBER 值转换为 PostgreSQL INTEGER 类型。 这仅适用于 root 架构中表中找到的 NUMBER 值。
  • DATA_TYPE NUMBER(4\,0):integer 会导致 Database Migration Service 将特定 NUMBER(4,0) 值转换为 PostgreSQL INTEGER
  • MODIFY_TYPE 指令会导致 Database Migration Service 将 events 源表中 dates_and_times 列中的数据专门转换为 PostgreSQL DATETIME 类型,而不管实际的源列格式如何。
  • REPLACE_COLS events(dates_and_times:event_dates),users(pseudonym:nickname) 会指示 Database Migration Service 重命名转换后的架构中的以下列:
    • events 表中的 dates_and_times 列在转换后的架构中会重命名为同一表中的 event_dates
    • users 表中的 pseudonym 列在转换后的架构中会重命名为同一表中的 nickname
    重命名操作仅应用于 root 架构中的 eventsusers 表。
  • REPLACE_TABLES events:login_events users:platform_users 会重命名转换后的架构中的以下表:
    • events 表已重命名为 login_events
    • users 表已重命名为 platform_users
    重命名操作仅应用于 root 架构中的 eventsusers 表。

旧版转换工作区

旧版转换工作区是一种功能较为有限的旧版转换工作区。旧版转换工作区不支持 Gemini 增强型转换功能或交互式 SQL 编辑器。您只能使用它们通过 Ora2Pg 迁移工具转换源架构。

我们不建议您在迁移时使用旧版转化工作区。如果您的场景需要使用旧版转化工作区,请参阅 使用旧版转化工作区

后续步骤