通过数据传输服务DTS(Data Transmission Service),您可以将自建Oracle迁移至阿里云消息队列Kafka版或自建Kafka,从而扩展消息处理能力。本文以自建Oracle数据库迁移至阿里云消息队列Kafka实例为例,介绍数据迁移任务的配置流程。

前提条件

  • 自建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数据库中的待迁移表需具备主键或非空唯一索引。
  • 阿里云消息队列Kafka的版本为0.10.1.0~2.x,自建Kafka版本为0.10.1.0~2.7.0版本
  • 目标Kafka实例的存储空间须大于自建Oracle数据库占用的存储空间。
  • 目标Kafka实例中已创建用于接收同步数据的Topic,详情请参见创建Topic

注意事项

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

费用说明

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

迁移类型说明

迁移类型 说明
结构迁移 DTS将源库中待迁移对象的结构定义迁移到目标库。当前场景DTS仅支持表结构迁移。
全量数据迁移 DTS将源库中待迁移对象的存量数据全部迁移至目标库。
说明 在结构迁移和全量数据迁移完成之前,请勿对迁移对象执行DDL操作,否则可能导致迁移失败。
增量数据迁移 DTS在全量数据迁移的基础上轮询并捕获自建Oracle数据库产生的redo log,将自建Oracle数据库的增量更新数据实时迁移至目标库。 通过增量数据迁移可以实现在自建应用不停服的情况下,平滑地完成数据迁移。

在增量数据迁移阶段,DTS支持同步的DML、DDL语句。

准备工作

登录待迁移的Oracle数据库,创建用于采集数据的账号并授权。

说明 如您已创建包含下述权限的账号,可跳过本步骤。
数据库 结构迁移 全量迁移 增量数据迁移
自建Oracle数据库 schema的owner权限 schema的owner权限 DBA

数据库账号创建及授权方法:

自建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团队配合修改部分参数。

操作步骤

  1. 登录数据传输控制台
  2. 在左侧导航栏,单击数据迁移
  3. 迁移任务列表页面顶部,选择迁移的目标实例所属地域。
    选择地域
  4. 单击页面右上角的创建迁移任务
  5. 配置迁移任务的源库和目标库连接信息。
    源库和目标库信息
    类别 配置 说明
    任务名称 DTS会自动生成一个任务名称,建议配置具有业务意义的名称(无唯一性要求),便于后续识别。
    源库信息 实例类型 根据源库的部署位置进行选择,本文以有公网IP的自建数据库为例介绍配置流程。
    说明 当自建数据库为其他实例类型时,您还需要执行相应的准备工作,详情请参见 准备工作概览
    实例地区 当实例类型选择为有公网IP的自建数据库时,实例地区无需设置。
    说明 如果您的自建Oracle数据库进行了白名单安全设置,您需要在 实例地区配置项后,单击 获取DTS IP段来获取到DTS服务器的IP地址,并将获取到的IP地址加入自建Oracle数据库的白名单安全设置中。
    数据库类型 选择Oracle
    主机名或IP地址 填入自建Oracle数据库的访问地址,此处填入公网IP地址。
    端口 填入自建Oracle数据库的服务端口,默认为1521
    说明 本案例中,该服务端口已开放至公网。
    实例类型
    • 非RAC实例:选择该项后,您还需要填写SID信息。
    • RAC实例:选择该项后,您还需要填写ServiceName信息。
    数据库账号 填入自建Oracle的数据库账号,权限要求请参见准备工作
    数据库密码 填入该数据库账号对应的密码。
    说明 源库信息填写完毕后,您可以单击 数据库密码后的 测试连接来验证填入的源库信息是否正确。源库信息填写正确则提示 测试通过;如果提示 测试失败,单击 测试失败后的 诊断,根据提示调整填写的源库信息。
    目标库信息 实例类型 选择通过专线/VPN网关/智能接入网关接入的自建数据库
    说明 由于DTS暂时不支持直接选择消息队列Kafka版,此处将其作为自建Kafka来配置数据同步。
    实例地区 选择目标Kafka实例所属地域。
    已和源端数据库联通的VPC 选择目标Kafka实例所属的专有网络ID。您可以在Kafka实例的基本信息页面中查看到专有网络ID。kafka_vpcid
    数据库类型 选择为Kafka
    IP地址 填入Kafka实例默认接入点中的任意一个IP地址。
    说明 您可以在Kafka实例的 基本信息页面中,获取 默认接入点对应的IP地址。
    端口 Kafka实例的服务端口,默认为9092。
    数据库账号 填入Kafka实例的用户名。
    说明 如果Kafka实例的实例类型为 VPC实例,无需配置 数据库账号数据库密码
    数据库密码 填入该用户名对应的密码。
    Topic 单击右侧的获取Topic列表,然后在下拉框中选择具体的Topic。
    存储DDL的Topic 单击右侧的获取Topic列表,然后在下拉框中选择具体的Topic,用于存储DDL信息。如果未指定,DDL信息默认存储在Topic选择的Topic中。
    Kafka版本 根据Kafka实例版本,选择对应的版本信息。
    连接方式 根据业务及安全需求,选择非加密连接SCRAM-SHA-256
    是否使用Kafka Schema Registry Kafka Schema Registry是元数据提供服务层,提供了一个RESTful接口,用于存储和检索Avro Schema。
    • :不使用Kafka Schema Registry。
    • :使用Kafka Schema Registry。您需要输入Avro Schema在Kafka Schema Registry注册的URL或IP。
  6. 配置完成后,单击页面右下角的授权白名单并进入下一步
  7. 配置迁移类型、策略和对象信息。
    迁移对象配置
    配置 说明
    迁移类型 同时选中结构迁移全量数据迁移增量数据迁移
    注意 如果未选中 增量数据迁移,为保障数据一致性,全量数据迁移期间请勿在源库中写入新的数据。
    投递到kafka的数据格式 迁移到Kafka集群中的数据以avro格式存储,您需要根据avro schema定义进行数据解析,schema定义详情请参见DTS avro schema定义
    迁移到Kafka Partition策略 根据业务需求选择迁移的策略,详细介绍请参见Kafka Partition迁移策略说明
    迁移对象 迁移对象框中单击待迁移的表,然后单击向右小箭头图标将其移动至已选择对象框。
    说明 DTS会自动将表名映射为步骤5选择的Topic名称。如需更换迁移的目标Topic,请参见 库表列映射
    映射名称更改 如需更改迁移对象在目标实例中的名称,请使用对象名映射功能,详情请参见库表列映射
    源、目标库无法连接重试时 默认重试12小时,您也可以自定义重试时间。如果DTS在设置的时间内重新连接上源、目标库,迁移任务将自动恢复。否则,迁移任务将失败。
    说明 由于连接重试期间,DTS将收取任务运行费用,建议您根据业务需要自定义重试时间,或者在源和目标库实例释放后尽快释放DTS实例。
  8. 单击页面右下角的预检查并启动
    注意
    • 在数据迁移任务正式启动之前,会先进行预检查。只有预检查通过后,才能成功启动数据迁移任务。
    • 如果预检查失败,单击具体检查项后的提示,查看失败详情。
      • 您可以根据提示修复后重新进行预检查。
      • 如无需修复告警检测项,您也可以选择确认屏蔽忽略告警项并重新进行预检查,跳过告警检测项重新进行预检查。
  9. 预检查通过后,单击下一步
  10. 在弹出的购买配置确认对话框,选择链路规格并选中数据传输(按量付费)服务条款
  11. 单击购买并启动,迁移任务正式开始。

结束迁移任务

警告 为尽可能地减少业务切换带来的影响,您可以建立回退方案(将目标库的增量数据实时迁移回源库),详情请参见 业务切换流程。如果不涉及业务切换,您可以结束迁移任务。
  • 全量数据迁移

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

  • 增量数据迁移

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

    1. 观察迁移任务的进度变更为增量迁移,并显示为无延迟状态时,将源库停写几分钟,此时增量迁移的状态可能会显示延迟的时间。
    2. 等待迁移任务的增量迁移再次进入无延迟状态后,手动结束迁移任务。结束增量迁移任务

后续步骤

用于数据迁移的数据库账号拥有读写权限,为保障数据库安全性,请在数据迁移完成后,删除自建Oracle数据库中用于数据迁移的数据库账号,以及修改目标Kafka实例中RAM用户的权限。具体步骤,请参见 RAM主子账号授权