mysql gtid模式 主从同步

gtid模式比传统的binlog file + pos 的方式,能避免在同步配置时期漏掉sql的问题,并且能简化配置,不用手动定义file和pos了。

先在主库开启binlog和gtid, 新建配置 /etc/mysql/mysql.conf.d/binlog.cnf

1
2
3
4
5
6
7
8
9
[mysqld]
server-id=1
binlog-format=mixed
log-bin=mysql-bin
log-bin-index=mysql-bin.index

gtid-mode=on
log-slave-updates=true
enforce-gtid-consistency=true

然后重启主库使其生效

然后添加从库用来同步的账号 并授权

1
2
3
CREATE USER 'slave'@'&' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
FLUSH PRIVILEGES;

到此主库配置完毕

在从库开启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
3
environment:
- 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
4
Could 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
2
3
4
5
6
7
8
CHANGE MASTER TO
MASTER_HOST = '主库host',
MASTER_PORT = 3306,
MASTER_USER = 'slave',
MASTER_PASSWORD = 'password',
MASTER_AUTO_POSITION=1;

START SLAVE;

然后用 SHOW SLAVE STATUS\G; 命令查看是否正常即可,主要关注下面两个参数:

1
2
 Slave_IO_Running: Yes
Slave_SQL_Running: Yes

如果都是yes,那么就行了,否则请查看 Last_IO_ErrorLast_SQL_Error 来定位和修复遇到的问题。

鄂ICP备14007840号-1