Oracle到DM实时数据同步实施方案

目录

[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中调整对应表的数据流映射,通过自定义函数替换对应列尾部空格为其它字符。

相关推荐
恒辉信达几秒前
hhdb数据库介绍(8-4)
服务器·数据库·mysql
齐 飞1 小时前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb
云空1 小时前
《Python 与 SQLite:强大的数据库组合》
数据库·python·sqlite
暮毅1 小时前
10.Node.js连接MongoDb
数据库·mongodb·node.js
wowocpp1 小时前
ubuntu 22.04 server 格式化 磁盘 为 ext4 并 自动挂载 LTS
服务器·数据库·ubuntu
成富1 小时前
文本转SQL(Text-to-SQL),场景介绍与 Spring AI 实现
数据库·人工智能·sql·spring·oracle
songqq271 小时前
SQL题:使用hive查询各类型专利top 10申请人,以及对应的专利申请数
数据库·sql
计算机学长felix1 小时前
基于SpringBoot的“校园交友网站”的设计与实现(源码+数据库+文档+PPT)
数据库·spring boot·毕业设计·交友
小码的头发丝、2 小时前
Django中ListView 和 DetailView类的区别
数据库·python·django
Karoku0662 小时前
【企业级分布式系统】Zabbix监控系统与部署安装
运维·服务器·数据库·redis·mysql·zabbix