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 和静态 ...
 
随机推荐
- Django中的CBV视图
			
Web 开发是一项无聊而且单调的工作,特别是在视图功能编写方面更为显著.为了减少这种痛苦,Django植入了视图类这一功能,该功能封装了视图开发常用的代码,无须编写大量代码即可快速完成数据视图的开发, ...
 - 一键打造vim ide 支持python golang shell等高级特性
			
1.vim-for-devops github: https://github.com/yxxhero/vim_for_devops 利用vim插件打造支持python.shell.golang的id ...
 - Thinkphp5之Bootstrap自定义BootstrapDetailed分页插件的实现
			
首先,在此目录建立一个newcrm\thinkphp\library\think\paginator\driver\BootstrapDetailed.php文件,代码如下: <?php // ...
 - Nacos使用 MySQL 8.0 提示Public Key Retrieval is not allowed
			
原因如下(参考官网给出的连接选项): 如果用户使用了 sha256_password 认证,密码在传输过程中必须使用 TLS 协议保护,但是如果 RSA 公钥不可用,可以使用服务器提供的公钥:可以在连 ...
 - 在网页添加 Live2D 看板娘
			
只需要将以下代码粘贴到 标签中即可 <!--看板娘--> <script src="https://cdn.jsdelivr.net/npm/jquery/dist/jqu ...
 - Mac 解压缩软件-keka
			
去官网 GitHub地址 功能预览
 - php  获取某数组中出现次数最多的值(重复最多的值)与出现的次数
			
1.$arr = array(7,7,8,9,10,10,10); $arr = array_count_values($arr); // 统计数组中所有值出现的次数 arsort($arr); ...
 - 谁动了我的 Linux?原来 history 可以这么强大!
			
当我们频繁使用 Linux 命令行时,有效地使用历史记录,可以大大提高工作效率. 在平时 Linux 操作过程中,很多命令是重复的,你一定不希望大量输入重复的命令.如果你是系统管理员,你可能需要对用户 ...
 - 通过Python将监控数据由influxdb写入到MySQL
			
一.项目背景 我们知道InfluxDB是最受欢迎的时序数据库(TSDB).InfluxDB具有 持续高并发写入.无更新:数据压缩存储:低查询延时 的特点.从下面这个权威的统计图中,就可以看出Influ ...
 - Truncate用法详解
			
前言: 当我们想要清空某张表时,往往会使用truncate语句.大多时候我们只关心能否满足需求,而不去想这类语句的使用场景及注意事项.本篇文章主要介绍truncate语句的使用方法及注意事项. 1.t ...