目录
[1 项目概述](#1 项目概述)
[2 需求分析](#2 需求分析)
[3 实施操作](#3 实施操作)
[3.1 历史数据全量同步](#3.1 历史数据全量同步)
[3.2 增量数据实时同步](#3.2 增量数据实时同步)
[4 问题总结](#4 问题总结)
[4.1 字符型非空约束](#4.1 字符型非空约束)
[4.2 字符型唯一索引尾部空格](#4.2 字符型唯一索引尾部空格)
1 项目概述
将Oracle 11g RAC生产环境数据同步到DM8分析环境,Oracle数据库大小1.5T,日增归档100G,DM数据库为新建库。
初始同步表数70多张,其中10张表记录数过千万,最大表记录数上亿,后续根据需要增加其它同步表。
数据同步正常延时不超过5秒。
2 需求分析
数据同步涉及已有历史数据一次性同步和新增数据实时同步两项内容。
历史数据同步通过BeeDI的ETL功能实现,BeeDI从源表读取数据,然后将读取的数据批量写入目标表。
增量数据同步采用BeeDI日志捕获功能实现,BeeDI通过SCN获取日志增量记录,还原日志记录对应的DML操作数据,然后依据DML类型(ins、del、upd)对目标库执行相应数据操作。
DM库中对应的目标表,无需手工创建,可通过BeeDI的模式映射功能在同步数据时自动创建。
同步表大多包含时间戳信息,之所以弃用时间戳同步方式,原因在于当写入记录的时间序列与对应记录的提交时间序列不一致时,采用时间戳进行实时同步会出现丢失数据的情况。
3 实施操作
3.1 历史数据全量同步
针对需要同步的每一张表,单独配置全量同步任务,操作如下:
1) 新建ETL任务,任务名称对应表名。
2)配置Oracle和DM数据库连接。
3)从Oracle接口窗口拖拽表节点到DM接口。
4)调整装载组件属性,勾选[是否清空]复选框,装载模式选择[批量]。
5)启动任务,观察任务运行状况,如果任务运行出错,需要分析错误原因,解决错误后重新启动任务,直到任务成功结束。
重复以上操作,直到所有需要同步的表对应的同步任务配置完成。
记录以上最先运行任务的开始时间,该时间将作为实时同步任务的日志捕获起点。
3.2 增量数据实时同步
对于需要同步的所有表,集中配置一个实时同步任务,操作如下:
1)新建ETL任务,指定实时任务名称。
2)配置Oracle和DM数据库连接。
3)从Oracle窗口拖拽将要同步的表节点到模板空白处创建对应源表的抽取组件。
4)在DM窗口通过 [装载] 快捷命令创建对应目标表的装载组件。
5)建立抽取组件到装载组件的数据流映射。
6)重复以上3)、4)、 5)步骤,直到所有需要同步的表对应的抽取组件和装载组件完成映射。
7)使用快捷命令[自动排列]格式化组件显示。
8)从上到下依次调整各个抽取组件的[增量抽取]属性,勾选[增量抽取]复选框,在弹出的[增量抽取设置]对话框中选择[日志]增量模式,在逻辑主键窗口通过快捷命令[主键]或[唯一索引]设置增量同步逻辑主键。
9)所有抽取组件启用日志增量同步后,任意调整某个抽取组件的增量抽取属性,将解析点时间设置为最先运行全量同步任务的开始时间,确定后在提示框[是否选择更新多表捕获关联抽取组件属性?]出现时选择[是]。
10)设置任务定时自动启动,观察任务运行状况,如果任务运行出错,需要分析错误原因,解决错误后重新启动任务,直到任务成功结束。
4 问题总结
4.1 字符型非空约束
在Oracle中,非空列允许存入长度为0的字符串(空串),而在DM中长度为0的字符串不允许写入非空列,由此导致部分非空列包含空串的数据无法同步写入DM库。
在BeeDI中调整对应表的数据流映射,通过decode函数判定对应列输入数据是否为空串,是则输出一个预定义的默认值,否则原样输出数据。
4.2 字符型唯一索引尾部空格
在Oracle中进行数据唯一性效验时,将对字符型唯一索引字段值的全部内容进行查重,而在DM中将去除字符型唯一索引字段值的尾部空格进行查重,由此导致同样的数据在Oracle中可以写入,而在DM中由于唯一索引冲突无法写入。
在BeeDI中调整对应表的数据流映射,通过自定义函数替换对应列尾部空格为其它字符。