已知限制和建议

本页面介绍了使用 Database Migration Service 进行异构 Oracle 迁移时的已知限制(包括处理 主键或 外键和触发器等实体时的特殊注意事项),以及 推荐做法。

哪些内容不会迁移

  • 用户和权限不会迁移。
  • 在活跃迁移作业期间发生的架构更改不会自动迁移。如果您在迁移期间更改架构,则需要先使用架构更改更新转换工作区,然后刷新相关迁移作业。如需了解详情,请参阅 向迁移作业添加更新后的架构或表。
  • 不支持 SAVEPOINT 语句,并且在回滚时可能会导致数据不一致。
  • Database Migration Service 会复制用户定义的数据类型,但仅存储派生用户定义类型的基础数据类型。 例如,如果您根据 VARCHAR2 数据类型定义 USERNAME 数据类型,则数据会以 VARCHAR 形式存储在目标位置。

数据库、事务和数据一致性

  • 迁移最终会保持一致,因为 Database Migration Service 不会在每个事务发生时进行复制。迁移会从多个表中引入数据。数据加载到目标位置的顺序可能会有所不同,但在停止对来源的写入操作并清除迁移缓冲区后,数据会与来源重新保持一致。
  • 对于异构 Oracle 迁移,Database Migration Service 每个迁移作业只能迁移一个数据库。
  • Database Migration Service 支持 Oracle 多租户架构 (CDB/PDB),但每个迁移作业只能迁移一个可插入数据库。
  • 不复制 Oracle 标签安全 (OLS)。
  • 在迁移过程中,源数据库中回滚的所有事务都可能会暂时显示在目标数据库中(当事务足够长时)。
  • Database Migration Service 不支持在 Oracle Real Application Clusters (RAC) 环境中使用单客户端访问名称 (SCAN) 功能直接连接到数据库。如需了解在此类环境中使用公共 IP 许可清单连接的潜在解决方案,请参阅 排查 Oracle SCAN 错误。

数据编码

  • Database Migration Service 仅支持为目标数据库设置 UTF8 编码。不支持包含不属于 UTF8 编码集的字符的架构和表名称。
  • Database Migration Service 支持 Oracle 数据库的以下字符集编码:
    • AL16UTF16
    • AL32UTF8
    • IN8ISCII
    • IW8ISO8859P8
    • JA16SJIS
    • JA16SJISTILDE
    • KO16MSWIN949
    • US7ASCII
    • UTF8
    • WE8ISO8859P1
    • WE8ISO8859P9
    • WE8ISO8859P15
    • WE8MSWIN1252
    • ZHT16BIG5

表、架构和其他对象

  • 在迁移期间,不支持对数据、架构和元数据进行数据定义语言 (DDL) 更改。如果您在迁移期间更新架构,则需要将更改拉取到转换工作区、转换代码、清理目标并再次运行迁移作业。
  • 不支持包含字母数字字符或下划线 (_) 以外的字符的表列名称。
  • 表或列的名称长度上限为 30 个字符。 Database Migration Service 无法复制超出此限制的表,也无法复制包含名称超出此限制的列的表。
  • 不支持索引整理表 (IOT)。
  • 全局临时表需要在目标数据库中安装并创建 pgtt PostgreSQL 扩展程序。
  • 对于 BFILE 类型的列,系统只会复制文件路径。文件内容不会被复制。
  • 对于 Oracle 11g,不支持具有 ANYDATA 或 UDT 数据类型的列的表,并且整个表不会被复制。
  • 使用 dbms_job 或 dbms_scheduler 安排的作业不会迁移。
  • 物化视图定义会迁移,但其物化数据不会迁移。完成迁移后,请刷新物化视图,以便使用迁移后的表中的数据填充这些视图。
  • 序列值会迁移,但在迁移完成之前,源数据库中的序列值可能会继续递增。完成迁移后,更新目标实例上的序列值,使其与源数据库中的序列值一致。
  • 迁移作业最多可包含 10,000 个表。
  • 行的大小上限为 100 MB。超过 100 MB 限制的行不会迁移,并且会在迁移作业中显示为错误。
  • 迁移开始后创建的所有表都不会自动迁移。首先,您需要在转换工作区中拉取其架构,将转换后的定义应用于目标位置,然后更新迁移作业。
  • 在持续迁移中,不支持对包含二进制列且没有主键的源表进行数据迁移。
  • 在数据迁移期间,虚拟列 (GENERATED ALWAYS AS (...) VIRTUAL) 不会被复制,因为 Oracle 不会将虚拟列值写入重做日志。如果虚拟列是复合主键的一部分,则在复制期间,只有非虚拟列会用作主键。

数据类型限制

Oracle 迁移不支持以下数据类型:

  • ANYDATA(对于 Oracle 11g,完全不支持具有 ANYDATA 的表,也不会复制这些表。)
  • BFILE
  • INTERVAL DAY TO SECOND
  • INTERVAL YEAR TO MONTH
  • LONG/LONG RAW
  • SDO_GEOMETRY
  • UDT
  • UROWID
  • XMLTYPE
  • TIMESTAMP 中的零日期

主键注意事项

没有主键的表无法保证一致的复制。Database Migration Service 仅迁移具有主键的表。 如果源数据库包含没有主键的表,则当您 转换源代码和架构时,Database Migration Service 转换工作区会自动在目标表中创建所有缺失的主键。此自动化流程要求您的源表:

  • 尚无主键。
  • 不要在没有可为 null 的列的情况下使用 UNIQUE 约束条件。
  • 不要创建不含可为 null 的列的 UNIQUE 索引。

如果您的表不符合这些要求,您需要 手动将缺失的主键添加到转换后的 PostgreSQL 架构中的表。您还可以使用 GENERATE_MISSING_PK 转换指令停用自动主键生成功能。

对于持续迁移:在持续迁移中,不支持对包含二进制列且没有主键的源表进行数据迁移。

如果您使用的是旧版转换工作区,则需要在开始迁移之前,在目标数据库中转换后的表中手动创建主键限制条件。如需了解详情,请参阅 旧版转换工作区。

外键和触发器的注意事项

源数据库中存在的外键和触发器可能会导致数据完整性问题,甚至导致迁移作业失败。 通过为迁移用户使用 REPLICATION 选项,您可以跳过外键和触发器,从而避免这些问题。 或者,您也可以删除目标数据库中的所有外键和触发器,并在迁移完成后重新创建它们。

触发器

Database Migration Service 复制的数据已包含源数据库上的触发器所做的任何更改。如果在目标数据库上启用了触发器,它们可能会再次触发并可能操纵数据,从而导致数据完整性或重复问题。

外键

Database Migration Service 不会以事务方式复制数据,因此表可能会不按顺序迁移。如果存在外键,并且使用外键的子表在其父表之前迁移,则可能会遇到复制错误。

建议

  • 创建目标 Cloud SQL 数据库时,请确保使用足够的计算和内存资源来满足迁移需求。我们建议使用至少具有双核 CPU 的机器类型。

    例如,如果您的机器名称是 db-custom,且其具有 2 个 CPU 和 3840 MB RAM,那么机器类型名称的格式为 db-custom-2-3840。

  • 目标 Cloud SQL 数据库在迁移期间可写,以便在需要时应用数据操纵语言 (DML) 更改。请注意,不要对数据库配置或表结构进行任何可能导致迁移过程中断或影响数据完整性的更改。

配额

  • 在任何给定时间,最多可以存在 2,000 个连接配置文件和 1,000 个迁移作业。如需腾出空间,您可以删除迁移作业(包括已完成的作业)和连接配置文件。