goMysqlSync
golang mysql to mysql 轻量级多线程库表级数据同步
测试运行
- 设置当前binlog位置并且开始运行
go run main.go -position mysql-bin.000001 1 1619431429
- 查询当前binlog位置,参数n为秒数,查询结果为n秒前的binlog位置
go run main.go -status n
- 开始同步,会先进行一次全量同步,增量同步也会自动执行
go run main.go -full
- 若程序掉线,可以继续执行,回滚到 掉线时 900秒 之前的binlog位置重新开始同步
go run main.go
编译运行
set GOOS=linux
set GOARCH=amd64
go build -o "goMysqlSync"
chmod 777 goMysqlSync
编辑配置文件 app.yml
nohup ./goMysqlSync -full >/dev/null 2>goMysqlSync.log &
监控
监控项包括 机器的CPU、磁盘情况 和 每秒网络流量值,以及 目标库的连接状态 和 程序每秒同步速度
注意事项:
- 需要使github.com/siddontang/go-mysql项目的Position结构体支持时间戳
修改 "github.com/siddontang/go-mysql/mysql/position.go"文件
type Position struct {
Name string
Pos uint32
Timestamp uint32 #新加
}
func (p Position) String() string {
return fmt.Sprintf("(%s, %d, %d)", p.Name, p.Pos,p.Timestamp) #修改
}
修改 "github.com/siddontang/go-mysql/canal/sync.go"库文件
curPos := pos.Pos
// next binlog pos
pos.Pos = ev.Header.LogPos
pos.Timestamp = ev.Header.Timestamp #新加
-
由于项目基于mysqldump,必须要有mysqldump的工具文件,并且在配置文件中指定路径,本项目 linux和windows 都支持
-
mysql 的binlog格式必须是 row 模式,不支持外键约束,数据表必须有id字段类型为整型并且为主键