oracle实现通过logminer实现日志抓取分析
场景:现场库到前置库。
思考:使用触发器?
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实现日志抓取分析的更多相关文章
- Android全局异常处理 实现自己定义做强制退出和carsh日志抓取
在做android项目开发时,大家都知道都会遇到程序报错或者Anr异常,会弹出来一个强制退出的弹出框,对于开发人员是好事,但是对于用户体验和 UI实在毫无违和感,别说用户接受不了,就连我们自己本身可能 ...
- adb命令 logcat日志抓取
一.logcat抓log方法:adb logcat命令,可以加条件过滤 1.安装SDK(参考android sdk环境安装) 2.使用数据线链接手机,在手机助手的sdcard中建立一个1.log的文件 ...
- adb logcat日志抓取
adb命令 logcat日志抓取 一.logcat抓log方法:adb logcat命令,可以加条件过滤 1.安装SDK(参考android sdk环境安装) 2.使用数据线链接手机,在手机助手的sd ...
- 数据抓取分析(python + mongodb)
分享点干货!!! Python数据抓取分析 编程模块:requests,lxml,pymongo,time,BeautifulSoup 首先获取所有产品的分类网址: def step(): try: ...
- python数据抓取分析(python + mongodb)
分享点干货!!! Python数据抓取分析 编程模块:requests,lxml,pymongo,time,BeautifulSoup 首先获取所有产品的分类网址: def step(): try: ...
- 抓取分析网页批量下载评书(3)之批量下载mp3
本系列目录: <1.搜索有声小说> <2.分析详细页地址> <3.批量下载mp3> 本篇是大结局,看过前两篇的放心吧,不会有 ...
- 使用Wireshark mac下抓取分析iphone数据包 --IOS端
mac系统版本:mac 10.10 Yosemite xcode版本:6.3.1 在追踪bug或者分析借鉴其他公司的app通讯思路时,抓包这件事是非常有必要的.下面说说Wireshark怎么截获iph ...
- wireshark如何抓取分析https的加密报文
[问题概述] https流量基于ssl/tls加密,无法直接对报文进行分析. [解决方案] 方案1 -- 利用"中间人攻击"的代理方式抓包分析.整个方案过程比较简单,这里不赘述,大 ...
- db2 MON_GET_PKG_CACHE_STMT 表函数 抓取分析SQL
MON_GET_PKG_CACHE_STMT 表函数 还可以使用 MON_GET_PKG_CACHE_STMT 表函数来查询当前 PACKAGE CACHE 中 SQL 语句(包括动态 SQL 和静态 ...
随机推荐
- webpack的构建流程
一.运行流程 webpack 的运行流程是一个串行的过程,它的工作流程就是将各个插件串联起来 在运行过程中会广播事件,插件只需要监听它所关心的事件,就能加入到这条webpack机制中,去改变webpa ...
- 反调试——Windows异常-SEH
反调试--Windows异常-SEH 概念: SEH:Structured Exception Handling SEH是Windows默认的异常处理机制 如何使用 在代码中使用 __try__e ...
- 【SpringBoot】Springboot2.x整合Redis(一)
备注: springboto整合redis依赖于spring-boot-starter-data-redis这个jar 一,项目环境和依赖 1.POM.xml配置 <parent> < ...
- Pytorch系列:(四)IO操作
首先注意pytorch中模型保存有两种格式,pth和pkl,其中,pth是pytorch默认格式,pkl还支持pickle库,不过一般如果没有特殊需求的时候,推荐使用默认pth格式保存 pytorch ...
- IDAPython类库---idaapi.py的源码
#ThisfilewasautomaticallygeneratedbySWIG(http://www.swig.org).#Version2.0.12##Donotmakechangestothis ...
- IPS入侵防御系统
目录 IPS入侵防御系统 如何才能更好的防御入侵 IPS与IDS的区别 IDS与IPS的部署 IPS独立部署 IPS分布式部署 IPS入侵防御系统 IPS(Intrusion Prevention S ...
- PhpMyWind储存型XSS漏洞练习(CVE-2017-12984)
0x01 介绍 又是一款开源CMS内容管理系统PhpMyWind,在小于等于5.4版本中存在储存型XSS漏洞.如下图所示,这个就是发生储存型XSS漏洞的代码 0x02 演示 1.第一张图是客户留言时, ...
- Kafka Rebalance机制和选举策略总结
自建博客地址:https://www.bytelife.net,欢迎访问! 本文为博客同步发表文章,为了更好的阅读体验,建议您移步至我的博客 本文作者: Jeffrey 本文链接: https://w ...
- 【DB宝51】CentOS7修改网卡名称
目录 1.修改/etc/default/grub文件 2.修改/etc/udev/rules.d/70-persistent-net.rules文件 3.修改网卡配置文件 4.重启服务器 需求:原来的 ...
- 学javaweb 先学Servlet 应用理论很重要
package cn.Reapsun.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.ser ...