阿里云流式数据服务DataHub是流式数据(Streaming Data)的处理平台,提供对流式数据的发布、订阅和分发功能,让您可以轻松分析和使用流式数据。您可以通过DTS将自建Oracle同步至DataHub,帮助您快速实现使用流计算等大数据产品对数据实时分析。

前提条件

  • 自建Oracle数据库的版本为9i、10g、11g、12c、18c或19c版本。
  • 自建Oracle数据库已开启ARCHIVELOG(归档模式),设置合理的归档日志保持周期且归档日志能够被访问,详情请参见ARCHIVELOG
  • 自建Oracle数据库已开启Supplemental Logging,且已开启supplemental_log_data_pk,supplemental_log_data_ui,详情请参见Supplemental Logging
  • DataHub实例中,已创建用作接收同步数据的项目(Project),请参见创建项目

注意事项

类型 说明
源库限制
  • 同步对象要求:
    • 待同步的表需具备主键或唯一约束,且字段具有唯一性,否则可能会导致目标数据库中出现重复数据。
    • 如果您的自建Oracle版本为12c及以上,待同步表的名称长度需不超过30个字节。
    • 如同步对象为表级别,且需进行编辑(如表列名映射),则单次同步任务仅支持同步至多1000张表。当超出数量限制,任务提交后会显示请求报错,此时建议您拆分待同步的表,分批配置多个任务,或者配置整库的同步任务。
  • 如果源库通过专线的方式接入,那么需要将其中任意1个VIP配置到连接信息中,实现Oracle RAC通过专线接入同步任务。
  • 如自建Oracle为RAC架构,不支持配置ScanIP,仅支持将其中任意1个VIP配置到连接信息中,该方式配置后不支持RAC的节点切换。
  • 需开启Redo Log和Archive Log。
    说明

    如为增量同步任务,DTS要求源数据库的Redo Log和Archive Log保存24小时以上,如为全量同步和增量同步任务,DTS要求源数据库的Redo Log和Archive Log至少保留7天以上(您可在全量同步完成后将Redo Log和Archive Log保存时间设置为24小时以上),否则DTS可能因无法获取Redo Log或Archive Log而导致任务失败,极端情况下甚至可能会导致数据不一致或丢失。由于您所设置的Redo Log或Archive Log保存时间低于DTS要求的时间进而导致的问题,不在DTS的SLA保障范围内。

  • 如果源库在同步阶段进行主备切换,将会导致同步任务失败。
其他限制
  • 结构初始化对象为table。
    警告 不兼容触发器。建议您删除源库的触发器,以避免因触发器而导致数据不一致的问题。详情请参见源库存在触发器时如何配置同步作业
  • 暂不支持全量同步,即DTS不会将源实例中同步对象的存量数据同步至目标DataHub实例。
  • 仅支持表级别的数据同步。
  • 请勿对源库的同步对象使用gh-ost或pt-online-schema-change等类似工具执行在线DDL变更,否则会导致同步失败。
  • 由于DTS的延迟时间是根据同步到目标库最后一条数据的时间戳和当前时间戳对比得出,源库长时间未执行DML操作可能导致延迟信息不准确。如果任务显示的延迟时间过大,您可以在源库执行一个DML操作来更新延迟信息。
    说明 如果同步对象选择为整库,您还可以创建心跳表,心跳表每秒定期更新或者写入数据。
  • 在DTS同步期间,不允许有除DTS外的数据写入目标库,否则会导致源库与目标库数据不一致。例如,有除DTS外的数据写入目标库时,使用DMS执行在线DDL变更,可能引起目标库数据丢失。

费用说明

同步类型 链路配置费用
库表结构同步和全量数据同步 不收费。
增量数据同步 收费,详情请参见计费概述

支持的同步架构

  • 一对一单向同步
  • 一对多单向同步
  • 级联单向同步
  • 多对一单向同步
关于各类同步架构的介绍及注意事项,请参见数据同步拓扑介绍

支持同步的SQL操作

INSERT、UPDATE、DELETE。

数据库账号的权限要求

数据库 所需权限 账号创建及授权方法
自建Oracle数据库 DBA CREATE USERGRANT
重要 如需执行同步,且不允许授予DBA权限,您需要按照如下方法开启归档和补充日志,并为Oracle数据库账号授予更精细化的权限。

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;
    grant select on v$database to rdsdt_dtsacct;
    grant select on dba_objects to rdsdt_dtsacct;
    grant select on DBA_TAB_COMMENTS to rdsdt_dtsacct;
    grant select on dba_tab_cols 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;
    grant select on v$database to rdsdt_dtsacct;
    grant select on dba_objects to rdsdt_dtsacct;
    grant select on DBA_TAB_COMMENTS to rdsdt_dtsacct;
    grant select on dba_tab_cols to rdsdt_dtsacct;
    grant select_catalog_role TO rdsdt_dtsacct;
    
    #切换至CDB,并进行账号创建并授权
    ALTER SESSION SET container = CDB$ROOT;
    
    #创建数据库账号(以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;
    grant select on v$database to rdsdt_dtsacct;
    grant select on dba_objects to rdsdt_dtsacct;
    grant select on DBA_TAB_COMMENTS to rdsdt_dtsacct;
    grant select on dba_tab_cols 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;
    grant select on v$database to rdsdt_dtsacct;
    grant select on dba_objects to rdsdt_dtsacct;
    grant select on DBA_TAB_COMMENTS to rdsdt_dtsacct;
    grant select on dba_tab_cols to rdsdt_dtsacct;

操作步骤

  1. 购买数据同步作业,请参见购买流程
    说明 购买时,选择源实例为Oracle,目标实例为DataHub
  2. 登录数据传输控制台
  3. 在左侧导航栏,单击数据同步
  4. 同步作业列表页面顶部,选择同步的目标实例所属地域。
  5. 定位至已购买的数据同步实例,单击配置同步链路
  6. 配置同步作业的源实例及目标实例信息。
    源目库信息配置
    类别 配置 说明
    同步作业名称 DTS会自动生成一个同步作业名称,建议配置具有业务意义的名称(无唯一性要求),便于后续识别。
    源实例信息 实例类型 选择ECS上的自建数据库
    说明 当源实例为自建数据库时,您需要进行相应的准备工作,请参见准备工作概览
    实例地区 购买数据同步实例时选择的源实例地域信息,不可变更。
    ECS实例ID 选择自建Oracle数据库所属的ECS实例ID。
    数据库类型 固定为Oracle,不可变更。
    端口 填入自建Oracle的数据库服务端口,默认为1521。
    实例类型
    • 非RAC实例:需选择该项,您还需要填写SID信息。
    • RAC实例:暂不支持为RAC实例。
    数据库账号 填入自建Oracle的数据库账号,权限要求,请参见数据库账号的权限要求
    数据库密码 填入数据库账号对应的密码。
    目标实例信息 实例类型 固定为DataHub,不可变更。
    实例地区 购买数据同步实例时选择的目标实例地域信息,不可变更。
    Project 选择DataHub实例的Project
  7. 单击页面右下角的授权白名单并进入下一步
    说明
    • 如果源或目标数据库是阿里云数据库实例(例如RDS MySQL云数据库MongoDB版等)或ECS上的自建数据库,DTS会自动将对应地区DTS服务的IP地址添加到阿里云数据库实例的白名单或ECS的安全规则中,您无需手动添加,请参见DTS服务器的IP地址段
    • DTS任务完成或释放后,建议您手动删除添加的DTS服务器IP地址段。
  8. 配置同步策略和同步对象。
    同步对象
    配置 说明
    同步初始化 勾选结构初始化
    说明 勾选结构初始化后,在数据同步作业的初始化阶段,DTS会将同步对象的结构信息(例如表结构)同步至目标DataHub实例。
    选择同步对象

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

    说明
    • 同步对象的选择粒度为表。
    • 默认情况下,同步对象的名称保持不变。如果您需要改变同步对象在目标实例中的名称,需要使用对象名映射功能,详情请参见设置同步对象在目标实例中的名称
    选择附加列规则 DTS在将数据同步到DataHub时,会在同步的目标Topic中添加一些附加列。如果附加列和目标Topic中已有的列出现名称冲突将会导致数据同步失败。您需要根据业务需求选择是否启用新的附加列规则
    警告 在选择附加列规则前,您需要评估附加列和目标Topic中已有的列是否会出现名称冲突。关于附加列的规则和定义说明,请参见附加列名称和定义说明
    映射名称更改

    如需更改同步对象在目标实例中的名称,请使用对象名映射功能,详情请参见库表列映射

    源、目标库无法连接重试时间
    当源、目标库无法连接时,DTS默认重试720分钟(即12小时),您也可以自定义重试时间。如果DTS在设置的时间内重新连接上源、目标库,同步任务将自动恢复。否则,同步任务将失败。
    说明 由于连接重试期间,DTS将收取任务运行费用,建议您根据业务需要自定义重试时间,或者在源和目标库实例释放后尽快释放DTS实例。
  9. 可选:将鼠标指针放置在已选择对象框中待同步的Topic名上,单击对象后出现的编辑,然后在弹出的对话框中设置Shardkey(即用于分区的key)。
    shardkey配置
  10. 上述配置完成后,单击页面右下角的预检查并启动
    说明
    • 在同步作业正式启动之前,会先进行预检查。只有预检查通过后,才能成功启动同步作业。
    • 如果预检查失败,单击具体检查项后的提示,查看失败详情。
      • 您可以根据提示修复后重新进行预检查。
      • 如无需修复告警检测项,您也可以选择确认屏蔽忽略告警项并重新进行预检查,跳过告警检测项重新进行预检查。
  11. 预检查对话框中显示预检查通过后,关闭预检查对话框,同步作业将正式开始。
  12. 等待同步作业的链路初始化完成,直至处于同步中状态。
    您可以在数据同步页面,查看数据同步作业的状态。查看同步作业状态

