You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
1.9 KiB
78 lines
1.9 KiB
package main
|
|
|
|
import (
|
|
"context"
|
|
"flag"
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/go-mysql-org/go-mysql/mysql"
|
|
"github.com/go-mysql-org/go-mysql/replication"
|
|
"github.com/pingcap/errors"
|
|
)
|
|
|
|
var host = flag.String("host", "127.0.0.1", "MySQL host")
|
|
var port = flag.Int("port", 3306, "MySQL port")
|
|
var user = flag.String("user", "root", "MySQL user, must have replication privilege")
|
|
var password = flag.String("password", "****", "MySQL password")
|
|
|
|
var flavor = flag.String("flavor", "mysql", "Flavor: mysql or mariadb")
|
|
|
|
var file = flag.String("file", "mysql-bin.000032", "Binlog filename")
|
|
var pos = flag.Int("pos", 3070, "Binlog position")
|
|
|
|
var semiSync = flag.Bool("semisync", false, "Support semi sync")
|
|
var backupPath = flag.String("backup_path", "", "backup path to store binlog files")
|
|
|
|
var rawMode = flag.Bool("raw", false, "Use raw mode")
|
|
|
|
func main() {
|
|
flag.Parse()
|
|
|
|
cfg := replication.BinlogSyncerConfig{
|
|
ServerID: 101,
|
|
Flavor: *flavor,
|
|
|
|
Host: *host,
|
|
Port: uint16(*port),
|
|
User: *user,
|
|
Password: *password,
|
|
RawModeEnabled: *rawMode,
|
|
SemiSyncEnabled: *semiSync,
|
|
UseDecimal: true,
|
|
}
|
|
|
|
b := replication.NewBinlogSyncer(cfg)
|
|
|
|
pos := mysql.Position{Name: *file, Pos: uint32(*pos)}
|
|
if len(*backupPath) > 0 {
|
|
// Backup will always use RawMode.
|
|
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(context.Background())
|
|
if err != nil {
|
|
// Try to output all left events
|
|
events := s.DumpEvents()
|
|
for _, e := range events {
|
|
e.Dump(os.Stdout)
|
|
}
|
|
fmt.Printf("Get event error: %v\n", errors.ErrorStack(err))
|
|
return
|
|
}
|
|
|
|
e.Dump(os.Stdout)
|
|
}
|
|
}
|
|
|
|
}
|
|
|