初識(shí)FlinkX-Oracle Logminer模塊
本文作者:楊槐(花名:渡劫)袋鼠云大數(shù)據(jù)開發(fā)工程師,負(fù)責(zé)FLinkx的開發(fā)與維護(hù)。
本文首發(fā)于:數(shù)棧研習(xí)社
我們?cè)趃ithub上還有關(guān)于FlinkX的開源項(xiàng)目,歡迎大家給我們點(diǎn)個(gè)star~
https://github.com/DTStack/flinkx
FlinkX-Oracle Logminer模塊是FlinkX基于Logminer對(duì)Oracle重做日志進(jìn)行實(shí)時(shí)采集分析,可對(duì)Oracle進(jìn)行實(shí)時(shí)同步也可以通過(guò)指定SCN或者時(shí)間戳從某個(gè)節(jié)點(diǎn)進(jìn)行同步,同時(shí)通過(guò)記錄SCN號(hào)支持續(xù)跑功能。
一、Logminer介紹與使用
Logminer是Oracle公司從產(chǎn)品8i以后提供的一個(gè)實(shí)際非常有用的分析工具,使用該工具可以輕松獲得Oracle重做日志文件(歸檔日志文件)中的具體內(nèi)容,Logminer分析工具實(shí)際上是由一組PL/SQL包和一些動(dòng)態(tài)視圖組成,它作為Oracle數(shù)據(jù)庫(kù)的一部分來(lái)發(fā)布,是Oracle公司提供的一個(gè)完全免費(fèi)的工具。
Logminer讀取重做日志文件的內(nèi)容并加載到視圖v$logmnr_contents中,可通過(guò)SQL對(duì)視圖v$logmnr_contents 讀取獲取到實(shí)時(shí)數(shù)據(jù)。
1、Oracle重做日志
Oracle的重做日志分為在線重做日志和歸檔重做日志。
Online Redo log files--在線重做日志,又稱聯(lián)機(jī)重做日志,指Oracle以SQL腳本的形式實(shí)時(shí)記錄數(shù)據(jù)庫(kù)的數(shù)據(jù)更新,換句話說(shuō),實(shí)時(shí)保存已執(zhí)行的SQL腳本到在線日志文件中(按特定的格式)。
Archive Redo log files--歸檔重做日志,簡(jiǎn)稱歸檔日志,指當(dāng)條件滿足時(shí),Oracle將在線重做日志以文件形式保存到硬盤(持久化)。
2、補(bǔ)充日志
補(bǔ)充日志不是獨(dú)立的一種日志,為了性能考慮,在Update時(shí),重做日志默認(rèn)只記錄更改字段的前后值,而開啟了補(bǔ)充日志后,會(huì)將更新前后的所有字段的值記錄。
3、Oracle重做日志寫入流程
Oracle重做日志采用循環(huán)寫入的方式,每一個(gè)Oracle實(shí)例至少擁有2組日志組。
Oracle重做日志一般由Oracle自動(dòng)切換,重做日志文件在當(dāng)LGWR進(jìn)程停止寫入并開始寫入下一個(gè)日志組時(shí)發(fā)生切換,或在用戶收到發(fā)出ALTER SYSTEM SWITCH LOGFILE時(shí)發(fā)生切換。如果Oracle數(shù)據(jù)庫(kù)開啟了歸檔功能,則在日志組發(fā)生切換的時(shí)候,上一個(gè)日志組的日志文件會(huì)被歸檔到歸檔目錄里。
4、Logminer字典
Oracle數(shù)據(jù)字典記錄當(dāng)前所有表的信息,字段的信息等等。Logminer使用字典將內(nèi)部對(duì)象標(biāo)識(shí)符和數(shù)據(jù)類型轉(zhuǎn)換為對(duì)象名稱和外部數(shù)據(jù)格式。如果沒有字典,Logminer將返回內(nèi)部對(duì)象ID,并將數(shù)據(jù)顯示為二進(jìn)制數(shù)。
對(duì)于下面的Insert語(yǔ)句

沒有設(shè)置字典顯示的內(nèi)容為:

Logminer提供了三種字典選項(xiàng):
??? 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 使用步驟
第一步:為L(zhǎng)ogminer增加日志文件
第二步:開啟Logminer
第三步:讀取數(shù)據(jù)

查出的數(shù)據(jù)格式如下圖所示:

二、FlinkX和Logminer集成
1、Logminer模塊流程解析
Logminer模塊主要分為三部分
??? 日志文件查找:
查詢?cè)诰€日志與歸檔日志
??? 日志文件加載及開啟Logminer
將日志文件加載到Logminer中,Logminer會(huì)將日志文件內(nèi)容轉(zhuǎn)化到v$logmnr_contents視圖里
??? 數(shù)據(jù)查詢與解析
根據(jù)過(guò)濾條件,查詢v$logmnr_contents數(shù)據(jù),獲得數(shù)據(jù),并對(duì)sql_redo字段內(nèi)容進(jìn)行解析

2、日志文件的查找
Logminer通過(guò)加載重做日志文件,將其中的內(nèi)容根據(jù)字典轉(zhuǎn)化到v$logmnr_contents中,因此第一步為L(zhǎng)ogminer找到需要加載的重做日志文件
Oracle 重做日志文件分為在線重做日志和歸檔重做日志,其中在線重做日志可以在v$log以及v$logfile中查詢到,而歸檔重做日志可以在v$archived_log查找到,一般是通過(guò)scn號(hào)進(jìn)行查詢過(guò)濾。

3、日志文件的加載與開啟
將日志文件加載到Logminer中,并開啟Logminer
Logminer第一次添加日志
SYS.DBMS_LOGMNR.add_logfile(l_log_rec.name, SYS.DBMS_LOGMNR.new)
Logminer后續(xù)添加日志
SYS.DBMS_LOGMNR.add_logfile(l_log_rec.name)
開啟Logminer


4、查找數(shù)據(jù)
Logminer會(huì)將加載的日志文件內(nèi)容輸出到視圖v$logmnr_contents里,只需要按照一定的過(guò)濾條件查找到自己想要監(jiān)聽的數(shù)據(jù)即可。目前僅支持表名以及對(duì)應(yīng)的動(dòng)作(update/delete/insert)進(jìn)行過(guò)濾。

三、Logminer實(shí)戰(zhàn)示例
Logminer->hive腳本
