本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
阿里云流式数据服务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),请参见创建项目。
注意事项
类型 | 说明 |
源库限制 |
|
其他限制 |
|
费用说明
同步类型 | 链路配置费用 |
库表结构同步和全量数据同步 | 不收费。 |
增量数据同步 | 收费,详情请参见计费概述。 |
支持的同步架构
一对一单向同步
一对多单向同步
级联单向同步
多对一单向同步
关于各类同步架构的介绍及注意事项,请参见数据同步拓扑介绍。
支持同步的SQL操作
INSERT、UPDATE、DELETE。
数据库账号的权限要求
数据库 | 所需权限 | 账号创建及授权方法 |
自建Oracle数据库 | DBA | CREATE USER和GRANT。 重要 如需执行同步,且不允许授予DBA权限,您需要按照如下方法开启归档和补充日志,并为Oracle数据库账号授予更精细化的权限。 |
Oracle的日志开启和精细化授权
如需执行同步,且不允许授予DBA权限,您需要按照如下方法开启归档和补充日志,并为Oracle数据库账号授予更精细化的权限。
开启归档和补充日志。
日志类型
开启步骤
归档日志
执行如下命令,开启归档日志:
shutdown immediate; startup mount; alter database archivelog; alter database open; archive log list;
补充日志
按业务需求,选择开启库级别补充日志或者表级别补充日志:
说明开启库级别补充日志,则DTS任务运行更为稳定;开启表级别补充日志,则更节约源Oracle数据库的磁盘空间。
开启库级别补充日志
打开最小补充日志:
alter database add supplemental log data;
开启库级主键、唯一键补充日志:
alter database add supplemental log data (primary key,unique index) columns;
开启表级补充日志
打开最小补充日志:
alter database add supplemental log data;
开启表级补充日志(两者选其一) :
开启表级别主键补充日志
alter table table_name add supplemental log data (primary key) columns;
开启表级别全字段补充日志
alter table tb_name add supplemental log data (all) columns ;
为Oracle数据库账号授予更精细化的权限。
Oracle 9i~11g版本
#创建数据库账号(以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;
Oracle 12c~19c(租户式)
#切换至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;
Oracle 12c~19c(非租户式)
#创建数据库账号(以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;
说明关于Oracle(租户式)的更多信息,请参见Oracle数据库多租户。
操作步骤
- 购买数据同步作业,请参见购买流程。说明 购买时,选择源实例为Oracle,目标实例为DataHub。
登录数据传输控制台。
说明若数据传输控制台自动跳转至数据管理DMS控制台,您可以在右下角的中单击,返回至旧版数据传输控制台。
在左侧导航栏,单击数据同步。
在同步作业列表页面顶部,选择同步的目标实例所属地域。
定位至已购买的数据同步实例,单击配置同步链路。
- 配置同步作业的源实例及目标实例信息。
类别 配置 说明 无 同步作业名称 DTS会自动生成一个同步作业名称,建议配置具有业务意义的名称(无唯一性要求),便于后续识别。 源实例信息 实例类型 选择ECS上的自建数据库。 说明 当源实例为自建数据库时,您需要进行相应的准备工作,请参见准备工作概览。实例地区 购买数据同步实例时选择的源实例地域信息,不可变更。 ECS实例ID 选择自建Oracle数据库所属的ECS实例ID。 数据库类型 固定为Oracle,不可变更。 端口 填入自建Oracle的数据库服务端口,默认为1521。 实例类型 - 非RAC实例:需选择该项,您还需要填写SID信息。
- RAC实例:暂不支持为RAC实例。
数据库账号 填入自建Oracle的数据库账号,权限要求,请参见数据库账号的权限要求。 数据库密码 填入数据库账号对应的密码。 目标实例信息 实例类型 固定为DataHub,不可变更。 实例地区 购买数据同步实例时选择的目标实例地域信息,不可变更。 Project 选择DataHub实例的Project。 单击页面右下角的授权白名单并进入下一步。
如果源或目标数据库是阿里云数据库实例(例如RDS MySQL、云数据库MongoDB版等),DTS会自动将对应地区DTS服务的IP地址添加到阿里云数据库实例的白名单中;如果源或目标数据库是ECS上的自建数据库,DTS会自动将对应地区DTS服务的IP地址添加到ECS的安全规则中,您还需确保自建数据库没有限制ECS的访问(若数据库是集群部署在多个ECS实例,您需要手动将DTS服务对应地区的IP地址添到其余每个ECS的安全规则中);如果源或目标数据库是IDC自建数据库或其他云数据库,则需要您手动添加对应地区DTS服务的IP地址,以允许来自DTS服务器的访问。DTS服务的IP地址,请参见DTS服务器的IP地址段。
警告DTS自动添加或您手动添加DTS服务的公网IP地址段可能会存在安全风险,一旦使用本产品代表您已理解和确认其中可能存在的安全风险,并且需要您做好基本的安全防护,包括但不限于加强账号密码强度防范、限制各网段开放的端口号、内部各API使用鉴权方式通信、定期检查并限制不需要的网段,或者使用通过内网(专线/VPN网关/智能网关)的方式接入。
- 配置同步策略和同步对象。
配置 说明 同步初始化 勾选结构初始化。 说明 勾选结构初始化后,在数据同步作业的初始化阶段,DTS会将同步对象的结构信息(例如表结构)同步至目标DataHub实例。选择同步对象 在源库对象框中单击待迁移的对象,然后单击将其移动至已选择对象框。
说明- 同步对象的选择粒度为表。
- 默认情况下,同步对象的名称保持不变。如果您需要改变同步对象在目标实例中的名称,需要使用对象名映射功能,详情请参见设置同步对象在目标实例中的名称。
选择附加列规则 DTS在将数据同步到DataHub时,会在同步的目标Topic中添加一些附加列。如果附加列和目标Topic中已有的列出现名称冲突将会导致数据同步失败。您需要根据业务需求选择是否启用新的附加列规则为是或否。 警告 在选择附加列规则前,您需要评估附加列和目标Topic中已有的列是否会出现名称冲突。关于附加列的规则和定义说明,请参见附加列名称和定义说明。映射名称更改 如需更改同步对象在目标实例中的名称,请使用对象名映射功能,详情请参见库表列映射。
源、目标库无法连接重试时间 当源、目标库无法连接时,DTS默认重试720分钟(即12小时),您也可以自定义重试时间。如果DTS在设置的时间内重新连接上源、目标库,同步任务将自动恢复。否则,同步任务将失败。
说明由于连接重试期间,DTS将收取任务运行费用,建议您根据业务需要自定义重试时间,或者在源和目标库实例释放后尽快释放DTS实例。
- 可选:将鼠标指针放置在已选择对象框中待同步的Topic名上,单击对象后出现的编辑,然后在弹出的对话框中设置Shardkey(即用于分区的key)。
上述配置完成后,单击页面右下角的预检查并启动。
说明在同步作业正式启动之前,会先进行预检查。只有预检查通过后,才能成功启动同步作业。
如果预检查失败,单击具体检查项后的,查看失败详情。
您可以根据提示修复后重新进行预检查。
如无需修复告警检测项,您也可以选择确认屏蔽、忽略告警项并重新进行预检查,跳过告警检测项重新进行预检查。
在预检查对话框中显示预检查通过后,关闭预检查对话框,同步作业将正式开始。
等待同步作业的链路初始化完成,直至处于同步中状态。
您可以在数据同步页面,查看数据同步作业的状态。
Topic结构定义说明
DTS在将数据变更同步至DataHub实例的Topic时,目标Topic中除了存储变更数据外,还会新增一些附加列用于存储元信息,示例如下。
本案例中的业务字段为id
、name
、address
,由于在配置数据同步时选用的是旧版附加列规则,DTS会为业务字段(包含目标库中的源库原有的业字段)添加dts_
的前缀。若您使用新版附加列规则,DTS不会给目标库中的源库原有业字段加前缀。
结构定义说明:
旧版附加列名称 | 新版附加列名称 | 数据类型 | 说明 |
|
| String | 增量日志的记录ID,为该日志唯一标识。 说明
|
|
| String | 操作类型,取值:
|
|
| String | 数据库的server ID。 |
|
| String | 数据库名称。 |
|
| String | 表名。 |
|
| String | 操作时间戳,即日志的时间戳(UTC 时间)。 |
|
| String | 所有列的值是否更新前的值,取值:Y或N。 |
|
| String | 所有列的值是否更新后的值,取值:Y或N。 |
关于dts_before_flag和dts_after_flag的补充说明
对于不同的操作类型,增量日志中的dts_before_flag
和dts_after_flag
定义如下:
INSERT
当操作类型为INSERT时,所有列的值为新插入的值,即为更新后的值,所以
dts_before_flag
取值为N,dts_after_flag
取值为Y,示例如下。UPDATE
当操作类型为UPDATE时,DTS会将UPDATE操作拆为两条增量日志。这两条增量日志的
dts_record_id
、dts_operation_flag
及dts_utc_timestamp
对应的值相同。第一条增量日志记录了更新前的值,所以
dts_before_flag
取值为Y,dts_after_flag
取值为N。第二条增量日志记录了更新后的值,所以dts_before_flag
取值为N,dts_after_flag
取值为Y,示例如下。DELETE
当操作类型为DELETE时,增量日志中所有的列值为被删除的值,即列值不变,所以
dts_before_flag
取值为Y,dts_after_flag
取值为N,示例如下。
后续操作
配置完数据同步作业后,您可以对同步到DataHub实例中的数据执行计算分析。更多详情,请参见阿里云实时计算。