11#!/usr/bin/env python3
22"""Compare Debezium LogMiner vs OLR adapter outputs.
33
4- Usage: compare-debezium.py <logminer.jsonl> <olr.jsonl>
4+ Usage: compare-debezium.py [--exclude-tables T1,T2,...] <logminer.jsonl> <olr.jsonl>
55
66Both inputs are JSONL files with Debezium envelope events:
77 {"before":..., "after":..., "source":..., "op":..., "ts_ms":...}
1313Exits 0 on match, 1 on mismatch with diff report.
1414"""
1515
16+ import argparse
1617import json
1718import sys
1819from collections import defaultdict
2627 'X19kZWJleml1bV91bmF2YWlsYWJsZV92YWx1ZQ==' ,
2728}
2829
29- # Tables to exclude from comparison (stats/bookkeeping, not test data).
30- # FUZZ_LOB excluded due to known RAC phantom transaction bugs (olr#26, olr#10) .
31- EXCLUDED_TABLES = {'FUZZ_STATS' , 'FUZZ_LOB' }
30+ # Tables always excluded from comparison (stats/bookkeeping, not test data).
31+ # Additional tables can be excluded via --exclude-tables CLI flag .
32+ EXCLUDED_TABLES = {'FUZZ_STATS' }
3233
3334
3435def is_unavailable (v ):
@@ -50,8 +51,9 @@ def normalize_columns(d):
5051 return {k : normalize_value (v ) for k , v in d .items ()}
5152
5253
53- def parse_debezium_jsonl (path ):
54+ def parse_debezium_jsonl (path , excluded_tables = None ):
5455 """Parse a Debezium JSONL file into normalized records."""
56+ skip_tables = EXCLUDED_TABLES | (excluded_tables or set ())
5557 records = []
5658 with open (path ) as f :
5759 for line in f :
@@ -71,7 +73,7 @@ def parse_debezium_jsonl(path):
7173 continue
7274
7375 # Skip excluded tables
74- if table in EXCLUDED_TABLES :
76+ if table in skip_tables :
7577 continue
7678
7779 records .append ({
@@ -333,12 +335,18 @@ def compare(lm_records, olr_records):
333335
334336
335337def main ():
336- if len (sys .argv ) != 3 :
337- print (f"Usage: { sys .argv [0 ]} <logminer.jsonl> <olr.jsonl>" , file = sys .stderr )
338- sys .exit (2 )
339-
340- lm_records = parse_debezium_jsonl (sys .argv [1 ])
341- olr_records = parse_debezium_jsonl (sys .argv [2 ])
338+ parser = argparse .ArgumentParser (
339+ description = 'Compare Debezium LogMiner vs OLR adapter outputs.' )
340+ parser .add_argument ('logminer_jsonl' , help = 'LogMiner JSONL file' )
341+ parser .add_argument ('olr_jsonl' , help = 'OLR JSONL file' )
342+ parser .add_argument ('--exclude-tables' , default = '' ,
343+ help = 'Comma-separated list of additional tables to exclude' )
344+ args = parser .parse_args ()
345+
346+ extra_excluded = set (t .strip () for t in args .exclude_tables .split (',' ) if t .strip ())
347+
348+ lm_records = parse_debezium_jsonl (args .logminer_jsonl , extra_excluded )
349+ olr_records = parse_debezium_jsonl (args .olr_jsonl , extra_excluded )
342350
343351 # Merge LogMiner's split LOB events (OLR already emits merged events)
344352 lm_merged = merge_lob_events (lm_records )
0 commit comments