转换工作区可帮助您将源数据库中的架构和对象转换为与目标数据库兼容的 SQL 语法。本页简要介绍了 Database Migration Service 转换工作区:
转化概览可提供架构转换进度的横截面视图。
确定性代码和架构转换支持的对象列出了支持确定性架构转换的 Oracle 对象。
交互式 SQL 编辑器介绍了您可以在转换工作区编辑器中直接修改哪些对象。
Gemini 赋能的转换功能一文介绍了如何集成生成式 AI 支持来加快架构转换流程。
转化映射文件部分概述了可用于替换确定性架构转化规则的自定义指令。
旧版转换工作区:介绍了不支持交互式 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 指令会导致您文件中提供的所有其他自定义指令应用于此特定架构中的对象。
- 使用此指令时,数据库中包含的其他架构也会被转换,但其对象不会受到任何修改。
- 如果您在转化映射文件中添加此指令,则所有自定义设置仅适用于此特定架构中包含的对象。
- 如果您跳过此指令,则必须为其他转换指令修改的对象提供包含架构名称的完全限定对象名称。
例如,您需要使用
"SCHEMA_NAME.SOURCE_TABLE_NAME",而不是将SOURCE_TABLE_NAME用于REPLACE_TABLES指令。 - 如需自定义不同架构中的对象,请尝试以下操作:
- 为其他架构创建单独的转换映射文件,然后将其上传到转换工作区。
- 对于位于不同于您为
SCHEMA指令提供的架构中的对象,请使用包含架构名称的完全限定对象名称。
请使用以下格式:
SCHEMA SCHEMA_NAME
其中,SCHEMA_NAME 是源数据库中您的架构的名称。
CASE_HANDLING
默认情况下,Database Migration Service 会将所有对象名称转换为小写。
您可以使用 CASE_HANDLING 指令修改此行为。
- 此指令不受
SCHEMA指令的影响。 它适用于全球范围,并会影响转化工作区中的所有对象。 RENAME_*、MOVE_*和REPLACE_*指令优先于CASE_HANDLING指令,并且会准确地重命名对象,而无论CASE_HANDLING属性如何。- 如果此指令存在于多个配置文件中,且具有冲突的值,则 Database Migration Service 会在架构导入期间引发错误。
请使用以下格式:
CASE_HANDLING OPTION
其中,OPTION 可以是以下任一项:
UPPERCASE:将所有对象名称转换为大写。LOWERCASE:将所有对象名称转换为小写形式(默认行为)。PRESERVE_ORIGINAL:保留源架构中的原始大小写。如果您的应用使用区分大小写的标识符,则此功能非常有用。
示例:
CASE_HANDLING PRESERVE_ORIGINAL
GENERATE_MISSING_PK
没有主键的表无法保证复制的一致性。 Database Migration Service 仅迁移具有主键的表。 默认情况下,当您 转换源代码和架构时,Database Migration Service 转换工作区会自动在目标表中创建任何缺失的主键。
您可以使用 GENERATE_MISSING_PK 指令控制主键的自动生成。如需停用自动密钥生成,请将此指令设置为 0。
示例:
GENERATE_MISSING_PK 0
此指令会影响特定转换工作区中的所有对象。无法仅针对特定表停用自动生成主键的功能。
Database Migration Service 只能迁移在转换后的 PostgreSQL 版本中具有主键限制条件的表。如果您停用自动主键生成功能,则需要在应用转换后的架构后,在目标数据库中转换后的表中手动创建主键或唯一性限制条件。展开即可下部分可查看示例 SQL 命令。
使用现有列创建主键
您的表可能已基于一个列或多个列的组合设置了逻辑主键。例如,可能存在配置了唯一性限制条件或索引的列。使用这些列为源数据库中的表生成新的主键。例如:
ALTER TABLE TABLE_NAME ADD PRIMARY KEY (COLUMN_NAME);
使用所有列创建主键
如果您没有可作为主键的预先存在的限制条件,请使用表的所有列创建主键。确保主键长度不超过 PostgreSQL 集群允许的最大长度。例如:
ALTER TABLE TABLE_NAME ADD PRIMARY KEY (COLUMN_NAME_1, COLUMN_NAME_2, COLUMN_NAME_3, ...);
创建这样的复合主键时,您需要明确列出要使用的所有列名称。无法使用语句来检索所有列名称以实现此目的。
使用 ROWID 伪列创建唯一性限制条件
Oracle 数据库使用
ROWID 伪列来存储表中每一行的位置。如需迁移没有主键的 Oracle 表,您可以在目标 PostgreSQL 数据库中添加 ROWID 列。Database Migration Service 会使用源 Oracle ROWID 伪列中的相应数值填充该列。
如需添加列并将其设置为主键,请运行以下命令:
ALTER TABLE TABLE_NAME ADD COLUMN rowid numeric(33,0) NOT NULL; CREATE SEQUENCE TABLE_NAME_rowid_seq INCREMENT BY -1 START WITH -1 OWNED BY TABLE_NAME.rowid; ALTER TABLE TABLE_NAME ALTER COLUMN rowid SET DEFAULT nextval('TABLE_NAME_rowid_seq'); ALTER TABLE TABLE_NAME ADD CONSTRAINT CONSTRAINT_DISPLAY_NAME PRIMARY KEY (rowid);
重命名对象 (RENAME_*)
您可以在转换期间重命名不同的数据库对象。 Database Migration Service 会自动更新所有代码引用(在视图、存储过程、函数等中),以使用新名称。
常规语法
RENAME_OBJECT_TYPE SOURCE_NAME1:DESTINATION_NAME1 SOURCE_NAME2:DESTINATION_NAME2 ...
重要注意事项
-
RENAME_*指令对目标对象名称区分大小写,并且优先于CASE_HANDLING指令。例如,如果您同时使用以下两个指令:SCHEMA MySchema CASE_HANDLING PRESERVE_ORIGINAL # Destination objects are renamed exactly # to 'SoMe_tAbLe' and 'RenamedView', respecting the case # despite the CASE_HANDLING directive RENAME_TABLES some_table:SoMe_tAbLe RENAME_VIEWS MyView:RenamedView
-
对于
SOURCE_NAME,请始终引用原始对象名称,即使您使用其他指令(例如MOVE_*)也是如此。例如,如果您想重命名某个视图对象并将其移至新架构,请在两个指令中都引用原始视图名称:RENAME_VIEWS MyView:MyRenamedView MOVE_VIEWS MyView:MyOtherSchema
RENAME_TABLES指令会替换单个文件中的REPLACE_TABLES指令。 如果您想同时重命名和移动表格,建议您改用MOVE_*指令。-
SOURCE_NAME变量的完整格式取决于您是否还使用了SCHEMA指令:- 使用
SCHEMA指令:使用非限定名称,例如MyTable。 - 不使用
SCHEMA指令:使用完全限定名称,例如MySchema.MyTable。
- 使用
支持的 RENAME_* 指令
RENAME_SCHEMA:重命名架构。
单个配置文件只能包含一个RENAME_SCHEMA指令。如果提供了SCHEMA指令,RENAME_SCHEMA只能重命名该特定架构。RENAME_TABLES:重命名表。替换同一文件中的REPLACE_TABLES。RENAME_COLUMNS:重命名表中的列。 替换同一文件中的REPLACE_COLS指令。 请使用以下格式:RENAME_COLUMNS TABLE1.SRC_COL:DEST_COL TABLE2.SRC_COL:DEST_COL
如果您使用
SCHEMA指令,请使用非限定表名称。如果您不使用SCHEMA指令,请添加完全限定的表名称,例如 SCHEMA.TABLE1。RENAME_VIEWSRENAME_MATERIALIZED_VIEWSRENAME_SEQUENCESRENAME_FUNCTIONSRENAME_STORED_PROCEDURESRENAME_TRIGGERS-
RENAME_PACKAGES:Database Migration Service 将 Oracle 软件包转换为 PostgreSQL 架构。如果您的架构包含名称相同的软件包,PostgreSQL 代码在尝试创建两个同名架构时可能会遇到名称冲突。 您可以使用此指令来避免此类冲突。例如,如果您有
SALES.REPORTING_PKG和HR.REPORTING_PKG等软件包,您可以将它们重命名为不同的名称:RENAME_PACKAGES SALES.UTILS:SALES_UTILS RENAME_PACKAGES HR.UTILS:HR_UTILS
RENAME_USER_DEFINED_TYPES可用的别名:
RENAME_UDTS。
移动对象 (MOVE_*)
您可以将对象移动到目标数据库中的不同架构。 这有助于在迁移期间重新组织数据库结构。Database Migration Service 会自动更新视图、存储过程、函数等中的所有代码引用。
常规语法
MOVE_OBJECT_TYPE SOURCE_NAME1:DESTINATION_SCHEMA1 SOURCE_NAME2:DESTINATION_SCHEMA2 ...
重要注意事项
-
对于
SOURCE_NAME,请始终引用原始对象名称,即使您使用其他指令(例如RENAME_*)也是如此。例如,如果您想重命名某个视图对象并将其移至新架构,请在两个指令中都引用原始视图名称:RENAME_VIEWS MyView:MyRenamedView MOVE_VIEWS MyView:MyOtherSchema
- 该指令仅接受
DESTINATION_SCHEMA名称,而不接受完整的对象名称。 -
SOURCE_NAME变量的完整格式取决于您是否还使用了SCHEMA指令:- 使用
SCHEMA指令:使用非限定名称,例如MyTable。 - 不使用
SCHEMA指令:使用完全限定名称,例如MySchema.MyTable。
- 使用
支持的 MOVE_* 指令
MOVE_TABLES:将表移至其他架构。优先于单个配置文件中的架构更改的REPLACE_TABLES。MOVE_VIEWSMOVE_MATERIALIZED_VIEWSMOVE_SEQUENCESMOVE_FUNCTIONSMOVE_STORED_PROCEDURESMOVE_USER_DEFINED_TYPES可用的别名:
MOVE_UDTS。
示例:重新整理架构
SCHEMA LegacyApp # Moves the 'LegacyApp.Users' and 'LegacyApp.Orders' tables # to the 'data' schema. MOVE_TABLES Users:data Orders:data # Moves the 'LegacyApp.CreateUser' and 'LegacyApp.ProcessOrder' # stored procedures to the 'api' schema MOVE_STORED_PROCEDURES CreateUser:api ProcessOrder:api # Moves the 'LegacyApp.SalesSummary' views to the 'reporting' schema MOVE_VIEWS SalesSummary:reporting
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 是包含您要更改其名称的列的表的名称。如果您不使用 SCHEMA 指令,请务必使用完全限定的表名称:
SCHEMA_NAME.SOURCE_TABLE_NAME - SOURCE_COLUMN_NAME 是您要更改名称的来源中的列的名称。
- DESTINATION_COLUMN_NAME 是您要在转换后的架构中使用的列的新名称。
示例:
REPLACE_COLS events(dates_and_times:event_dates),users(pseudonym:nickname)
REPLACE_TABLES
您可以使用 REPLACE_TABLES 指令重命名表或将其移至新架构。此指令需要一个以空格分隔的映射列表。如需详细了解每种使用情形的语法,请展开即可下部分。
如果您不使用 SCHEMA 指令,请确保在来源变量和目标变量中都使用带英文引号的完全限定表名称:
"SCHEMA_NAME.SOURCE_TABLE_NAME""SCHEMA_NAME.DESTINATION_TABLE_NAME"
重命名表
如需重命名转换后的架构中的表,请使用以下格式:
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 # Preserve original casing for all objects CASE_HANDLING PRESERVE_ORIGINAL # Data type conversions PG_NUMERIC_TYPE 0 PG_INTEGER_TYPE 1 DEFAULT_NUMERIC integer DATA_TYPE NUMBER(4\,0):integer MODIFY_TYPE events:dates_and_times:TIMESTAMP # Renaming objects using the RENAME_* directives # These allow case-sensitive destination names RENAME_TABLES events:LoginEvents users:PlatformUsers RENAME_COLUMNS events.dates_and_times:EventDates users.pseudonym:Nickname RENAME_VIEWS InternalReport:FinInternalReport # Moving objects to new schemas using the MOVE_* directives MOVE_TABLES audit_log:archive MOVE_VIEWS InternalReport:reporting
使用此文件的结果如下:
EXPORT_SCHEMA 1是必需的指令。SCHEMA root会导致其他指令应用于root架构中的对象,除非使用完全限定名称。CASE_HANDLING PRESERVE_ORIGINAL可确保来源root架构中的所有对象名称在目标架构中保留其原始大小写(除非被RENAME_*指令覆盖)。PG_INTEGER_TYPE 1使 Database Migration Service 将root架构中的表内找到的所有 Oracle 数值数据类型转换为特定于 PostgreSQL 的类型,而不是 ANSI 可移植数值类型。DEFAULT_NUMERIC integer会使 Database Migration Service 将没有指定精度点的NUMBER值转换为 PostgreSQLINTEGER类型。DATA_TYPE NUMBER(4\,0):integer导致 Database Migration Service 将特定NUMBER(4,0)值转换为 PostgreSQLINTEGER。MODIFY_TYPE events:dates_and_times:TIMESTAMP指令会导致 Database Migration Service 将events源表中dates_and_times列中的数据专门转换为 PostgreSQLTIMESTAMP类型。RENAME_TABLES events:LoginEvents users:PlatformUsers重命名表,保留指定的大小写:events表已重命名为LoginEvents。users表已重命名为PlatformUsers。
RENAME_COLUMNS events.dates_and_times:EventDates user.pseudonym:Nickname重命名列,并在目标中保留指定的大小写:- 在
LoginEvents表(原名称为events)中,列dates_and_times重命名为EventDates。 - 在
PlatformUsers(原名称users)列中,pseudonym已重命名为Nickname。
- 在
RENAME_VIEWS InternalReport:FinInternalReport将视图InternalReport重命名为FinInternalReport。MOVE_TABLES audit_log:archive将audit_log表从root架构移至archive架构。MOVE_VIEWS InternalReport:reporting将InternalReport视图移至reporting架构。 由于RENAME_VIEWS指令,此视图也会重命名为FinInternalReport。Database Migration Service 会处理依赖关系:先重命名对象,然后再移动对象。
旧版转换工作区
旧版转换工作区是一种较旧且功能更有限的转换工作区。旧版转换工作区不支持 Gemini 增强型转换功能或交互式 SQL 编辑器。您只能使用它们通过 Ora2Pg 迁移工具转换源架构。
我们不建议您在迁移中使用旧版转化工作区。如果您的应用场景需要使用旧版转化工作区,请参阅 使用旧版转化工作区。
后续步骤
如需了解如何使用转换工作区,请参阅以下文章: