本文作者:杨槐(花名:渡劫)袋鼠云大数据开发工程师,负责FLinkx的开发与维护。

本文首发于:​​数栈研习社​

我们在github上还有关于​​FlinkX​​的开源项目,欢迎大家给我们点个star~


FlinkX-Oracle Logminer模块是FlinkX基于Logminer对Oracle重做日志进行实时采集分析,可对Oracle进行实时同步也可以通过指定SCN或者时间戳从某个节点进行同步,同时通过记录SCN号支持续跑功能。

一、Logminer介绍与使用

Logminer是Oracle公司从产品8i以后提供的一个实际非常有用的分析工具,使用该工具可以轻松获得Oracle重做日志文件(归档日志文件)中的具体内容,Logminer分析工具实际上是由一组PL/SQL包和一些动态视图组成,它作为Oracle数据库的一部分来发布,是Oracle公司提供的一个完全免费的工具。

Logminer读取重做日志文件的内容并加载到视图v$logmnr_contents中,可通过SQL对视图v$logmnr_contents 读取获取到实时数据。

1、Oracle重做日志

Oracle的重做日志分为在线重做日志和归档重做日志。

Online Redo log files--在线重做日志,又称联机重做日志,指Oracle以SQL脚本的形式实时记录数据库的数据更新,换句话说,实时保存已执行的SQL脚本到在线日志文件中(按特定的格式)。

Archive Redo log files--归档重做日志,简称归档日志,指当条件满足时,Oracle将在线重做日志以文件形式保存到硬盘(持久化)。

2、补充日志

补充日志不是独立的一种日志,为了性能考虑,在Update时,重做日志默认只记录更改字段的前后值,而开启了补充日志后,会将更新前后的所有字段的值记录。

3、Oracle重做日志写入流程

Oracle重做日志采用循环写入的方式,每一个Oracle实例至少拥有2组日志组。

Oracle重做日志一般由Oracle自动切换,重做日志文件在当LGWR进程停止写入并开始写入下一个日志组时发生切换,或在用户收到发出ALTER SYSTEM SWITCH LOGFILE时发生切换。如果Oracle数据库开启了归档功能,则在日志组发生切换的时候,上一个日志组的日志文件会被归档到归档目录里。

4、Logminer字典

Oracle数据字典记录当前所有表的信息,字段的信息等等。Logminer使用字典将内部对象标识符和数据类型转换为对象名称和外部数据格式。如果没有字典,Logminer将返回内部对象ID,并将数据显示为二进制数。

对于下面的Insert语句




初识FlinkX-Oracle Logminer_hive


没有设置字典显示的内容为:

初识FlinkX-Oracle Logminer_dictionary_02

Logminer提供了三种字典选项:

    Using the Online Catalog

    Extracting a Logminer Dictionary to the Redo Log Files

    Extracting the Logminer Dictionary to a Flat File

FlinkX使用的是Online Catalog

5、Logminer 使用步骤

第一步:为Logminer增加日志文件

第二步:开启Logminer

第三步:读取数据

初识FlinkX-Oracle Logminer_dictionary_03

查出的数据格式如下图所示:



初识FlinkX-Oracle Logminer_dictionary_04


二、FlinkX和Logminer集成

1、Logminer模块流程解析

Logminer模块主要分为三部分

1)日志文件查找:

查询在线日志与归档日志

2)日志文件加载及开启Logminer

将日志文件加载到Logminer中,Logminer会将日志文件内容转化到v$logmnr_contents视图里

3) 数据查询与解析

根据过滤条件,查询v$logmnr_contents数据,获得数据,并对sql_redo字段内容进行解析



初识FlinkX-Oracle Logminer_hive_05


2、日志文件的查找

Logminer通过加载重做日志文件,将其中的内容根据字典转化到v$logmnr_contents中,因此第一步为Logminer找到需要加载的重做日志文件

Oracle 重做日志文件分为在线重做日志和归档重做日志,其中在线重做日志可以在v$log以及v$logfile中查询到,而归档重做日志可以在v$archived_log查找到,一般是通过scn号进行查询过滤。



初识FlinkX-Oracle Logminer_dictionary_06


3、日志文件的加载与开启

将日志文件加载到Logminer中,并开启Logminer

Logminer第一次添加日志

SYS.DBMS_LOGMNR.add_logfile(l_log_rec.name, SYS.DBMS_LOGMNR.new)

Logminer后续添加日志

SYS.DBMS_LOGMNR.add_logfile(l_log_rec.name)

开启Logminer



初识FlinkX-Oracle Logminer_oracle_07


 


初识FlinkX-Oracle Logminer_dictionary_08


4、查找数据

Logminer会将加载的日志文件内容输出到视图v$logmnr_contents里,只需要按照一定的过滤条件查找到自己想要监听的数据即可。目前仅支持表名以及对应的动作(update/delete/insert)进行过滤。



初识FlinkX-Oracle Logminer_github_09


三、Logminer实战示例

Logminer->hive脚本



初识FlinkX-Oracle Logminer_dictionary_10