场景:现场库到前置库。

思考:使用触发器?

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. Django中的CBV视图

    Web 开发是一项无聊而且单调的工作,特别是在视图功能编写方面更为显著.为了减少这种痛苦,Django植入了视图类这一功能,该功能封装了视图开发常用的代码,无须编写大量代码即可快速完成数据视图的开发, ...

  2. 一键打造vim ide 支持python golang shell等高级特性

    1.vim-for-devops github: https://github.com/yxxhero/vim_for_devops 利用vim插件打造支持python.shell.golang的id ...

  3. Thinkphp5之Bootstrap自定义BootstrapDetailed分页插件的实现

    首先,在此目录建立一个newcrm\thinkphp\library\think\paginator\driver\BootstrapDetailed.php文件,代码如下: <?php // ...

  4. Nacos使用 MySQL 8.0 提示Public Key Retrieval is not allowed

    原因如下(参考官网给出的连接选项): 如果用户使用了 sha256_password 认证,密码在传输过程中必须使用 TLS 协议保护,但是如果 RSA 公钥不可用,可以使用服务器提供的公钥:可以在连 ...

  5. 在网页添加 Live2D 看板娘

    只需要将以下代码粘贴到 标签中即可 <!--看板娘--> <script src="https://cdn.jsdelivr.net/npm/jquery/dist/jqu ...

  6. Mac 解压缩软件-keka

    去官网 GitHub地址 功能预览

  7. php 获取某数组中出现次数最多的值(重复最多的值)与出现的次数

    1.$arr = array(7,7,8,9,10,10,10); $arr = array_count_values($arr);   // 统计数组中所有值出现的次数 arsort($arr);  ...

  8. 谁动了我的 Linux?原来 history 可以这么强大!

    当我们频繁使用 Linux 命令行时,有效地使用历史记录,可以大大提高工作效率. 在平时 Linux 操作过程中,很多命令是重复的,你一定不希望大量输入重复的命令.如果你是系统管理员,你可能需要对用户 ...

  9. 通过Python将监控数据由influxdb写入到MySQL

    一.项目背景 我们知道InfluxDB是最受欢迎的时序数据库(TSDB).InfluxDB具有 持续高并发写入.无更新:数据压缩存储:低查询延时 的特点.从下面这个权威的统计图中,就可以看出Influ ...

  10. Truncate用法详解

    前言: 当我们想要清空某张表时,往往会使用truncate语句.大多时候我们只关心能否满足需求,而不去想这类语句的使用场景及注意事项.本篇文章主要介绍truncate语句的使用方法及注意事项. 1.t ...