Topic结构定义说明

DTS在将数据变更同步至DataHub实例的Topic时,目标Topic中除了存储变更数据外,还会新增一些附加列用于存储元信息,示例如下。
说明 本案例中的业务字段为idnameaddress,由于在配置数据同步时选用的是旧版附加列规则,DTS会为业务字段添加dts_的前缀。
Topic定义

结构定义说明:

旧版附加列名称 新版附加列名称 数据类型 说明
dts_record_id new_dts_sync_dts_record_id String 增量日志的记录ID,为该日志唯一标识。
说明
  • 正常情况下是全局唯一自增的,在容灾的情况下会有回退且无法保证自增和唯一。
  • 如果增量日志的操作类型为UPDATE,那么增量更新会被拆分成两条记录(分别记录更新前和更新后的值),且dts_record_id的值相同。
dts_operation_flag new_dts_sync_dts_operation_flag String 操作类型,取值:
  • I:INSERT操作。
  • D:DELETE操作。
  • U:UPDATE操作。
dts_instance_id new_dts_sync_dts_instance_id String 数据库的server ID。
dts_db_name new_dts_sync_dts_db_name String 数据库名称。
dts_table_name new_dts_sync_dts_table_name String 表名。
dts_utc_timestamp new_dts_sync_dts_utc_timestamp String 操作时间戳,即binlog的时间戳(UTC 时间)。
dts_before_flag new_dts_sync_dts_before_flag String 所有列的值是否更新前的值,取值:Y或N。
dts_after_flag new_dts_sync_dts_after_flag String 所有列的值是否更新后的值,取值:Y或N。

关于dts_before_flag和dts_after_flag的补充说明

对于不同的操作类型,增量日志中的dts_before_flagdts_after_flag定义如下:

  • INSERT

    当操作类型为INSERT时,所有列的值为新插入的值,即为更新后的值,所以dts_before_flag取值为N,dts_after_flag取值为Y,示例如下。

    INSERT操作
  • UPDATE

    当操作类型为UPDATE时,DTS会将UPDATE操作拆为两条增量日志。这两条增量日志的dts_record_iddts_operation_flagdts_utc_timestamp对应的值相同。

    第一条增量日志记录了更新前的值,所以dts_before_flag取值为Y,dts_after_flag取值为N。第二条增量日志记录了更新后的值,所以 dts_before_flag取值为N,dts_after_flag取值为Y,示例如下。

    UPDATE操作
  • DELETE

    当操作类型为DELETE时,增量日志中所有的列值为被删除的值,即列值不变,所以dts_before_flag取值为Y, dts_after_flag取值为N,示例如下。

    DELETE操作

后续操作

配置完数据同步作业后,您可以对同步到DataHub实例中的数据执行计算分析。更多详情,请参见阿里云实时计算