本文介绍如何使用数据传输服务DTS(Data Transmission Service),实现自建Oracle间的数据迁移。DTS支持结构迁移、全量数据迁移以及增量数据迁移,同时使用这三种迁移类型可以平滑地完成Oracle数据库的数据迁移。

前提条件

  • 源和目标Oracle数据库的版本为9i、10g、11g、12c、18c或19c版本。
    说明 为保障兼容性,建议源和目标库的版本保持一致,请勿跨版本迁移。
  • 源Oracle数据库已开启Supplemental Logging,且要求开启supplemental_log_data_pk和supplemental_log_data_ui,详情请参见Supplemental Logging
  • 源Oracle数据库已开启ARCHIVELOG(归档模式),设置合理的归档日志保持周期且允许访问归档日志,详情请参见ARCHIVELOG
  • 目标Oracle中用于创建数据库的存储空间须大于源Oracle数据库占用的存储空间。

注意事项

  • DTS在执行全量数据迁移时将占用源库和目标库一定的读写资源,可能会导致数据库的负载上升,在数据库性能较差、规格较低或业务量较大的情况下(例如源库有大量慢SQL、存在无主键表或目标库存在死锁等),可能会加重数据库压力,甚至导致数据库服务不可用。因此您需要在执行数据迁移前评估源库和目标库的性能,同时建议您在业务低峰期执行数据迁移(例如源库和目标库的CPU负载在30%以下)。
  • 如果源库中待迁移的表没有主键或唯一约束,且所有字段没有唯一性,可能会导致目标数据库中出现重复数据。
  • 如自建Oracle为RAC结构,且需接入阿里云VPC,为保证DTS任务成功运行,您需要将Oracle RAC的SCAN IP和每个节点的VIP均接入至阿里云VPC,并且配置路由。具体步骤,请参见本地IDC接入至阿里云方案概览配置DTS与专线、VPN网关或智能接入网关间的路由
    注意 在DTS控制台上配置源Oracle数据库信息时,在 数据库地址或者 IP地址只需输入Oracle RAC的SCAN IP。
  • 对于迁移失败的任务,DTS会触发自动恢复。在您将业务切换至目标实例前,请务必先结束或释放该任务,避免该任务被自动恢复后,导致源端数据覆盖目标实例的数据。

费用说明

迁移类型 链路配置费用 公网流量费用
结构迁移和全量数据迁移 不收费。 通过公网将数据迁移出阿里云时将收费,详情请参见产品定价
增量数据迁移 收费,详情请参见产品定价

迁移类型说明

迁移类型 说明
结构迁移 DTS将迁移对象的结构定义迁移到目标Oracle数据库中。目前DTS支持的对象为表、视图、同义词、触发器、存储过程、存储函数、包和自定义类型。
说明 不兼容触发器,当迁移对象包含了触发器可能导致数据不一致。
全量数据迁移 DTS会将源Oracle数据库迁移对象的存量数据,全部迁移至目标Oracle数据库中。
说明 在结构迁移和全量数据迁移完成之前,请勿对迁移对象执行DDL操作,否则可能导致迁移失败。
增量数据迁移 DTS在全量数据迁移的基础上轮询并捕获源Oracle数据库产生的redo log,将源Oracle数据库的增量更新数据同步到目标Oracle数据库中。通过增量数据迁移可以实现在应用不停服的情况下,平滑地完成Oracle数据库的迁移。

数据库账号的权限要求

迁移数据源 结构迁移 全量迁移 增量数据迁移
源Oracle数据库 schema的owner权限 schema的owner权限 DBA
目标Oracle数据库 schema的owner权限 schema的owner权限 schema的owner权限

Oracle数据库账号的创建及授权方法请参见CREATE USERGRANT

Oracle的日志开启和精细化授权

