Oracle实时数据抽取项目问题总结
Oracle实时数据抽取项目问题总结
项目背景介绍
项目主要是将Oracle、MySQL、SQLServer、Db2等其他数据库的实时变更数据同步到其他异构数据库中。本篇文章主要是讨论oracle的实时采集,通过Logminer捕获归档日志,然后将提取后的数据推送到Kafka中。
项目使用的技术框架
使用的核心框架:https://github.com/debezium/debezium 用于捕获归档日志,然后推送到kafka中。
Debezium框架是基于Kafka Connect实现的,分为source端和sink端。
source: 负责将源库的数据放入kafka中;
sink: 负责将kafka的数据落入目标库中;
source和sink的调度管理统一交给kafka connect来负责。
如何获取归档日志
Debezium实现的Oracle source端,将数据同步到kafka中,有Logminer和XStream两种实现方式,其中Logminer是oracle数据库自带的,不需要额外收费;而XStream需要额外收费的。因此,今天主要介绍的是Logminer的方式获取归档日志。
Logminer获取归档日志的步骤
这里只介绍一个大概的步骤,具体详细步骤请参考Oracle官方文档,里面有比较详细的步骤。
- 首先需要开启oracle数据库归档日志;
- 使用Logminer程序
DBMS_LOGMNR.ADD_LOGFILE增加需要采集的日志,这一步很重要,也是今天问题的核心。 - 调用开始采集
DBMS_LOGMNR.START_LOGMNR程序; - 查询
V$LOGMNR_CONTENTS视图,从而获取归档文件中的数据; - 调用
DBMS_LOGMNR.END_LOGMNR程序结束.
Oracle归档日志和重做日志
因为实时数据采集主要是作用在归档日志和重做日志上,如果对这两种日志不理解,将导致Logminer出现的错误无法有一个清晰的认知,从而无法解决现场实际面临的各种问题。
重做日志
也被称为redo log,主要是用来进行数据库恢复的,你对数据库表的任何数据操作,都会首先将变更写入重做日志中,用来在数据库宕机时能及时恢复数据,里面记录了数据的详细变更记录。默认数据库会有3个重做日志文件,可以通过查询V$LOGFILE获取。这3个重做日志文件是轮流使用的,当第一个用满后将切换到第二个、当第二个用满之后切换到第三个,当第三个用满之后切换到第一个,切换之后目标重做日志就被覆盖了,也就是丢失了。例如当第一个用满后将切换到第二个,那么原来第二个重做日志上的数据就丢失了。当然,这个重做日志的文件大小和个数都是可以配置的。
特点:及时写入,自动循环覆盖
归档日志
归档日志主要是重做日志的一个备份,也可以用来进行数据的恢复,也可以用来进行数据库的同步。由于重做日志会循环使用,并且还会出现覆盖丢失的情况,因此,需要将重做日志放到别的地方进行备份存储,这也就诞生了归档日志。归档日志默认是不开启的,需要配置数据库才能使用,并且需要占用许多存储,因此需要及时的清理。重做日志会定时的存储成归档日志,并且在切换的时候也会存储到归档日志中,防止重做日志丢失。
特大:自动触发写入、可永久存储
问题:ora-01291: missing logfile
有了Logminer和归档日志和重做日志的简单介绍之后就可以进入今天的正题了,我们在实时抽取oracle归档日志的时候发现,当数据量很大的时候经常会出现oracle错误:ora-01291: missing logfile,提示找不到重做日志文件了。
首先我们需要分析Logminer的第二步:DBMS_LOGMNR.ADD_LOGFILE,这一步不仅需要将归档日志添加到Logminer引擎中,还需要将重做日志也需要添加进来,因为归档日志的数据并不是及时的,需要配合归档日志 + 重做日志才能保证及时性,但是重做日志又有被覆盖的可能,因此就会出现ora-01291错误。了解了问题原因,那么我们如何解决问题呢?既然只有在数据量很大的时候才会出现,那么我们可以将重做日志的个数增加到10个,每个文件大小增加到5G。这个调整需要谨慎操作,官方的说法是最好将重做日志的切换时间控制在半小时左右。这样就不会出现ora-01291的错误了,因为重做日志的切换频率降低了、文件个数也增加了。例如Logminer目前正在读取重做日志5 + 归档日志,只有当oracle此时立马把 重做日志5,6,7,8,9,0,1,2,3,4,5(以10个重做日志为例)全部写满才会导致重做日志5丢失,而此时每个操作日志的大小为5G,总共需要写入50G的数据,你不可能那么快写入50GB,当你写入的时候Logminer已经读取完了,因此就不会再出现找不到重做日志的问题了。
问题:日志定位耗时
当数据库产生了大量归档日志的时候,Logminer需要定位到某一个表的起始SCN点很耗时。这个问题可以调整配置来实现,Debezium有大量的配置用来控制SCN点的增量范围和每次获取时间设置等,需要根据自身的场景进行合理调整。
| 配置名 | 默认值 | 描述 |
|---|---|---|
log.mining.batch.size.min |
1000 |
The minimum SCN interval size that this connector attempts to read from redo/archive logs. Active batch size is also increased/decreased by this amount for tuning connector throughput when needed. |
log.mining.batch.size.max |
100000 |
The maximum SCN interval size that this connector uses when reading from redo/archive logs. |
log.mining.batch.size.default |
20000 |
The starting SCN interval size that the connector uses for reading data from redo/archive logs. |
log.mining.sleep.time.min.ms |
0 |
The minimum amount of time that the connector sleeps after reading data from redo/archive logs and before starting reading data again. Value is in milliseconds. |
log.mining.sleep.time.max.ms |
3000 |
The maximum amount of time that the connector ill sleeps after reading data from redo/archive logs and before starting reading data again. Value is in milliseconds. |
log.mining.sleep.time.default.ms |
1000 |
The starting amount of time that the connector sleeps after reading data from redo/archive logs and before starting reading data again. Value is in milliseconds. |
log.mining.sleep.time.increment.ms |
200 |
The maximum amount of time up or down that the connector uses to tune the optimal sleep time when reading data from logminer. Value is in milliseconds. |
log.mining.view.fetch.size |
10000 |
The number of content records that the connector fetches from the LogMiner content view. |
log.mining.archive.log.hours |
0 |
The number of hours in the past from SYSDATE to mine archive logs. When the default setting (0) is used, the connector mines all archive logs. |
Oracle实时数据抽取项目问题总结的更多相关文章
- Tapdata 肖贝贝:实时数据引擎系列(四)-关于 Oracle 与 Oracle CDC
摘要:想实现 Oracle 的 CDC,排除掉一些通用的比如全量比对, 标记字段获取之外, 真正的增量形式获取变更, 有三种办法: Logminer .XStream .裸日志解析,但不管哪种方法 ...
- Kettle数据抽取解决方案
一. Kettle介绍 1. Kettle简介 ETL即数据抽取(Extract).转换(Transform).装载(Load)的过程.Kettle的中文翻译为水壶.Kettle以元数据驱动的方式提供 ...
- 《BI项目笔记》增量ETL数据抽取的策略及方法
增量抽取 增量抽取只抽取自上次抽取以来数据库中要抽取的表中新增或修改的数据.在ETL使用过程中.增量抽取较全量抽取应用更广.如何捕获变化的数据是增量抽取的关键.对捕获方法一般有两点要求:准确性,能够将 ...
- BI项目中的ETL设计详解(数据抽取、清洗与转换 )(转载)
原文:http://www.cnblogs.com/reportmis/p/5939732.html ETL是BI项目最重要的一个环节,通常情况下ETL会花掉整个项目的1/3的时间,ETL设计的好坏直 ...
- 项目总结[2]_svg+ajax+webservice+pSpace sdk实现实时数据的web展示
1.使用svg实现组态画面和动态数据展示 通过js的定时器调用webservice方法获取数据后更新节点数据 /// <summary>启动定时刷新</summary> fun ...
- DataPipeline丨构建实时数据集成平台时,在技术选型上的考量点
文 | 陈肃 DataPipeline CTO 随着企业应用复杂性的上升和微服务架构的流行,数据正变得越来越以应用为中心. 服务之间仅在必要时以接口或者消息队列方式进行数据交互,从而避免了构建单一数 ...
- 陈胡:Apache SeaTunnel实现 非CDC数据抽取实践
导读: 随着全球数据量的不断增长,越来越多的业务需要支撑高并发.高可用.可扩展.以及海量的数据存储,在这种情况下,适应各种场景的数据存储技术也不断的产生和发展.与此同时,各种数据库之间的同步与转化的需 ...
- Tapdata Real Time DaaS 技术详解 PART I :实时数据同步
摘要:企业信息化过程形成了大量的数据孤岛,这些并不连通的数据孤岛是企业数字化转型的巨大挑战.Tapdata Real Time DaaS 采用的CDC模式,具有巨大的优势,同时是一个有技术壁垒的活 ...
- 数据抽取 CDC
什么是数据抽取 数据抽取是指从源数据源系统抽取目的数据源系统需要的数据.实际应用中,数据源较多采用的是关系数据库. [编辑] 数据抽取的方式 (一) 全量抽取 全量抽取类似于数据迁移或数据复制,它将数 ...
随机推荐
- WPF原理剖析——路由事件
一.路由事件与传统事件传统事件的触发者和处理者是紧密相连的,而路由事件则不是,路由事件允许一个元素的事件有另外的元素触发.也即就是说路由事件的拥有者和响应者之间没有显示的订阅关系.事件的拥有者只负责激 ...
- NameNode&Secondary NameNode 工作机制
NameNode&Secondary NameNode 工作机制 NameNode: 1.启动时,加载编辑日志和镜像文件到内存 2.当客户端对元数据进行增删改,请求NameNode 3.Nam ...
- 进程上下文&中断上下文
文章出自http://hi.baidu.com/bkhcvzdvmjfkpyr/item/5444001fa68d065bf1090ea6 处理器总处于以下状态中的一种: 1.内核态,运行于进程上下文 ...
- 二级C语言题集
时间:2015-5-13 18:01 在131题之后是按考点分类的题集,有需要的朋友可以看一下 ---------------------------------------------------- ...
- 刷题-力扣-122. 买卖股票的最佳时机 II
122. 买卖股票的最佳时机 II 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell ...
- Linkerd 2.10(Step by Step)—配置重试
Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...
- centos7环境变量配置错误以至于命令不可使用
2021-07-16 问题: centos7在配置环境变量的时候少打了$,导致很多命令不能使用 解决方法: 在命令行输入: export PATH=/usr/local/sbin:/usr/local ...
- adb 常用命令大全(6)- 模拟按键输入
语法格式 input [<source>] <command> [<arg>...] 物理键 # 电源键 adb shell input keyevent 26 # ...
- JS003. 事件监听和监听滚动条的三种参数( addEventListener( ) )
全局 1 window.addEventListener('scroll', () => { 2 console.log('------') 3 console.log(document.doc ...
- 分组概念&贪婪与懒惰
分组概念&贪婪与懒惰 1.分组 2.贪婪和懒惰 3.懒惰 4.处理选项 5.实例:百度搜索结果页面源码中获取当前页的10个标题 5.1页面源码分析规律 5.2正则表达式,匹配出10个标题 这是 ...