package Ġcom . github . th ake . log miner . kafka . connect . log miner Ċ Ċ import Ġcom . github . th ake . log miner . kafka . connect . Log miner Dictionary Source Ċ import Ġcom . github . th ake . log miner . kafka . connect . Schema Selector Ċ import Ġcom . github . th ake . log miner . kafka . connect . Table Selector Ċ import Ġcom . github . th ake . log miner . kafka . connect . log miner . Log miner Schema . END _ LOG MIN ER _ SESSION _ QUERY Ċ import Ġmu . Kotlin Logging Ċ import Ġjava . sql . Connection Ċ import Ġjava . sql . PreparedStatement Ċ import Ġjava . sql . ResultSet Ċ Ċ private Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} Ċ /** Ċ Ġ* ĠDescri bes Ġthe Ġlog miner Ġschema Ġand Ġall ĠSQL Ġcalls Ġneeded Ġto Ġfetch Ġresults Ġfrom Ġthe Ġlog miner Ġ* Ċ Ġ*/ Ċ object ĠLog miner Schema Ġ{ ĊĠĠĠ Ġobject ĠFields Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSEG _ OWNER Ġ= Ġ" SEG _ OWNER " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTABLE _ NAME Ġ= Ġ" TABLE _ NAME " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTIMESTAMP Ġ= Ġ" TIMESTAMP " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSQL _ RE DO Ġ= Ġ" SQL _ RE DO " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠOPER ATION Ġ= Ġ" OPERATION " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠUSER NAME Ġ= Ġ" USERNAME " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠX ID Ġ= Ġ" x id " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠS CN Ġ= Ġ" SC N " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠROW _ ID Ġ= Ġ" ROW _ ID " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠC SF Ġ= Ġ" CS F " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSTATUS Ġ= Ġ" STATUS " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconst Ġval ĠTEMP OR ARY _ TABLE Ġ= Ġ" temporary Ġtables " ĊĠĠĠ Ġconst Ġval ĠNULL _ VALUE Ġ= Ġ" NULL " ĊĊĠĠĠ Ġconst Ġval ĠQUERY _ MON IT O RED _ LOG S Ġ= Ġ""" ĊĠĠĠĠĠĠĠ Ġselect Ġfilename Ġas Ġname , Ġlow _ sc n , Ġnext _ sc n Ġfrom ĠV ${ '$ '} LOG M NR _ LOG S ĊĠĠĠ Ġ""" ĊĠĠĠ Ġconst Ġval ĠSTART _ LOG MIN ER _ SESSION _ RE DO _ LOG _ DI CTIONARY _ QUERY Ġ= Ġ""" ĊĠĠĠĠĠĠĠ Ġdeclare ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart _ sc n ĠNUMBER Ġ:= Ġ? ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcatalog _ exists ĠNUMBER Ġ:= Ġ 0 ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġlogfile _ name _ table Ġis Ġtable Ġof ĠNUMBER ĠINDEX ĠBY ĠV ${ '$ '} LOG FILE . member % TYPE ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv _ log files Ġlogfile _ name _ table ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ĠV ${ '$ '} LOG FILE . member % TYPE ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart _ sc n _ in _ log files ĠNUMBER Ġ:= Ġ 0 ; ĊĠĠĠĠĠĠĠ Ġbegin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ-- First Ġcheck Ġif Ġa Ġcatalog Ġexists Ġin Ġlog Ġfiles . ĠAdd Ġall Ġlog files Ġafterwards Ġso Ġthat ĠD DL Ġtracking Ġworks . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġl _ cat _ log _ file Ġin Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect Ġname , FIRST _ CHANGE # Ġfrom Ġv ${ '$ '} arch ived _ log Ġwhere ĠNAME ĠIS ĠNOT ĠNULL ĠAND ĠFIRST _ CHANGE # Ġ>= Ġ( select Ġmax ( FIRST _ CHANGE # ) Ġfrom ĠV ${ '$ '} ARCH IVED _ LOG Ġwhere ĠDICTIONARY _ BEGIN Ġ= Ġ' YES ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv _ log files ( l _ cat _ log _ file . NAME ) Ġ:= Ġl _ cat _ log _ file . FIRST _ CHANGE # ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcatalog _ exists Ġ:= Ġ 1 ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġloop ; ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( catalog _ exists Ġ= Ġ 0 ) Ġthen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-- ĠCreate Ġa Ġcatalog ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDB MS _ OUTPUT . PUT _ LINE (' Found Ġno Ġdictionary Ġin Ġredo Ġlogs . ĠBuilding Ġdictionary Ġfor Ġlog miner Ġstored Ġin Ġredo Ġlogs .'); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDB MS _ LOG M NR _ D . BUILD ( OPTIONS => ĠDB MS _ LOG M NR _ D . STORE _ IN _ RE DO _ LOG S ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDB MS _ OUTPUT . PUT _ LINE (' Found Ġa Ġdictionary Ġin Ġredo Ġlogs . ĠUsing Ġit Ġas Ġa Ġreference .'); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġif ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġl _ log _ rec ĠIN Ġ( select Ġmin ( name ) Ġname , ĠFIRST _ CHANGE #, ĠNEXT _ CHANGE # ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect Ġmin ( member ) Ġas Ġname , ĠFIRST _ CHANGE #, ĠNEXT _ CHANGE # ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom ĠV ${ '$ '} LOG Ġl ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner Ġjoin ĠV ${ '$ '} LOG FILE Ġf Ġon Ġl . GROUP # Ġ= Ġf . GROUP # ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Ġby Ġfirst _ change #, ĠNEXT _ CHANGE # ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunion ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect Ġname , ĠFIRST _ CHANGE #, ĠNEXT _ CHANGE # ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFrom ĠV ${ '$ '} ARCH IVED _ LOG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhere Ġname Ġis Ġnot Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhere ĠFIRST _ CHANGE # Ġ>= Ġstart _ sc n ĠOR Ġstart _ sc n Ġ< ĠNEXT _ CHANGE # ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Ġby Ġfirst _ change #, Ġnext _ change # ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorder Ġby ĠFIRST _ CHANGE # ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv _ log files ( l _ log _ rec . name ) Ġ:= Ġl _ log _ rec . FIRST _ CHANGE # ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġloop ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ:= Ġv _ log files . FIRST ; ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWH ILE Ġi ĠIS ĠNOT ĠNULL ĠLOOP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġi Ġ= Ġv _ log files . FIRST Ġthen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDB MS _ OUTPUT . PUT _ LINE (' Re starting Ġlog miner Ġwith Ġlogfile Ġ'|| i ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDB MS _ LOG M NR . ADD _ LOG FILE ( i , DB MS _ LOG M NR . NEW ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDB MS _ OUTPUT . PUT _ LINE (' Adding Ġlogfile : Ġ'|| i ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDB MS _ LOG M NR . ADD _ LOG FILE ( i ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġif ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( v _ log files ( i ) Ġ<= Ġstart _ sc n ) Ġthen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart _ sc n _ in _ log files Ġ:= Ġ 1 ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġif ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ:= Ġv _ log files . NEXT ( i ); Ġ Ġ-- ĠGet Ġnext Ġelement Ġof Ġarray ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEND ĠLOOP ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( start _ sc n _ in _ log files Ġ= Ġ 0 ) Ġthen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDB MS _ OUTPUT . PUT _ LINE (' Start Ġsc n Ġhas Ġnot Ġbeen Ġfound Ġin Ġavailable Ġlog Ġfiles . ĠSetting Ġstart Ġsc n Ġto Ġear liest Ġavailable Ġsc n '); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart _ sc n Ġ:= Ġ 0 ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġif ; ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDB MS _ LOG M NR . START _ LOG M NR ( start Sc n Ġ=> Ġstart _ sc n , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOPTIONS Ġ=> ĠDB MS _ LOG M NR . SKIP _ CORR UP TION Ġ+ ĠDB MS _ LOG M NR . NO _ SQL _ DE LIMITER Ġ+ ĠDB MS _ LOG M NR . NO _ ROW ID _ IN _ STMT Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDB MS _ LOG M NR . DICT _ FROM _ RE DO _ LOG S Ġ+ ĠDB MS _ LOG M NR . DDL _ DICT _ TRACK ING Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb ms _ log mn r . STRING _ LITERAL S _ IN _ STMT ); ĊĠĠĠĠĠĠĠ Ġend ; ĊĠĠĠ Ġ""" ĊĠĠĠ Ġconst Ġval ĠSTART _ OR _ UPDATE _ LOG MIN ER _ SESSION _ ON LINE _ QUERY Ġ= Ġ""" ĊĠĠĠĠĠĠĠ Ġdeclare ĊĠĠĠĠĠĠĠĠĠĠĠ Ġst ĠBOOLEAN Ġ:= ĠTRUE ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart _ sc n ĠNUMBER Ġ:= Ġ? ; ĊĠĠĠĠĠĠĠ Ġbegin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġl _ log _ rec ĠIN Ġ( select Ġmin ( name ) Ġname , ĠFIRST _ CHANGE #, ĠNEXT _ CHANGE # ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect Ġmin ( member ) Ġas Ġname , ĠFIRST _ CHANGE #, ĠNEXT _ CHANGE # ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom ĠV ${ '$ '} LOG Ġl ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner Ġjoin ĠV ${ '$ '} LOG FILE Ġf Ġon Ġl . GROUP # Ġ= Ġf . GROUP # ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Ġby Ġfirst _ change #, ĠNEXT _ CHANGE # ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunion ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect Ġname , ĠFIRST _ CHANGE #, ĠNEXT _ CHANGE # ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFrom ĠV ${ '$ '} ARCH IVED _ LOG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhere Ġname Ġis Ġnot Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhere ĠFIRST _ CHANGE # Ġ>= Ġstart _ sc n ĠOR Ġstart _ sc n Ġ< ĠNEXT _ CHANGE # ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Ġby Ġfirst _ change #, Ġnext _ change # ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorder Ġby ĠFIRST _ CHANGE # ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġst Ġthen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDB MS _ LOG M NR . ADD _ LOG FILE ( l _ log _ rec . name , DB MS _ LOG M NR . NEW ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġst Ġ:= ĠFALSE ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDB MS _ LOG M NR . ADD _ LOG FILE ( l _ log _ rec . name ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġif ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġloop ; ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDB MS _ LOG M NR . START _ LOG M NR ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOPTIONS Ġ=> ĠDB MS _ LOG M NR . SKIP _ CORR UP TION Ġ+ ĠDB MS _ LOG M NR . NO _ SQL _ DE LIMITER Ġ+ ĠDB MS _ LOG M NR . NO _ ROW ID _ IN _ STMT Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDB MS _ LOG M NR . DICT _ FROM _ ON LINE _ CAT ALOG Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb ms _ log mn r . STRING _ LITERAL S _ IN _ STMT ); ĊĠĠĠĠĠĠĠ Ġend ; ĊĠĠĠ Ġ""" ĊĠĠĠ Ġconst Ġval ĠUPDATE _ MIN ER _ QUERY Ġ= Ġ""" ĊĠĠĠĠĠĠĠ Ġdeclare ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart _ sc n ĠNUMBER Ġ:= Ġ? ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile _ added ĠNUMBER Ġ:= Ġ 0 ; ĊĠĠĠĠĠĠĠ Ġbegin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġl _ log _ rec ĠIN Ġ( select Ġname , SEQUENCE #, FIRST _ CHANGE #, NEXT _ CHANGE # Ġfrom Ġ( select Ġmin ( name ) Ġname , ĠSEQUENCE #, ĠFIRST _ CHANGE #, ĠNEXT _ CHANGE # ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect Ġmin ( member ) Ġas Ġname , ĠSEQUENCE #, ĠFIRST _ CHANGE #, ĠNEXT _ CHANGE # ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom ĠV ${ '$ '} LOG Ġl ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner Ġjoin ĠV ${ '$ '} LOG FILE Ġf Ġon Ġl . GROUP # Ġ= Ġf . GROUP # ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Ġby ĠSEQUENCE #, first _ change #, ĠNEXT _ CHANGE # ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunion ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect Ġname , SEQUENCE #, ĠFIRST _ CHANGE #, ĠNEXT _ CHANGE # ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFrom ĠV ${ '$ '} ARCH IVED _ LOG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhere Ġname Ġis Ġnot Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhere ĠFIRST _ CHANGE # Ġ>= Ġstart _ sc n ĠOR Ġstart _ sc n Ġ< ĠNEXT _ CHANGE # ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Ġby ĠSEQUENCE #, first _ change #, Ġnext _ change # ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġneeded _ logs Ġwhere ĠSEQUENCE # Ġnot Ġin Ġ( select Ġlog _ ID Ġfrom ĠV ${ '$ '} LOG M NR _ LOG S ) Ġorder Ġby ĠFIRST _ CHANGE # ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDB MS _ LOG M NR . ADD _ LOG FILE ( l _ log _ rec . name ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDB MS _ OUTPUT . PUT _ LINE (' Added Ġlogfile Ġ'|| l _ log _ rec . name || ' Ġto Ġlog miner Ġsession '); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile _ added Ġ:= Ġ 1 ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġloop ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( file _ added Ġ> Ġ 0 ) Ġthen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDB MS _ LOG M NR . START _ LOG M NR ( start Sc n Ġ=> Ġstart _ sc n , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOPTIONS Ġ=> ĠDB MS _ LOG M NR . SKIP _ CORR UP TION Ġ+ ĠDB MS _ LOG M NR . NO _ SQL _ DE LIMITER Ġ+ ĠDB MS _ LOG M NR . NO _ ROW ID _ IN _ STMT Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDB MS _ LOG M NR . DICT _ FROM _ RE DO _ LOG S Ġ+ ĠDB MS _ LOG M NR . DDL _ DICT _ TRACK ING Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb ms _ log mn r . STRING _ LITERAL S _ IN _ STMT ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDB MS _ OUTPUT . PUT _ LINE (' Re started Ġlog miner Ġwith Ġadded Ġlog files Ġloaded Ġand Ġstart Ġsc n Ġ'|| start _ sc n ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDB MS _ OUTPUT . PUT _ LINE (' No Ġnew Ġlogfile Ġhas Ġbeen Ġadded . ĠRestart Ġof Ġlog miner Ġwas Ġnot Ġneeded '); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġif ; ĊĠĠĠĠĠĠĠ Ġend ; ĊĠĠĠ Ġ""" ĊĊĠĠĠ Ġconst Ġval ĠQUERY _ LOG MIN ER _ START Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSELECT ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsc n , ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommit _ sc n , ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp , ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperation , ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseg _ owner , ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtable _ name , ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusername , ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsql _ redo , ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow _ id , ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC SF , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFROM Ġ Ġv ${ '$ '} log mn r _ contents ĠĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWHERE ĠR OL L BACK Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAND Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( sc n Ġ>= Ġ? ĠAND ĠOPER ATION _ CODE ĠIN Ġ( 7 , 3 6 ) ĠAND ĠUSER NAME Ġnot Ġin Ġ(' UNKNOWN X ',' K MIN ER ')) ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOR ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( sc n Ġ>= Ġ? ĠAND ĠOPER ATION _ CODE Ġin Ġ( 1 , 2 , 3 ) Ġand Ġ( ĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠ Ġconst Ġval ĠQUERY _ LOG MIN ER _ END Ġ= Ġ" ))) " ĊĊĠĠĠ Ġconst Ġval ĠEND _ LOG MIN ER _ SESSION _ QUERY Ġ= Ġ""" ĊĠĠĠĠĠĠĠ Ġbegin ĠĊĠĠĠĠĠĠĠĠĠĠĠ ĠDB MS _ LOG M NR . END _ LOG M NR (); ĊĠĠĠĠĠĠĠ Ġend ; ĊĠĠĠ Ġ""" Ċ } Ċ data Ġclass ĠLog ( ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ: ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġsc n Range Ġ: ĠLong Range Ċ ) Ċ sealed Ġclass ĠDictionary Strategy { ĊĠĠĠ Ġfun Ġinit Session ( conn : ĠConnection , Ġoffset : ĠFetch er Offset ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Checking Ġif Ġa Ġsession Ġis Ġalready Ġrunning " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmon itored Logs Ġ= Ġdetermine Mon itored Logs ( conn ) ĊĠĠĠĠĠĠĠ Ġval Ġfrom Sc n Ġ= Ġoffset . lowest Change Sc n ĊĠĠĠĠĠĠĠ Ġif Ġ( mon itored Logs . isEmpty () Ġ|| Ġmon itored Logs . none Ġ{ Ġit . sc n Range . contains ( from Sc n ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Starting Ġoracle Ġlog miner Ġwith Ġsc n Ġ$ from Sc n " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Session ( conn , Ġfrom Sc n ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Log miner Ġsession Ġalready Ġexists . ĠRefresh ing Ġexisting Ġsession ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Session ( conn , Ġfrom Sc n ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow Mon itored Logs Ġ= Ġdetermine Mon itored Logs ( conn ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Monitoring Ġ${ now Mon itored Logs . size } ĠLog files " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġinit Session ( conn Ġ: ĠConnection , Ġfrom Sc n : ĠLong ) ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġupdate Session ( conn Ġ: ĠConnection , Ġfrom Sc n : ĠLong ) ĊĠĠĠ Ġprotected Ġfun Ġdetermine Mon itored Logs ( conn Ġ: ĠConnection ): ĠSet < Log > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġconn . prepareStatement ( Log miner Schema . QUERY _ MON IT O RED _ LOG S ). use Ġ{ Ġstmt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstmt . executeQuery (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmon itored Logs Ġ= Ġmutable Set Of < Log >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( it . next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmon itored Logs . add ( Log ( it . getString ( 1 ), Long Range ( it . getLong ( 2 ), it . getLong ( 3 )))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmon itored Logs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠRed o Log Strategy Ġ: ĠDictionary Strategy () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinit Session ( conn Ġ: ĠConnection , Ġfrom Sc n Ġ: ĠLong ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconn . prepare Call ( Log miner Schema . START _ LOG MIN ER _ SESSION _ RE DO _ LOG _ DI CTIONARY _ QUERY ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Long ( 1 , Ġfrom Sc n ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġupdate Session ( conn : ĠConnection , Ġfrom Sc n : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Updating Ġoracle Ġlog miner Ġsession Ġto Ġinclude Ġnewest Ġlog files Ġand Ġto Ġstart Ġfrom Ġsc n Ġ$ from Sc n " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconn . prepare Call ( Log miner Schema . UPDATE _ MIN ER _ QUERY ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Long ( 1 , Ġfrom Sc n ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġobject ĠOnline Log Strategy Ġ: ĠDictionary Strategy (){ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinit Session ( conn : ĠConnection , Ġfrom Sc n : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconn . prepare Call ( Log miner Schema . START _ OR _ UPDATE _ LOG MIN ER _ SESSION _ ON LINE _ QUERY ). use { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Long ( 1 , from Sc n ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġupdate Session ( conn : ĠConnection , Ġfrom Sc n : ĠLong ) Ġ= Ġinit Session ( conn , from Sc n ) ĊĊĊĠĠĠ Ġ} Ċ } Ċ class ĠLog miner Session ( private Ġval Ġconn Ġ: ĠConnection , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġoffset Ġ: ĠFetch er Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġconfig : ĠLog miner Configuration ){ ĊĊĠĠĠ Ġprivate Ġval Ġlog Miner Select Sql : ĠString Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġconfig . log Miner Selectors . join ToString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseparator Ġ= Ġ" ĠOR Ġ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefix Ġ= ĠLog miner Schema . QUERY _ LOG MIN ER _ START , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpostfix Ġ= ĠLog miner Schema . QUERY _ LOG MIN ER _ END ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTable Selector Ġ-> Ġ" (${ Log miner Schema . Fields . SEG _ OWNER } Ġ=' ${ it . owner }' Ġand Ġ${ Log miner Schema . Fields . TABLE _ NAME } Ġ= Ġ'${ it . tableName }') " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSchema Selector Ġ-> Ġ" (${ Log miner Schema . Fields . SEG _ OWNER } Ġ=' ${ it . owner }') " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġstmt : ĠPreparedStatement Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconn . prepareStatement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Miner Select Sql , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResultSet . TYPE _ FORWARD _ ONLY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResultSet . CON CUR _ READ _ ONLY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfetch Size Ġ= Ġconfig . fetch Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġ" Query ing Ġoracle Ġlog miner Ġwith Ġfetch Ġsize Ġ$ fetch Size " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Long ( 1 , Ġoffset . lowest Commit Sc n ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Long ( 2 , Ġoffset . lowest Change Sc n ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġopen ResultSet (): ĠResultSet Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġ" Select Ġstatement Ġfor Ġoracle Ġlog miner ( sc n Ġ= Ġ${ offset . last Sc n }): Ġ$ log Miner Select Sql " Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġstmt . executeQuery () ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġend Session (){ ĊĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠ Ġconn . prepare Call ( END _ LOG MIN ER _ SESSION _ QUERY ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . execute () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġclose (){ ĊĠĠĠĠĠĠĠ Ġif Ġ(! stmt . is Closed ) Ġstmt . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġinit Session ( conn : ĠConnection , Ġoffset : ĠFetch er Offset , Ġconfig : ĠLog miner Configuration ) Ġ: ĠLog miner Session { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstrategy Ġ= Ġwhen ( config . log miner Dictionary Source ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog miner Dictionary Source . RE DO _ LOG Ġ-> ĠDictionary Strategy . Redo Log Strategy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog miner Dictionary Source . ON LINE Ġ-> Ġ ĠDictionary Strategy . Online Log Strategy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstrategy . init Session ( conn , offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠLog miner Session ( conn , offset , config ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ }