func main() { flag.Parse() b := replication.NewBinlogSyncer(101, *flavor) if err := b.RegisterSlave(*host, uint16(*port), *user, *password); err != nil { fmt.Printf("Register slave error: %v \n", errors.ErrorStack(err)) return } b.SetRawMode(*rawMode) if *semiSync { if err := b.EnableSemiSync(); err != nil { fmt.Printf("Enable semi sync replication mode err: %v\n", errors.ErrorStack(err)) return } } pos := mysql.Position{*file, uint32(*pos)} if len(*backupPath) > 0 { // must raw mode b.SetRawMode(true) err := b.StartBackup(*backupPath, pos, 0) if err != nil { fmt.Printf("Start backup error: %v\n", errors.ErrorStack(err)) return } } else { s, err := b.StartSync(pos) if err != nil { fmt.Printf("Start sync error: %v\n", errors.ErrorStack(err)) return } for { e, err := s.GetEvent() if err != nil { fmt.Printf("Get event error: %v\n", errors.ErrorStack(err)) return } e.Dump(os.Stdout) } } }
func (c *Canal) prepareSyncer() error { c.syncer = replication.NewBinlogSyncer(c.cfg.ServerID, c.cfg.Flavor) seps := strings.Split(c.cfg.Addr, ":") if len(seps) != 2 { return errors.Errorf("invalid mysql addr format %s, must host:port", c.cfg.Addr) } port, err := strconv.ParseUint(seps[1], 10, 16) if err != nil { return errors.Trace(err) } if err = c.syncer.RegisterSlave(seps[0], uint16(port), c.cfg.User, c.cfg.Password); err != nil { return errors.Trace(err) } return nil }