Oracle
Oracle Database(简称 Oracle)是甲骨文公司的一款关系数据库管理系统,以其高性能、强大扩展性和安全性著称。它支持复杂查询、高并发处理,并提供丰富的功能集,如数据备份、恢复、高可用性及多租户架构,广泛应用于企业级应用和关键任务系统。本文将介绍如何在 TapData 中添加 Oracle 数据源,后续可将其作为源或目标库来构建实时数据链路。
支持版本与架构
| 类别 | 说明 |
|---|---|
| 版本 | Oracle 9i、10g、11g、12c、18c、19c+ |
| 架构 | 支持单实例或 RAC 环境支持连接至 Data Guard、Active Data Guard 或 Automatic Storage Management 的主节点。 当增量数据获取方式选择为裸日志方案时,支持连接至从节点以避免因采集数据对源库的影响。 |
支持数据类型
| 类别 | 数据类型 |
|---|---|
| 字符串 | VARCHAR2、CHAR、NVARCHAR2、NCHAR、CLOB、NCLOB |
| 数值 | NUMBER、INTEGER、FLOAT、BINARY_FLOAT、BINARY_DOUBLE |
| 日期和时间 | DATE、TIMESTAMP、TIMESTAMP WITH TIME ZONE、TIMESTAMP WITH LOCAL TIME ZONE、INTERVAL |
| 其他 | BLOB、XMLTYPE |
- 当增量数据获取方式采用 LogMiner 方案时,不支持 INTERVAL 和 XMLTYPE;当采用裸日志方案时,不支持 TIMESTAMP WITH LOCAL TIME ZONE。
- 将 Oracle 作为目标库时,不支持 TIMESTAMP WITH LOCAL TIME ZONE 和 INTERVAL。
支持同步的操作
-
DML:INSERT、UPDATE、DELETE
提示将 Oracle 作为同步的目标时,您还可以通过任务节点的高级配置,选择写入策略:插入冲突场景下,可选择转为更新或丢弃;更新失败场景下,可选择转为插入或仅打印日志。
-
DDL:ADD COLUMN、CHANGE COLUMN、DROP COLUMN、RENAME COLUMN
增量数据获 取方式
为了提高数据变更捕获的效率,TapData 不仅支持使用数据库原生日志解析工具(LogMiner),还开发了直接解析数据库增量日志文件的能力,从而实现更高效的事件捕获,两者的对比如下:
| 方案 | 特点 | 适用场景 |
|---|---|---|
| 传统 LogMiner 方案 | ● 无需额外部署组件,运维成本低 ● 解析数据库的 redo log 获取增量变更 ● 采集性能受数据库性能影响,通常 RPS 低于 20,000 ● 19C RAC 版本及以上会涉及增量数据重扫,效率较低 | 适用于轻量化部署 对同步性能要求不高等场景 |
| TapData 裸日志方案 | ● 需要单独部署组件,需要一定运维成本 ● 直接解析原生二进制日志,减少中转 ● 采集性能更高,RPS 可达 60,000 以上 ● 账号权限需适当放宽 | 适用于数据变更频繁,即同步性能要求高 希望采集增量数据时最小化对源库影响 |
- 采用传统 LogMiner 方案时,每个数据同步任务会启动一个 Logminor session,当增量变更规模较大时,最多会占满 1 个 CPU 核的资源,增量变更规模不大时,可能约占用 0.25个 CPU 核的资源。推荐对于大数据量的任务挖掘可以单独占用一个挖掘进程,小数据量的任务挖掘可以使用共享挖掘。
- 采用裸日志方案时,由于其解析性能非常高,在业务高峰期会占用部分 CPU、内存、磁盘 I/O 资源,推荐连接至从节点以最大程度降低对业务影响。
功能限制
- Oracle 作为源库时:
- 日志解析速度约为 10,000 条记录数每秒,如增量事件高于该速率,可能导致数据处理的延迟上升,如需提升速率,推荐采用 TapData 的裸日志方案。
- 采用 LogMiner 采集方案时:
- 受 LogMiner 功能限制,待同步的表和列名长度不能超过 30 字符,否则可能导致无法获取其增量数据变更。
- 为避免增量同步阶段无法获取虚拟列的问题,可通过添加 JS 节点或手动创建目标表结构的方式解决。
- 执行手动挖掘时,当表 DDL 变更时,同时针对该表执行了大量的 DML 事件,有极小概率无法因字典无法解析原 Schema 信息,导致采集信息异常的问题。
- 对 RAC 节点执行手动挖掘时,可能存在少量重 复采集的情况(不乱序),需要下游实现幂等,即会影响无主键表数据。
- Oracle 作为目标库时:
- 异构数据库间同步时,由于 Oracle 没有空字符串,会自动转换为null,因此源库的非空约束通常不适合同步到 Oracle,可在任务配置时选择忽略 not null,从而将源表的字符串类型的非空约束进行过滤。
- Db2 的非空字段可以用
""赋值,但相关字段向 Oracle 写入的时候,Oracle 会认为该字段是 NULL,从而导致非空字段写入失败。
注意事项
- 如设置了 connect_time(自动断开超时会话),可能导致实时同步异常,可通过下述命令检查该参数的设置。
SELECT resource_name, limit FROM dba_profiles WHERE profile=( SELECT profile FROM dba_users WHERE username = 'username'); - 您需要为归档日志预留足够的存储空间,可通过
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE命令设置,避免存储占满影响数据库运行。 - 当采用裸日志方案采集增量数据时,如果强行终止引擎,重启裸日志采集组件时,会重新扫描目录中积攒的 fzs 文件,可能会导致进入增量缓慢,如果发生异常,您可以将相关解析日志保存提供给技术支持。
- 当采用 LogMiner 方案采集增量数据时,您需要注意:
-
采集性能依赖源库机器性能,在自动挖掘或者 RAC 双节点的情况下,通常推荐 PGA 内存大于 16 GB, redo 大于 512MB 且小于 2 GB,如果是单节点可以适当地降低配置,同时应避免连续归档。
-
对于未提交事务,相关数据会存放至内存,如果事物较大(包含大量 DML 事件),为避免内存溢出,TapData 会将其落盘。如果停止任务或重启引擎,TapData 会记录最早未提交事务的 scn 号,重启任务时会从该 scn 开始重新扫描,在下游支持幂等约束的情况下,可保障数据不丢失。为避免增量信息回退过长而影响同步信息,您可以在任务配置时设置未提交事务生命时长,由 TapData 清理超过该时长的未提交事务。
-
为提升采集性能,可在配置任务时,关闭大字段(LOB)的同步,或者业务上明确不会更新主键字段/关联键字段。
-
当 Oracle 低于 19C 版本时,TapData 将采用自动采集机制,可自动查找 redo 日志,无需关注 Oracle 部署架构,可连续不间断地采集日志。为提升采集性能,推荐基于数据变更规模设定任务配置中的 fetchSize(日志积压数量)。
-
当 Oracle 为 19C 版本时,受限于 Oracle 内部机制调整,TapData 将采用手动采集机制,即线上日志连续扫描+归档日志补充循环的方式。此场景下,如果是单节点部署,由于最多只会同时扫描一份 redo 日志,性能较好;如果是 RAC 部署,由于 scn 号每个线程交替增长,因此最多会扫描
{节点数 X 2}份 redo日志,最少为{节点数 X 1}份 redo 日志,当 redo 日志较大时,将会降低增量数据读取性能。
-