注意 如需迁移增量数据,且不允许授予DBA权限,您需要按照如下方法开启归档和补充日志,并为Oracle数据库账号授予更精细化的权限。

  1. 开启归档和补充日志。
    日志类型 开启步骤
    归档日志 执行如下命令,开启归档日志:
    shutdown immediate;
    startup mount;
    alter database archivelog;
    alter database open;
    archive log list;
    补充日志 按业务需求,选择开启库级别补充日志或者表级别补充日志:
    说明 开启库级别补充日志,则DTS任务运行更为稳定;开启表级别补充日志,则更节约源Oracle数据库的磁盘空间。
    • 开启库级别补充日志
      1. 打开最小补充日志:
        alter database add supplemental log data;
      2. 开启库级主键、唯一键补充日志:
        alter database add supplemental log data (primary key,unique index) columns;
    • 开启表级补充日志
      1. 打开最小补充日志:
        alter database add supplemental log data;
      2. 开启表级补充日志(两者选其一) :
        • 开启表级别主键补充日志
          alter table table_name add supplemental log data (primary key) columns;
        • 开启表级别全字段补充日志
          alter table tb_name add supplemental log data (all) columns ;
  2. 为Oracle数据库账号授予更精细化的权限。
    #创建数据库账号(以rdsdt_dtsacct为例)并进行授权
    create user rdsdt_dtsacct IDENTIFIED BY rdsdt_dtsacct;
    grant create session to rdsdt_dtsacct;
    grant connect to rdsdt_dtsacct;
    grant resource to rdsdt_dtsacct;
    grant execute on sys.dbms_logmnr to rdsdt_dtsacct;
    grant select on V_$LOGMNR_LOGS to rdsdt_dtsacct;
    grant select on  all_objects to rdsdt_dtsacct;
    grant select on  all_tab_cols to rdsdt_dtsacct;
    grant select on  dba_registry to rdsdt_dtsacct;
    grant select any table to rdsdt_dtsacct;
    grant select any transaction to rdsdt_dtsacct;
    -- v$log privileges
    grant select on v_$log to rdsdt_dtsacct;
    -- v$logfile privileges
    grant select on v_$logfile to rdsdt_dtsacct;
    -- v$archived_log privileges
    grant select on v_$archived_log to rdsdt_dtsacct;
    -- v$parameter privileges
    grant select on v_$parameter to rdsdt_dtsacct;
    -- v$database privileges
    grant select on v_$database to rdsdt_dtsacct;
    -- v$active_instances privileges
    grant select on v_$active_instances to rdsdt_dtsacct;
    -- v$instance privileges
    grant select on v_$instance to rdsdt_dtsacct;
    -- v$logmnr_contents privileges
    grant select on v_$logmnr_contents to rdsdt_dtsacct;
    -- system tables
    grant select on sys.USER$ to rdsdt_dtsacct;
    grant select on SYS.OBJ$ to rdsdt_dtsacct;
    grant select on SYS.COL$ to rdsdt_dtsacct;
    grant select on SYS.IND$ to rdsdt_dtsacct;
    grant select on SYS.ICOL$ to rdsdt_dtsacct;
    grant select on SYS.CDEF$ to rdsdt_dtsacct;
    grant select on SYS.CCOL$ to rdsdt_dtsacct;
    grant select on SYS.TABPART$ to rdsdt_dtsacct;
    grant select on SYS.TABSUBPART$ to rdsdt_dtsacct;
    grant select on SYS.TABCOMPART$ to rdsdt_dtsacct;
    #切换至PDB,创建数据库账号(以rdsdt_dtsacct为例)并进行授权
    ALTER SESSION SET container = ORCLPDB1;
    create user rdsdt_dtsacct IDENTIFIED BY rdsdt_dtsacct;
    grant create  session to rdsdt_dtsacct;
    grant connect  to rdsdt_dtsacct;
    grant resource to rdsdt_dtsacct;
    grant execute on sys.dbms_logmnr to rdsdt_dtsacct;
    grant select on  all_objects to rdsdt_dtsacct;
    grant select on  all_tab_cols to rdsdt_dtsacct;
    grant select on  dba_registry to rdsdt_dtsacct;
    grant select any table to rdsdt_dtsacct;
    grant select any transaction to rdsdt_dtsacct;
    -- v$log privileges
    grant select on v_$log to rdsdt_dtsacct;
    -- v$logfile privileges
    grant select on v_$logfile to rdsdt_dtsacct;
    -- v$archived_log privileges
    grant select on v_$archived_log to rdsdt_dtsacct;
    -- v$parameter privileges
    grant select on v_$parameter to rdsdt_dtsacct;
    -- v$database privileges
    grant select on v_$database to rdsdt_dtsacct;
    -- v$active_instances privileges
    grant select on v_$active_instances to rdsdt_dtsacct;
    -- v$instance privileges
    grant select on v_$instance to rdsdt_dtsacct;
    -- v$logmnr_contents privileges
    grant select on v_$logmnr_contents to rdsdt_dtsacct;
    grant select on sys.USER$ to rdsdt_dtsacct;
    grant select on SYS.OBJ$ to rdsdt_dtsacct;
    grant select on SYS.COL$ to rdsdt_dtsacct;
    grant select on SYS.IND$ to rdsdt_dtsacct;
    grant select on SYS.ICOL$ to rdsdt_dtsacct;
    grant select on SYS.CDEF$ to rdsdt_dtsacct;
    grant select on SYS.CCOL$ to rdsdt_dtsacct;
    grant select on SYS.TABPART$ to rdsdt_dtsacct;
    grant select on SYS.TABSUBPART$ to rdsdt_dtsacct;
    grant select on SYS.TABCOMPART$ to rdsdt_dtsacct;
    -- V$PDBS privileges
    grant select on V_$PDBS to rdsdt_dtsacct;
    
    #切换至CDB,并在如下两种方式选其一,进行账号创建并授权
    ALTER SESSION SET container = CDB$ROOT;
    方式一:创建C##开头的全局账号(以C##rdsdt_dtsacct为例)并进行授权(如使用方式一,则您需要提工单,联系DTS团队配合修改部分参数。提交工单地址,见下方。)
    create user C##rdsdt_dtsacct IDENTIFIED BY rdsdt_dtsacct;
    grant create session to C##rdsdt_dtsacct;
    grant connect to C##rdsdt_dtsacct;
    grant resource to C##rdsdt_dtsacct;
    grant select on v_$logmnr_contents to rdsdt_dtsacct;
    grant LOGMINING to C##rdsdt_dtsacct;
    grant EXECUTE_CATALOG_ROLE to C##rdsdt_dtsacct;
    grant execute on sys.dbms_logmnr to C##rdsdt_dtsacct;
    方式二:创建数据库账号(以rdsdt_dtsacct为例)并进行授权(如使用方式二,则您需修改Oracle数据库的默认参数。)
    alter session set "_ORACLE_SCRIPT"=true;
    create user rdsdt_dtsacct IDENTIFIED BY rdsdt_dtsacct;
    grant create session to rdsdt_dtsacct;
    grant connect to rdsdt_dtsacct;
    grant select on v_$logmnr_contents to rdsdt_dtsacct;
    grant LOGMINING TO rdsdt_dtsacct;
    grant EXECUTE_CATALOG_ROLE to rdsdt_dtsacct;
    grant execute on sys.dbms_logmnr to rdsdt_dtsacct;
    #创建数据库账号(以rdsdt_dtsacct为例)并进行授权
    create user rdsdt_dtsacct IDENTIFIED BY rdsdt_dtsacct;
    grant create  session to rdsdt_dtsacct;
    grant connect  to rdsdt_dtsacct;
    grant resource to rdsdt_dtsacct;
    grant select on V_$LOGMNR_LOGS to rdsdt_dtsacct;
    grant select on  all_objects to rdsdt_dtsacct;
    grant select on  all_tab_cols to rdsdt_dtsacct;
    grant select on  dba_registry to rdsdt_dtsacct;
    grant select any table to rdsdt_dtsacct;
    grant select any transaction to rdsdt_dtsacct;
    -- v$log privileges
    grant select on v_$log to rdsdt_dtsacct;
    -- v$logfile privileges
    grant select on v_$logfile to rdsdt_dtsacct;
    -- v$archived_log privileges
    grant select on v_$archived_log to rdsdt_dtsacct;
    -- v$parameter privileges
    grant select on v_$parameter to rdsdt_dtsacct;
    -- v$database privileges
    grant select on v_$database to rdsdt_dtsacct;
    -- v$active_instances privileges
    grant select on v_$active_instances to rdsdt_dtsacct;
    -- v$instance privileges
    grant select on v_$instance to rdsdt_dtsacct;
    -- v$logmnr_contents privileges
    grant select on v_$logmnr_contents to rdsdt_dtsacct;
    grant select on sys.USER$ to rdsdt_dtsacct;
    grant select on SYS.OBJ$ to rdsdt_dtsacct;
    grant select on SYS.COL$ to rdsdt_dtsacct;
    grant select on SYS.IND$ to rdsdt_dtsacct;
    grant select on SYS.ICOL$ to rdsdt_dtsacct;
    grant select on SYS.CDEF$ to rdsdt_dtsacct;
    grant select on SYS.CCOL$ to rdsdt_dtsacct;
    grant select on SYS.TABPART$ to rdsdt_dtsacct;
    grant select on SYS.TABSUBPART$ to rdsdt_dtsacct;
    grant select on SYS.TABCOMPART$ to rdsdt_dtsacct;
    grant LOGMINING TO rdsdt_dtsacct;
    grant EXECUTE_CATALOG_ROLE to rdsdt_dtsacct;
    grant execute on sys.dbms_logmnr to rdsdt_dtsacct;
    说明 当Oracle数据库为12c~19c(租户式),且切换至CBD,如需创建C##开头的全局账号,则您需要 提交工单,联系DTS团队配合修改部分参数。

