MySQL binlog parser
Bristol is a MySQL binlog parser
Github : https://github.com/brokercap/Bristol
Points:
data validation: https://github.com/brokercap/Bristol/tree/master/test
MySQL Supports: 5.1 - 8.0
performance testing tool:
https://github.com/brokercap/Bristol/tree/master/test/BristolPerformanceTest
example
func callback(data *mysql.EventReslut) {
log.Println(data)
if data.Query == ""{
for k,v := range data.Rows[len(data.Rows)-1]{
log.Println(k,"==",v,"(",reflect.TypeOf(v),")")
}
}
}
func main() {
filename := "mysql-bin.000071"
var position uint32 = 203785789
var DBsource = ""
DBsource = "root:root@tcp(192.168.220.128:3308)/bifrost_test"
filename = "mysql-bin.000004"
position = 25051078
reslut := make(chan error, 1)
m := make(map[string]uint8, 0)
m["bifrost_test"] = 1
BinlogDump := &mysql.BinlogDump{
DataSource: DBsource,
CallbackFun: callback,
//ReplicateDoDb: m,
OnlyEvent: []mysql.EventType{mysql.QUERY_EVENT, mysql.WRITE_ROWS_EVENTv1, mysql.UPDATE_ROWS_EVENTv1, mysql.DELETE_ROWS_EVENTv1,mysql.WRITE_ROWS_EVENTv2, mysql.UPDATE_ROWS_EVENTv2, mysql.DELETE_ROWS_EVENTv2},
}
BinlogDump.AddReplicateDoDb("bifrost_test","*")
BinlogDump.AddReplicateDoDb("test","*")
go BinlogDump.StartDumpBinlog(filename, position, 633,reslut,"",0)
go func() {
for {
v := <-reslut
log.Printf("monitor reslut:%s \r\n", v)
}
}()
for {
time.Sleep(10 * time.Second)
}
}
DDL
MySQL binlog position must be after ddl
Data type mapping(golang)
TINYINT ( int8 | unit8 ) , SMALLINT ( int16 | unit16 ) , MEDIUMINT ( int32 | uint32 ), INT ( int32 | uint32 ) , BIGINT ( int64 | uint64 )
FLOAT ( float32 ) , DOUBLE ( float64 ) ,REAL ( float64 )
DECIMAL , NUMERIC( string )
DATE , TIME , YEAR , DATETIME , TIMESTAMP ( string )
CHAR , VARCHAR ( string )
TEXT , TINYTEXT , MEDIUMINTTEXT , LONGTEXT ( string )
BLOB, TINYBLOB , MEDIUMINTBLOB , LONGBLOB ( string )
ENUM ( string )
SET ( []string )
BIT ( int64 )
JSON ( map | array )