3 changed files with 67 additions and 36 deletions
Binary file not shown.
@ -1,49 +1,78 @@ |
|||||
package main |
package main |
||||
|
|
||||
import ( |
import ( |
||||
|
"context" |
||||
"flag" |
"flag" |
||||
"fmt" |
"fmt" |
||||
"mblog/app" |
|
||||
"os" |
"os" |
||||
"os/signal" |
|
||||
"runtime" |
"github.com/go-mysql-org/go-mysql/mysql" |
||||
"syscall" |
"github.com/go-mysql-org/go-mysql/replication" |
||||
|
"github.com/pingcap/errors" |
||||
) |
) |
||||
|
|
||||
var myHost = flag.String("host", "127.0.0.1", "MySQL replication host") |
var host = flag.String("host", "127.0.0.1", "MySQL host") |
||||
var myPort = flag.Int("port", 3306, "MySQL replication port") |
var port = flag.Int("port", 3306, "MySQL port") |
||||
var myUser = flag.String("user", "root", "MySQL replication user") |
var user = flag.String("user", "root", "MySQL user, must have replication privilege") |
||||
var myPass = flag.String("pass", "****", "MySQL replication pass") |
var password = flag.String("password", "****", "MySQL password") |
||||
var serverId = flag.Int("server_id", 1111, "MySQL replication server id") |
|
||||
|
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() { |
func main() { |
||||
sc := make(chan os.Signal, 1) |
|
||||
signal.Notify(sc, |
|
||||
os.Kill, |
|
||||
os.Interrupt, |
|
||||
syscall.SIGHUP, |
|
||||
syscall.SIGQUIT, |
|
||||
syscall.SIGINT, |
|
||||
syscall.SIGTERM, |
|
||||
) |
|
||||
|
|
||||
runtime.GOMAXPROCS(runtime.NumCPU()/4 + 1) |
|
||||
flag.Parse() |
flag.Parse() |
||||
cfg := &app.Config{ |
|
||||
*myHost, |
cfg := replication.BinlogSyncerConfig{ |
||||
*myPort, |
ServerID: 101, |
||||
*myUser, |
Flavor: *flavor, |
||||
*myPass, |
|
||||
*serverId, |
Host: *host, |
||||
"mysql-bin.000032", |
Port: uint16(*port), |
||||
3070, |
User: *user, |
||||
|
Password: *password, |
||||
|
RawModeEnabled: *rawMode, |
||||
|
SemiSyncEnabled: *semiSync, |
||||
|
UseDecimal: true, |
||||
} |
} |
||||
srv := &app.Server{Cfg: cfg} |
|
||||
go srv.Run() |
|
||||
|
|
||||
select { |
b := replication.NewBinlogSyncer(cfg) |
||||
case n := <-sc: |
|
||||
srv.Quit() |
pos := mysql.Position{Name: *file, Pos: uint32(*pos)} |
||||
fmt.Printf("receive signal %v, closing", n) |
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) |
||||
|
} |
||||
} |
} |
||||
|
|
||||
} |
} |
||||
|
|||||
Loading…
Reference in new issue