场景:现场库到前置库。

思考:使用触发器?

1、侵入性解决方案

2、需要时各种配置,不需要时又是各种配置

Change Data Capture:捕捉变化的数据,通过日志监测并捕获数据库的变动(包括数据或数据表的插入,更新,删除等),将这些变更按发生的顺序完整记录下来,写入到消息中间件中或者通过其他途径分发出去。

与触发器相比,通过日志监控的好处:

  • 1、对原库基本无侵入性,不需要像触发器一样,对原库进行操作。

  • 2、可以针对整库或者库中的表进行监控,比触发器更加灵活高效,避免监控表比较多的情况的频繁的建触发器

说明

关于logminer:

所有对用户数据和数据字典的改变都记录在Oracle的Redo Log中,因此,Redo Log包含了所有进行恢复操作所需要的信息。但是,原始的Redo Log文件无法看懂,所以,Oracle从8i以后提供了一个非常有用的分析工具,称为LogMiner。使用该工具可以轻松获得Redo Log文件(包含归档日志文件)中的具体内容。

关于代码:全部写到一个java方法下,主要演示所有过程,关键问题处理,封装留给你们自己进行。

关于参考:主要参考了debezium和一些国外开源的实现,但是这些都没有支持clob大字段和blob二进制字段,同时也没考虑一些特殊情况,我在平时的测试积累中解决了此块的内容,故一起开源分享出来。

Github地址

https://github.com/nengm/OracleCDCByLogminer

前置步骤

Oracle:通过开源logminer进行日志分析,支持大字符串,二进制。

目前只针对在线日志分析,离线的由于需要考虑log大小等,留给以后处理。

开启归档日志,这边步骤主要是为了能够使用logminer

以数据库系统管理员sys as sysdba登录
SQL> shutdown immediate; 关闭数据库
SQL> startup mount; 启动数据库到mount状态
SQL> alter database archivelog; 启动归档模式
SQL> alter database open;启动数据库
SQL> alter system switch logfile;切换日志文件
查看数据字典表或视图权限
GRANT SELECT_CATALOG_ROLE TO [用户名];
执行系统所有包权限
GRANT EXECUTE_CATALOG_ROLE TO [用户名];
创建会话权限
GRANT CREATE SESSION TO [用户名];
选择任何事务的权限
GRANT SELECT ANY TRANSACTION TO [用户名];

对于12c及以上,还需要对pdb用户进行一些设置,具体遇到再百度下。

分析过程

1、拿到当前最大位点

2、开启logminer分析

如果ENDSCN和STARTSCN没有超过步长,ENDSCN就拿当前的最大位点。

begin
DBMS_LOGMNR.START_LOGMNR(
STARTSCN => 586613478,
ENDSCN => 586613490,
OPTIONS =>
DBMS_LOGMNR.SKIP_CORRUPTION
+DBMS_LOGMNR.NO_SQL_DELIMITER
+DBMS_LOGMNR.NO_ROWID_IN_STMT
+DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG
+DBMS_LOGMNR.CONTINUOUS_MINE
+DBMS_LOGMNR.COMMITTED_DATA_ONLY
+DBMS_LOGMNR.STRING_LITERALS_IN_STMT
);
end;

3、通过数据字典得到表的数据类型

代码中的dictionary.sql

4、根据配置的白名单进行信息删选

SELECT
*
FROM
  V$LOGMNR_CONTENTS
WHERE(SEG_OWNER = 'EPOINT' AND TABLE_NAME = 'BASEINFO' AND COMMIT_SCN >=0)

5、分析

1、insert语句(带大字段和图片)

大字段和图片都通过存储过程得到。

我们根据csf看是否超过4000个字节,如果超过csf为0,我们把所有的sql先组装到一起,然后通过信息组装出一个guid,存入map,这样后面就能找到对应的EMPTY_CLOB()对应的值了。

//用xid、ownerName、tableName、columnString唯一标识当前二进制字段的guid
//#!>-<!#为分隔符
//例如:99001800E16A0000#!>-<!#EPOINT#!>-<!#BASEINFO1#!>-<!#IMAGE

2、update语句(带大字段和图片)

update "EPOINT"."BASEINFO" set "NAME" = '苏爱毓', "BIRTHDAY" = TIMESTAMP ' 1977-03-17 17:22:59', "AGE" = 3, "ADDRESS" = UNISTR('\6FB3\95E8\516B\885718\53F7-8-6') where "ROWGUID" = 'b73af60a-cdda-4702-8f28-0d707c0245a1' and "NAME" = '法贞凤' and "BIRTHDAY" = TIMESTAMP ' 1978-04-16 09:21:46' and "AGE" = 61 and "ADDRESS" = UNISTR('\8BF8\57CE\5927\53A674\53F7-6-8')

下面紧接着是他要处理的大字段和二进制。

程序中通过下面的guid判断是否是一批数据,然后把检测到的大字段或者二进制与之关联。

//用xid、ownerName、tableName、columnString唯一标识当前二进制字段的guid
//#!>-<!#为分隔符
//例如:99001800E16A0000#!>-<!#EPOINT#!>-<!#BASEINFO1#!>-<!#IMAGE

注意:

我们再测试下,让startscn加1

可以看到无法分析出数据了,所以我们程序需要处理掉这种情况,遇到这种情况最简单的办法就是startscn要往回退一点,也注意不能形成死循环

其实主要是通过这些进行流程的分析处理,里面会遇到很多的坑。

测试实现

配置:由于测试整个过程,暂时单表,多表只要改造下。

1、配置