操作步骤

本文以ECS上的自建数据库为例介绍配置流程,Oracle数据库部署在其他位置时,配置流程与该案例类似。

  1. 登录数据传输控制台
  2. 在左侧导航栏,单击数据迁移
  3. 迁移任务列表页面顶部,选择迁移的目标集群所属地域。
    选择地域
  4. 单击页面右上角的创建迁移任务
  5. 配置迁移任务的源库及目标库信息。
    配置源和目标库信息
    类别 配置 说明
    任务名称 DTS会自动生成一个任务名称,建议配置具有业务意义的名称(无唯一性要求),便于后续识别。
    源库信息 实例类型 选择ECS上的自建数据库
    说明 选择其他实例类型时,您还需要执行相应的准备工作,详情请参见 准备工作概览
    实例地区 选择部署了源Oracle数据库的ECS实例所属的地域。
    ECS实例ID 选择部署了源Oracle数据库的ECS实例ID。
    数据库类型 选择Oracle
    端口 填入源Oracle数据库的服务端口。
    实例类型
    • 非RAC实例:选择该项后,您需要填写SID信息。
    • RAC实例:选择该项后,您需要填写ServiceName信息。
    数据库账号 填入源Oracle的数据库账号,权限要求请参见数据库账号的权限要求
    数据库密码 填入该数据库账号对应的密码。
    说明 源库信息填写完毕后,您可以单击 数据库密码后的 测试连接来验证填入的源库信息是否正确。源库信息填写正确则提示 测试通过;如果提示 测试失败,单击 测试失败后的 诊断,根据提示调整填写的源库信息。
    目标库信息 实例类型 选择ECS上的自建数据库
    实例地区 选择部署了目标Oracle数据库的ECS实例所属的地域。
    ECS实例ID 选择部署了目标Oracle数据库的ECS实例ID。
    数据库类型 选择Oracle
    端口 填入目标Oracle数据库的服务端口。
    实例类型
    • 非RAC实例:选择该项后,您还需要填写SID信息。
    • RAC实例:选择该项后,您还需要填写ServiceName信息。
    数据库账号 填入目标Oracle的数据库账号,权限要求请参见数据库账号的权限要求
    数据库密码 填入该数据库账号对应的密码。
    说明 目标库信息填写完毕后,您可以单击 数据库密码后的 测试连接来验证填入的目标库信息是否正确。目标库信息填写正确则提示 测试通过;如果提示 测试失败,单击 测试失败后的 诊断,根据提示调整填写的目标库信息。
  6. 配置完成后,单击页面右下角的授权白名单并进入下一步
  7. 选择迁移对象及迁移类型。
    选择迁移类型和迁移对象
    配置 说明
    迁移类型
    • 如果只需要进行全量迁移,则同时勾选结构迁移全量数据迁移
    • 如果需要进行不停机迁移,则同时勾选结构迁移全量数据迁移增量数据迁移
    说明 如果没有选择 增量数据迁移,为保障数据一致性,全量数据迁移期间请勿在源Oracle数据库中写入新的数据。关于迁移类型的详细说明请参见 迁移类型说明
    迁移对象

    迁移对象框中单击待迁移的对象,然后单击向右小箭头将其移动至已选择对象框。

    说明
    • 迁移对象选择的粒度为库、表、列。
    • 默认情况下,迁移完成后,迁移对象名跟源Oracle数据库中的一致。如果您需要改变迁移对象在目标Oracle数据库中的名称,需要使用对象名映射功能,详情请参见库表列映射
    • 如果使用了对象名映射功能,可能会导致依赖这个对象的其他对象迁移失败。
    映射名称更改 如需更改迁移对象在目标实例中的名称,请使用对象名映射功能,详情请参见库表列映射
    源、目标库无法连接重试时间 默认重试12小时,您也可以自定义重试时间。如果DTS在设置的时间内重新连接上源、目标库,迁移任务将自动恢复。否则,迁移任务将失败。
    说明 由于连接重试期间,DTS将收取任务运行费用,建议您根据业务需要自定义重试时间,或者在源和目标库实例释放后尽快释放DTS实例。
  8. 上述配置完成后,单击页面右下角的预检查并启动
    说明
    • 在迁移任务正式启动之前,会先进行预检查。只有预检查通过后,才能成功启动迁移任务。
    • 如果预检查失败,单击具体检查项后的提示,查看失败详情。
      • 您可以根据提示修复后重新进行预检查。
      • 如无需修复告警检测项,您也可以选择确认屏蔽忽略告警项并重新进行预检查,跳过告警检测项重新进行预检查。
  9. 预检查通过后,单击下一步
  10. 在弹出的购买配置确认对话框,选择链路规格并选中数据传输(按量付费)服务条款
  11. 单击购买并启动,迁移任务正式开始。
    • 结构迁移+全量数据迁移

      请勿手动结束迁移任务,否则可能会导致数据不完整。您只需等待迁移任务完成即可,迁移任务会自动结束。

    • 结构迁移+全量数据迁移+增量数据迁移

      迁移任务不会自动结束,您需要手动结束迁移任务。

      注意 请选择合适的时间手动结束迁移任务,例如业务低峰期或准备将业务切换至目标集群时。
      1. 观察迁移任务的进度变更为增量迁移,并显示为无延迟状态时,将源库停写几分钟,此时增量迁移的状态可能会显示延迟的时间。
      2. 等待迁移任务的增量迁移再次进入无延迟状态后,手动结束迁移任务。结束增量迁移任务