转换工作区可帮助您将源数据库中的架构和对象转换为与目标数据库兼容的 SQL 语法。本页面简要介绍了 Database Migration Service 转换工作区:
确定性代码和架构转换支持的对象列出了确定性架构转换支持的 Oracle 对象。
交互式 SQL 编辑器介绍了您可以在转换工作区编辑器中直接修改哪些对象。
Gemini 赋能的转换功能介绍了如何集成生成式 AI 支持,以加快架构转换流程。
转换映射文件部分概要介绍了可用于替换确定性架构转换规则的自定义指令。
旧版转换工作区介绍了不支持交互式 SQL 编辑器的旧版工作区。
某些数据类型不支持 Oracle 迁移。如需了解详情,请参阅 数据类型的已知限制。
确定性代码和架构转换
当您 创建转换工作区时,Database Migration Service 会立即使用一组确定性转换规则执行初始架构转换,其中特定 Oracle 数据类型和对象会映射到特定 PostgreSQL 数据类型和对象。此流程支持一小部分可用的 Oracle 数据库对象。
确定性代码转换支持以下 Oracle 数据库对象:
支持的 Oracle 架构元素
- 限制条件
- 索引(仅限与其表在同一架构中创建的索引)
- 具体化视图
- 对象类型(部分支持)
- 序列
- 同义词
- 表
- 查看次数
支持的 Oracle 代码元素
- 触发器(仅限表级)
- 套餐
- 函数
- 存储过程
交互式 SQL 编辑器
借助交互式 SQL 编辑器,您可以直接在 Database Migration Service 中修改转换后的 PostgreSQL 语法。您可以使用它来解决转化问题,或调整架构以更好地满足您的需求。部分对象无法在内置编辑器中修改。
可修改的 Oracle 对象
转换源数据库代码和架构后,您可以使用交互式编辑器修改针对特定类型对象生成的 SQL。该编辑器支持以下 Oracle 对象:
- 表触发器(需要权限)
- 具体化视图
- 套餐
- 函数、存储过程
- 同义词
- 查看次数
- 限制条件
- 索引
- 序列
此外,某些对象虽然已转换,但无法直接在 Database Migration Service 中修改。如需修改此类对象,您需要在 应用转换的架构和代码后直接在目标数据库上执行更新。
不支持修改的对象:
- 用户定义的对象类型
- 表
- 架构
使用 Gemini 加快代码和架构转换速度
Database Migration Service 将 Gemini for Workspace 集成到转换工作区中,可帮助您在以下方面加快和改进转换流程: Google Cloud
借助由 Gemini 提供支持的自动转换功能,增强确定性转换结果,利用 AI 的强大力量,显著减少 PostgreSQL 代码中需要进行的手动调整次数。
通过转换助理提供代码可解释性功能:一组专用提示,可帮助您更好地了解转换逻辑、为转换问题提出解决方案,或优化转换后的代码。
借助 Gemini 代码转换建议,更快地为转换问题应用修复程序:此机制可让 Gemini 模型在您修复转换问题时进行学习,并建议对工作区中的其他有缺陷对象进行更改。
如需详细了解由 Gemini 赋能的转化,请参阅以下页面:
转化对应关系文件
您可以使用转化映射文件自定义转化逻辑。转换映射文件是一种文本文件,其中包含有关如何将 Oracle 对象转换为 PostgreSQL 对象的精确说明(称为转换指令)。
支持的转化指令
Database Migration Service 支持对转换映射文件使用以下转换指令:
EXPORT_SCHEMA
EXPORT_SCHEMA
是所有转化映射文件都必须包含的指令。Database Migration Service 需要此说明,以确保将源架构转换为正确的目标架构。
请确保您的转化映射文件包含以下代码行:
EXPORT_SCHEMA 1
SCHEMA
Database Migration Service 必须能够确定哪个架构包含应使用转换指令修改的对象。
SCHEMA
指令会导致转化流程发生以下调整:
- Database Migration Service 仅转换此架构。如果您需要在单个转换工作区中转换其他架构,则需要上传多个具有不同架构的文件。
- 文件中提供的所有其他自定义指令仅适用于此特定架构中的对象。
请使用以下格式:
SCHEMA SCHEMA_NAME
其中 SCHEMA_NAME 是源数据库中架构的名称。
- 如果您在转化映射文件中添加此指令,则所有自定义设置都仅应用于此特定架构中包含的对象。 如果您想自定义其他架构中的对象,则需要创建多个转化映射文件,并将其上传到转化工作区。
- 如果您跳过此指令,则必须为由其他转换指令修改的对象提供显式架构名称。
例如,您需要使用
"SCHEMA_NAME.SOURCE_TABLE_NAME"
而不是SOURCE_TABLE_NAME
来处理REPLACE_TABLES
指令。
DATA_TYPE
您可以使用此指令在 Oracle 和 PostgreSQL 语法之间显式映射任何受支持的数据类型。此指令需要以英文逗号分隔的映射列表。整个定义必须在单行中提供,但您可以在配置文件中添加多个 DATA_TYPE
指令。请使用以下格式:
DATA_TYPE ORACLE_DATA_TYPE1:PGSQL_DATA_TYPE1 DATA_TYPE ORACLE_DATA_TYPE2:PGSQL_DATA_TYPE2...
其中 ORACLE_DATA_TYPE 和 PGSQL_DATA_TYPE 是您在迁移中使用的各个 Oracle 和 PostgreSQL 版本支持的数据类型。如需了解支持的版本,请参阅 场景概览。
示例:
DATA_TYPE REAL:double precision,SMALLINT:integer
如需详细了解 Oracle 和 PostgreSQL 数据类型,请参阅:
- Oracle 文档中的 Oracle 数据类型。
- PostgreSQL 文档中的 PostgreSQL 数据类型。
MODIFY_TYPE
借助 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
PG_INTEGER_TYPE
默认情况下,Database Migration Service 会将 NUMBER(p,s)
类型转换为 PostgreSQL DECIMAL(p,s)
类型。
您可以使用 PG_INTEGER_TYPE
指令修改此行为。将其值设置为 1
,并强制将所有具有精度和标度 (NUMBER(p,s)
) 类型的 NUMBER
转换为 PostgreSQL smallint
、integer
或 bigint
类型,具体取决于精度小数位数。
在转化映射文件中添加以下设置:
PG_INTEGER_TYPE 1
PG_NUMERIC_TYPE
如果您想将所有具有精度和标度 (NUMBER(p,s)
) 的 NUMBER
类型转换为 PostgreSQL real
或 float
类型(基于精度位数),请将此指令设置为 1
。
如果您将此指令设置为 0
,您的 NUMBER(p,s)
值将保留其确切的原始值,并使用内部 PostgreSQL 数据类型。
在转化映射文件中添加以下设置:
PG_NUMERIC_TYPE 1
DEFAULT_NUMERIC
无论您是否还使用
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 是以下各项之一:integer
、smallint
、bigint
。
示例:
DEFAULT_NUMERIC integer
REPLACE_COLS
您可以使用 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
指令重命名表或将其移至新架构。此指令需要以空格分隔的映射列表。如需详细了解每种用例的语法,请展开即可下部分。
重命名表
如需重命名转换后的架构中的表,请使用以下格式:
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 类型 |
---|---|
bigint ,int8 |
BIGINT |
bool 、boolean |
BOOLEAN |
bytea |
BYTEA |
char 、character |
CHAR |
character varying 、varchar |
VARCHAR |
date |
DATE |
decimal 、numeric |
DECIMAL |
double precision 、float8 |
DOUBLE PRECISION |
real ,float4 |
REAL |
int 、integer 、int4 |
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
架构中定义的列和数据类型。
- Database Migration Service 仅针对
PG_INTEGER_TYPE 1
会使 Database Migration Service 将root
架构中表中找到的所有 Oracle 数字数据类型转换为 PostgreSQL 专用类型,而不是 ANSI 可移植数字类型。DEFAULT_NUMERIC
会导致 Database Migration Service 将没有指定精度点的NUMBER
值转换为 PostgreSQLINTEGER
类型。 这仅适用于root
架构中表中找到的NUMBER
值。DATA_TYPE NUMBER(4\,0):integer
会导致 Database Migration Service 将特定NUMBER(4,0)
值转换为 PostgreSQLINTEGER
。MODIFY_TYPE
指令会导致 Database Migration Service 将events
源表中dates_and_times
列中的数据专门转换为 PostgreSQLDATETIME
类型,而不管实际的源列格式如何。REPLACE_COLS events(dates_and_times:event_dates),users(pseudonym:nickname)
会指示 Database Migration Service 重命名转换后的架构中的以下列:- 源
events
表中的dates_and_times
列在转换后的架构中会重命名为同一表中的event_dates
。 - 源
users
表中的pseudonym
列在转换后的架构中会重命名为同一表中的nickname
。
root
架构中的events
和users
表。- 源
REPLACE_TABLES events:login_events users:platform_users
会重命名转换后的架构中的以下表:events
表已重命名为login_events
。users
表已重命名为platform_users
。
root
架构中的events
和users
表。
旧版转换工作区
旧版转换工作区是一种功能较为有限的旧版转换工作区。旧版转换工作区不支持 Gemini 增强型转换功能或交互式 SQL 编辑器。您只能使用它们通过 Ora2Pg 迁移工具转换源架构。
我们不建议您在迁移时使用旧版转化工作区。如果您的场景需要使用旧版转化工作区,请参阅 使用旧版转化工作区。
后续步骤
如需了解如何使用转换工作区,请参阅: