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.cnf
1
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
来定位和修复遇到的问题。