转换工作区可帮助您将源数据库中的架构和对象转换为与目标数据库兼容的 SQL 语法。本页面简要介绍了 Database Migration Service 转换工作区:
转化概览可提供架构转换进度的横截面视图。
确定性代码和架构转换支持的对象列出了支持确定性架构转换的 Oracle 对象。
交互式 SQL 编辑器介绍了您可以在转换工作区编辑器中直接修改哪些对象。
转化映射文件部分概述了可用于替换确定性架构转化规则的自定义指令。
旧版转换工作区:介绍了不支持交互式 SQL 编辑器的旧版工作区。
某些数据类型不支持 Oracle 迁移。如需了解详情,请参阅 数据类型的已知限制。
转换进度概览
转换工作区提供强大的概览信息,您可以在其中深入了解未解决或已解决的转换问题总数、Gemini 辅助增强功能以及转换流程的总体运行状况。
您可以使用此视图按类型、问题严重程度、所需操作或转化状态过滤架构中的对象。
如需详细了解如何使用转化概览检查转化结果,请参阅 使用转化工作区。
确定性代码和架构转换
当您 创建转换工作区时,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 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
不带精度的 NUMBER 的默认转换会更改您是否也使用
PG_INTEGER_TYPE 指令:
- 如果您使用
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 迁移工具转换源架构。
我们不建议您在迁移中使用旧版转化工作区。如果您的方案需要使用旧版转化工作区,请参阅 使用旧版转化工作区。
后续步骤
如需了解如何使用转换工作区,请参阅: