@@ -68,9 +68,50 @@ type BinlogReader struct {
68
68
shutdown bool
69
69
shutdownCh chan struct {}
70
70
shutdownLock sync.Mutex
71
+
72
+ sqlFilter * SqlFilter
73
+ }
74
+
75
+ type SqlFilter struct {
76
+ NoDML bool
77
+ NoDMLDelete bool
78
+ NoDMLInsert bool
79
+ NoDMLUpdate bool
80
+ NoDDL bool
81
+ //NoDDLCreateTable bool
82
+ //NoDDLAlterTable bool
83
+ }
84
+ func parseSqlFilter (strs []string ) (* SqlFilter , error ) {
85
+ s := & SqlFilter {}
86
+ for i := range strs {
87
+ switch strings .ToLower (strs [i ]) {
88
+ case "nodml" :
89
+ s .NoDML = true
90
+ case "nodmldelete" :
91
+ s .NoDMLDelete = true
92
+ case "nodmlinsert" :
93
+ s .NoDMLInsert = true
94
+ case "nodmlupdate" :
95
+ s .NoDMLUpdate = true
96
+ case "noddl" :
97
+ s .NoDDL = true
98
+ //case "noddlcreatetable":
99
+ // s.NoDDLCreateTable = true
100
+ //case "noddlaltertable":
101
+ // s.NoDDLAlterTable = true
102
+ default :
103
+ return nil , fmt .Errorf ("unknown sql filter item: %v" , strs [i ])
104
+ }
105
+ }
106
+ return s , nil
71
107
}
72
108
73
109
func NewMySQLReader (cfg * config.MySQLDriverConfig , logger * log.Entry , replicateDoDb []* config.DataSource ) (binlogReader * BinlogReader , err error ) {
110
+ sqlFilter , err := parseSqlFilter (cfg .SqlFilter )
111
+ if err != nil {
112
+ return nil , err
113
+ }
114
+
74
115
binlogReader = & BinlogReader {
75
116
logger : logger ,
76
117
currentCoordinates : base.BinlogCoordinateTx {},
@@ -80,6 +121,7 @@ func NewMySQLReader(cfg *config.MySQLDriverConfig, logger *log.Entry, replicateD
80
121
ReMap : make (map [string ]* regexp.Regexp ),
81
122
shutdownCh : make (chan struct {}),
82
123
tables : make (map [string ](map [string ]* config.TableContext )),
124
+ sqlFilter : sqlFilter ,
83
125
}
84
126
85
127
for _ , db := range replicateDoDb {
@@ -297,6 +339,7 @@ func (b *BinlogReader) handleEvent(ev *replication.BinlogEvent, entriesChannel c
297
339
return nil
298
340
}
299
341
}
342
+
300
343
if ! ddlInfo .isDDL {
301
344
event := NewQueryEvent (
302
345
currentSchema ,
@@ -307,6 +350,13 @@ func (b *BinlogReader) handleEvent(ev *replication.BinlogEvent, entriesChannel c
307
350
entriesChannel <- b .currentBinlogEntry
308
351
b .LastAppliedRowsEventHint = b .currentCoordinates
309
352
return nil
353
+ } else {
354
+ // it is a ddl
355
+ }
356
+
357
+ if b .sqlFilter .NoDDL {
358
+ b .logger .Debugf ("mysql.reader. skipped_a_query_event. query: %v" , query )
359
+ return nil
310
360
}
311
361
312
362
for i , sql := range ddlInfo .sqls {
@@ -381,12 +431,24 @@ func (b *BinlogReader) handleEvent(ev *replication.BinlogEvent, entriesChannel c
381
431
return nil
382
432
}
383
433
434
+ schemaName := string (rowsEvent .Table .Schema )
435
+ tableName := string (rowsEvent .Table .Table )
436
+
437
+ if b .sqlFilter .NoDML ||
438
+ (b .sqlFilter .NoDMLDelete && dml == DeleteDML ) ||
439
+ (b .sqlFilter .NoDMLInsert && dml == InsertDML ) ||
440
+ (b .sqlFilter .NoDMLUpdate && dml == UpdateDML ) {
441
+
442
+ b .logger .Debugf ("mysql.reader. skipped_a_dml_event. type: %v, table: %v.%v" , dml , schemaName , tableName )
443
+ return nil
444
+ }
445
+
384
446
if dml == NotDML {
385
447
return fmt .Errorf ("Unknown DML type: %s" , ev .Header .EventType .String ())
386
448
}
387
449
dmlEvent := NewDataEvent (
388
- string ( rowsEvent . Table . Schema ) ,
389
- string ( rowsEvent . Table . Table ) ,
450
+ schemaName ,
451
+ tableName ,
390
452
dml ,
391
453
int (rowsEvent .ColumnCount ),
392
454
)
0 commit comments