gtid模式比传统的binlog file + pos 的方式,能避免在同步配置时期漏掉sql的问题,并且能简化配置,不用手动定义file和pos了。
先在主库开启binlog和gtid, 新建配置 /etc/mysql/mysql.conf.d/binlog.cnf
1  | [mysqld]  | 
然后重启主库使其生效
然后添加从库用来同步的账号 并授权
1  | CREATE USER 'slave'@'&' IDENTIFIED BY 'password';  | 
到此主库配置完毕
在从库开启gtid,新建配置 /etc/mysql/mysql.conf.d/slave.cnf1
2
3
4
5
6
7
8
9
10[mysqld]
server-id=2
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
gtid-mode=on
log-slave-updates=true
enforce-gtid-consistency=true
binlog-format=mixed
log-bin=mysql-bin
重启从库使其生效
如果是docker的mysql,需要设置两个环境变量,不然会中文乱码和时区不对1
2
3environment:
  - TZ=Asia/Shanghai
  - LANG=C.UTF-8
然后将主库数据导出一份到从库,注意跳过mysql数据库,因为mysql数据库里面记录了主库的账号,binlog信息之类的,当然,如果你需要同步mysql库也可以
在从库机器上执行一下命令来导入
1  | mysqldump -h 主库host -p 3306 -u slave -p 'password' --all-databases --triggers --routines --events > mysql  | 
如果从库之前已经有数据,可能会遇到报错1
ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.
执行下列语句来重设master
1  | reset master;  | 
如果遇到这个错误1
2
3
4Could not execute Write_rows_v1 event on table jjcc_system.<tablename>; 
Duplicate entry '845333' for key 'PRIMARY', Error_code: 1062; 
handler error HA_ERR_FOUND_DUPP_KEY; 
the event's master log mysql-bin.003897, end_log_pos 3021237
增加下列配置来忽略错误1
slave-skip-errors=1032,1062
配置从库账号连接信息并开启同步
1  | CHANGE MASTER TO  | 
然后用 SHOW SLAVE STATUS\G; 命令查看是否正常即可,主要关注下面两个参数:
1  | Slave_IO_Running: Yes  | 
如果都是yes,那么就行了,否则请查看 Last_IO_Error 和 Last_SQL_Error 来定位和修复遇到的问题。