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官方文档,里面有比较详细的步骤。

  1. 首先需要开启oracle数据库归档日志;
  2. 使用Logminer程序DBMS_LOGMNR.ADD_LOGFILE 增加需要采集的日志,这一步很重要,也是今天问题的核心。
  3. 调用开始采集 DBMS_LOGMNR.START_LOGMNR 程序;
  4. 查询V$LOGMNR_CONTENTS 视图,从而获取归档文件中的数据;
  5. 调用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实时数据抽取项目问题总结的更多相关文章

  1. Tapdata 肖贝贝:实时数据引擎系列(四)-关于 Oracle 与 Oracle CDC

      摘要:想实现 Oracle 的 CDC,排除掉一些通用的比如全量比对, 标记字段获取之外, 真正的增量形式获取变更, 有三种办法: Logminer .XStream .裸日志解析,但不管哪种方法 ...

  2. Kettle数据抽取解决方案

    一. Kettle介绍 1. Kettle简介 ETL即数据抽取(Extract).转换(Transform).装载(Load)的过程.Kettle的中文翻译为水壶.Kettle以元数据驱动的方式提供 ...

  3. 《BI项目笔记》增量ETL数据抽取的策略及方法

    增量抽取 增量抽取只抽取自上次抽取以来数据库中要抽取的表中新增或修改的数据.在ETL使用过程中.增量抽取较全量抽取应用更广.如何捕获变化的数据是增量抽取的关键.对捕获方法一般有两点要求:准确性,能够将 ...

  4. BI项目中的ETL设计详解(数据抽取、清洗与转换 )(转载)

    原文:http://www.cnblogs.com/reportmis/p/5939732.html ETL是BI项目最重要的一个环节,通常情况下ETL会花掉整个项目的1/3的时间,ETL设计的好坏直 ...

  5. 项目总结[2]_svg+ajax+webservice+pSpace sdk实现实时数据的web展示

    1.使用svg实现组态画面和动态数据展示 通过js的定时器调用webservice方法获取数据后更新节点数据 /// <summary>启动定时刷新</summary> fun ...

  6. DataPipeline丨构建实时数据集成平台时,在技术选型上的考量点

    文 | 陈肃 DataPipeline  CTO 随着企业应用复杂性的上升和微服务架构的流行,数据正变得越来越以应用为中心. 服务之间仅在必要时以接口或者消息队列方式进行数据交互,从而避免了构建单一数 ...

  7. 陈胡:Apache SeaTunnel实现 非CDC数据抽取实践

    导读: 随着全球数据量的不断增长,越来越多的业务需要支撑高并发.高可用.可扩展.以及海量的数据存储,在这种情况下,适应各种场景的数据存储技术也不断的产生和发展.与此同时,各种数据库之间的同步与转化的需 ...

  8. Tapdata Real Time DaaS 技术详解 PART I :实时数据同步

      摘要:企业信息化过程形成了大量的数据孤岛,这些并不连通的数据孤岛是企业数字化转型的巨大挑战.Tapdata Real Time DaaS 采用的CDC模式,具有巨大的优势,同时是一个有技术壁垒的活 ...

  9. 数据抽取 CDC

    什么是数据抽取 数据抽取是指从源数据源系统抽取目的数据源系统需要的数据.实际应用中,数据源较多采用的是关系数据库. [编辑] 数据抽取的方式 (一) 全量抽取 全量抽取类似于数据迁移或数据复制,它将数 ...

随机推荐

  1. WPF 勾选划线

    最近项目需要一个左右侧一对多的划线功能 我们先来看一下效果秃: 主要功能: 支持动态添加 支持复选 支持修改颜色 支持动态宽度 主要实现:事件的传递 应用场景:购物互选,食品搭配,角色互选 数据源 左 ...

  2. css - 行高

    css - 行高 line-height行高 取值:px | em | rem | 百分比 | 纯数字 | normal | inherit 设置给:块.行内.行内块 应用给:文本 继承:块.行内.被 ...

  3. 传统JIT和java9新特性AOT理解

    java慢的原因 1.  除了少量基本类型用栈存储外,所有对象都使用堆存储.堆的性能低于栈. 2.  很多强制类型转换(cast)或加查,耗用内存大.java运行时对类型检测,如果类型不正确会抛出Cl ...

  4. 五分钟搞定Docker安装ElasticSearch

    前言 项目准备上ElasticSearch,为了后期开发不卡壳只能笨鸟先飞,在整个安装过程中遇到以下三个问题. Docker安装非常慢 ElasticSearch-Head连接出现跨域 Elastic ...

  5. Kotlin之内联回调函数

    let 定义: let扩展函数的实际上是一个作用域函数,当你需要去定义一个变量在一个特定的作用域范围内,let函数的是一个不错的选择:let函数另一个作用就是可以避免写一些判断null的操作. 翻译: ...

  6. RabbitMQ从零到集群高可用(.NetCore5.0) -高可用集群构建落地

    系列文章: RabbitMQ从零到集群高可用(.NetCore5.0) - RabbitMQ简介和六种工作模式详解 RabbitMQ从零到集群高可用(.NetCore5.0) - 死信队列,延时队列 ...

  7. zabbix 历史数据处理

    问题描述 zabbix server 平稳运行有一段时间了,但是最近问题却来了,今天早上收到zabbixserver磁盘空间不足的告警.通过查看之后发现是大部分数据是zabbix 库的的数据 在进一步 ...

  8. 再见了,我的散装研发管理平台;再见了,4台ECS!

    周末的时候,收到好几个云服务器临近过期的通知短信,准备续个费,居然都要大几千!因为这几个都是以前低价抢购的,掐指一算,如果都续费的话,要蚕食好多利润!作为一名自己养活自己的独立开发者,节省成本是必备技 ...

  9. SDOI2021集训 R1 半夜 题解

    先贴两个博客:ajthreac yspm,建议结合起来看 \(O(n^3)\):对 \(XX\) 每个长度为 \(n\) 的字串与 \(Y\) 跑 LCS.设 \(f[i,j,k]\) 表示 \(X[ ...

  10. vim的配置文件

    网上一个比较常见的配置文件设置如下,这个配置还是很棒的,尤其创建脚本或者c文件时 " All system-wide defaults are set in $VIMRUNTIME/debi ...