更新时间:2023-01-05 GMT+08:00

将Oracle迁移到PostgreSQL

支持的源和目标数据库

表1 支持的数据库

源数据库

目标数据库

  • 本地自建Oracle数据库
  • ECS自建Oracle数据库
  • RDS for PostgreSQL

使用建议

  • DRS任务启动和全量数据迁移阶段,请不要在源数据库执行DDL操作,否则可能导致任务异常。
  • 如果您使用的是全量迁移模式,确保源和目标数据库无业务写入,保证迁移前后数据一致。如果您使用的是全量+增量迁移模式,支持在源数据库有业务数据写入的情况下进行迁移。
  • 数据库迁移与环境多样性和人为操作均有密切关系,为了确保迁移的平顺,建议您在进行正式的数据库迁移之前进行一次演练,可以帮助您提前发现问题并解决问题。
  • 基于以下原因,建议您在启动任务时选择“稍后启动”功能,将启动时间设置在业务低峰期,相对静止的数据可以有效提升一次性迁移成功率,避免迁移对业务造成性能影响。
    • 在网络无瓶颈的情况下,全量迁移会对源数据库增加约50MB/s的查询压力,以及占用2~4个CPU。
    • 迁移无主键表时,为了确保数据一致性,会存在3s以内的单表级锁定。
    • 正在迁移的数据被其他事务长时间锁死,可能导致读数据超时。
    • DRS并发读取数据库,会占用大约6-10个session连接数,需要考虑该连接数对业务的影响。
    • 全量阶段读取表数据时,特别是大表的读取,可能会阻塞业务上对大表的独占锁操作。
  • 数据对比

    建议您结合数据对比的“稍后启动”功能,选择业务低峰期进行数据对比,以便得到更为具有参考性的对比结果。由于同步具有轻微的时差,在数据持续操作过程中进行对比任务,可能会出现少量数据不一致对比结果,从而失去参考意义。

使用须知

在创建迁移任务前,请务必阅读以下使用须知。
表2 使用须知

类型名称

使用和操作限制

数据库权限设置

  • 源数据库权限最小要求

    需要具有CREATE SESSION、SELECT ANY TRANSACTION、SELECT ANY TABLE、SELECT ANY DICTIONARY、SELECT ANY SEQUENCE权限。

  • 目标数据库权限最小要求

    用户权限需要具备在目标库创建数据库和表的权限。

迁移对象约束

  • 支持表、索引、约束、序列、数据的迁移,其他数据库对象暂不支持,如存储过程等。
  • 全量阶段不支持bfile,xml、sdo_geometry、urowid和自定义类型。
  • 对于TIMESTAMP WITH TIME ZONE类型,根据目标库时区做转换后不得大于“9999-12-31 23:59:59.999999”。
  • 不支持默认值含有表达式的函数的表的迁移。
  • 源库支持to_date和sys_guid函数做默认值。将函数作为default值时,需要目标库也有相同功能的函数。例如源库中的sys_guid函数,需要PG目标库有uuid_generate_v1函数(如果迁移sys_guid函数失败,可尝试在目标库执行以下语句安装插件,然后重试任务)。
    create extension if not exists "uuid-ossp";
  • 不支持函数索引迁移。

    示例:

    create index idx_t on t(substr(dt, 1, 8));

源数据库要求

  • 由于PostgreSQL数据库比Oracle数据库多了一层schema结构,在视图创建语句中as子句中不能包含db.table的形式,否则视图迁移会失败。

    示例:将以下的语句一需要改写成语句二。

    语句一:

    create view v1 as select id from db1.t1;

    语句二:

    create view v1 as select id from t1;
  • timestamp和interval day to second类型支持的最大精度是6。
  • 数据类型不支持bfile、xmltype、sdo_geometry和自定义类型。
  • 源库不能存在只是大小写不同的表。
  • 库名、表名不支持的字符有:非ASCII字符、“. ”、 “>”、 “<”、 “\”、 “`”、 “|”、 “,”、 “? ”、 “! ”、 “"”和 “'”。
  • 目标库为PostgreSQL增强版时,源库中同一个数据库下的触发器名称必须唯一。
  • 不支持选择源数据库的空库进行迁移。
  • 目前仅支持同步如下字符集:ZHS16GBK、AL32UTF8、UTF8、US7ASCII、WE8MSWIN1252。

目标数据库要求

  • 目标库必须是本云RDS for PostgreSQL增强版实例。
  • 目标数据库中不能存在与源数据库转换成小写后相同的对象名。

操作须知

  • 相互关联的数据对象要确保同时迁移,避免迁移因关联对象缺失,导致迁移失败。常见的关联关系:主外键关联表等。
  • 单个迁移任务每次只能迁移一个库(owner)的数据,多个数据库的迁移需要创建多个任务。
  • 表等对象名迁移到目标库后会转换成小写,如ABC和abc。
  • 源库和目标库时区设置必须一致。
  • 如有特殊字符,业务连接Oracle数据库使用的编码需和Oracle数据库服务端编码一致,否则目标库会出现乱码。
  • 由于无主键表缺乏行的唯一性标志,网络不稳定时涉及少量重试,表数据存在少量不一致的可能性。
  • 数据类型不兼容时,可能引起迁移失败。
  • 对于迁移中的数据库对象,在迁移期间,源库和目标库都不能进行写入操作,否则会导致数据不一致。
  • 迁移过程中,不允许修改、删除连接源和目标数据库的用户的用户名、密码、权限,或修改源和目标数据库的端口号。
  • 在任务启动、任务全量迁移阶段,不建议对源数据库做删除类型的DDL操作,比如删除数据库、索引等,这样可能会引起任务迁移失败。
  • 全量迁移过程中,DRS会向目标库PostgreSQL写入大量数据,会导致PostgreSQL的wal日志量急剧增长,PostgreSQL的磁盘有被写满的风险。可以通过在全量迁移前关闭PostgreSQL的日志备份功能,减少wal日志的生产,迁移完成后再将其打开的方式进行规避。
    注意:

    关闭日志备份会影响数据库的灾备恢复,请根据实际情况谨慎选择。