2、启动

3、插入一条数据

主要在11g在测试,12c做了兼容,而且要使用cdb账户

11g

插入mysql中

5、更新

oracle

更新完mysql

6、插入2000条测试

oracle

mysql目标数据库

oracle实现通过logminer实现日志抓取分析的更多相关文章

  1. Android全局异常处理 实现自己定义做强制退出和carsh日志抓取

    在做android项目开发时,大家都知道都会遇到程序报错或者Anr异常,会弹出来一个强制退出的弹出框,对于开发人员是好事,但是对于用户体验和 UI实在毫无违和感,别说用户接受不了,就连我们自己本身可能 ...

  2. adb命令 logcat日志抓取

    一.logcat抓log方法:adb logcat命令,可以加条件过滤 1.安装SDK(参考android sdk环境安装) 2.使用数据线链接手机,在手机助手的sdcard中建立一个1.log的文件 ...

  3. adb logcat日志抓取

    adb命令 logcat日志抓取 一.logcat抓log方法:adb logcat命令,可以加条件过滤 1.安装SDK(参考android sdk环境安装) 2.使用数据线链接手机,在手机助手的sd ...

  4. 数据抓取分析(python + mongodb)

    分享点干货!!! Python数据抓取分析 编程模块:requests,lxml,pymongo,time,BeautifulSoup 首先获取所有产品的分类网址: def step(): try: ...

  5. python数据抓取分析(python + mongodb)

    分享点干货!!! Python数据抓取分析 编程模块:requests,lxml,pymongo,time,BeautifulSoup 首先获取所有产品的分类网址: def step(): try: ...

  6. 抓取分析网页批量下载评书(3)之批量下载mp3

         本系列目录:    <1.搜索有声小说>    <2.分析详细页地址>     <3.批量下载mp3>      本篇是大结局,看过前两篇的放心吧,不会有 ...

  7. 使用Wireshark mac下抓取分析iphone数据包 --IOS端

    mac系统版本:mac 10.10 Yosemite xcode版本:6.3.1 在追踪bug或者分析借鉴其他公司的app通讯思路时,抓包这件事是非常有必要的.下面说说Wireshark怎么截获iph ...

  8. wireshark如何抓取分析https的加密报文

    [问题概述] https流量基于ssl/tls加密,无法直接对报文进行分析. [解决方案] 方案1 -- 利用"中间人攻击"的代理方式抓包分析.整个方案过程比较简单,这里不赘述,大 ...

  9. db2 MON_GET_PKG_CACHE_STMT 表函数 抓取分析SQL

    MON_GET_PKG_CACHE_STMT 表函数 还可以使用 MON_GET_PKG_CACHE_STMT 表函数来查询当前 PACKAGE CACHE 中 SQL 语句(包括动态 SQL 和静态 ...

随机推荐

  1. 【pytest官方文档】解读fixtures - 3. fixtures调用别的fixtures、以及fixture的复用性

    pytest最大的优点之一就是它非常灵活. 它可以将复杂的测试需求简化为更简单和有组织的函数,然后这些函数可以根据自身的需求去依赖别的函数. fixtures可以调用别的fixtures正是灵活性的体 ...

  2. Jenkins 自动触发执行的配置

    1. 两种触发方式 2. jenkins 和 github 同步配置 ngrok 安装 webhook 配置 1. 两种触发条件 Jenkins 中建立的任务是可以设置自动触发,更进一步的实现自动化. ...

  3. HUAWEI防火墙双出口据链路带宽负载分担

    组网图形 组网需求 通过配置根据链路带宽负载分担,使流量按照带宽的比例分担到各链路上,保证带宽资源得到充分利用. 如图1所示,企业分别从ISP1和ISP2租用了一条链路,ISP1链路的带宽为100M, ...

  4. 趁五一撸个纯Flutter版的心情日记App

    前言 最近真的是太忙了,只能趁着五一期间把之前Android版的心情日记App移植到Flutter平台,并且已经上架华为应用市场以及苹果App Store. 整体框架沿用了两个星期,用Flutter撸 ...

  5. hdu4720 三角形的外接圆

    题意:       给你四个点,问你第四个点是否在前三个点围成的三角形的外接圆上. 思路:       水题,就是练练用魔板罢了,当该三角形是锐角三角形的时候,圆心是任意两条边中垂线的交点,半径是圆心 ...

  6. Windows系统应急响应

    Windows 系统的应急事件,按照处理的方式,可分为下面几种类别: 病毒.木马.蠕虫事件 Web 服务器入侵事件 或 安装的第三方服务入侵事件. 系统入侵事件,如利用 Windows 的漏洞攻击入侵 ...

  7. Windows核心编程 第九章 线程与内核对象的同步(下)

    9.4 等待定时器内核对象 等待定时器是在某个时间或按规定的间隔时间发出自己的信号通知的内核对象.它们通常用来在某个时间执行某个操作. 若要创建等待定时器,只需要调用C r e a t e Wa i ...

  8. 学习Canvas绘图与动画基础 绘制多条路径(四)

    1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="U ...

  9. 使用 Azure Container Registry 储存镜像

    Azure Container Registry(容器注册表)是基于 Docker Registry 2.0规范的托管专用 Docker 注册表服务. 可以创建和维护 Azure 容器注册表来存储与管 ...

  10. ConcurrentHashMap源码解读二

    接下来就讲解put里面的三个方法,分别是 1.数组初始化方法initTable() 2.线程协助扩容方法helpTransfer() 3.计数方法addCount() 首先是数组初始化,再将源码之前, ...