写在前面:

本文主要讲解,GTID复制模式的参数配置、搭建过程中遇到的一些问题及其解决方法;针对一些常见问题场景,进行故障模拟,然后解决。
如果对GTID的其他方面的知识想要做个了解,如:GTID优点、使用限制、实现原理等,可以移步到笔者的另一篇文章 GTID模式介绍


环境:

MySQL5.6.16版本
CentOS release 6.5


主从参数配置:

对于GTID参数的含义,请参阅MySQL官网


Master配置GTID参数:
gtid_mode=on
enforce_gtid_consistency=on

log_slave_updates=1

log_bin = /home/data/mysql3306/binlog

binlog_format = row
server_id=1

... 以上参数是必须的,其他参数自行配置

重启Master,因为MySQL5.6不支持动态配置GTID

Slave配置GTID参数:
gtid_mode=on
enforce_gtid_consistency=on

log_slave_updates=1

log_bin = /home/data/mysql3306/binlog

binlog_format = row
server_id=2
relay_log = /home/data/mysql3306/relaylog

replicate_do_db=edusoho_e

 (开启log_slave_updates参数,是把relay-log里的日志内容再记录到slave本地的binlog里,MySQL5.7版本以后Slave可以不开启binlog了,可以节省空间提高性能,5.6版本必须开启binlog,因为GTID存储在binlog中,只有开启binlog才能使用GTID的功能。5.7中通过GTID系统表来记录GITD(表mysql.gtid_executed),每个事务提交时,将GTID插入到表中)
... 以上参数是必须的,其他参数自行配置

重启Slave,因为MySQL5.6不支持动态配置GTID


授权复制连接用户:

mysql> grant replication slave on *.*to repliter@'192.168.32.2' identified by PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9';
Query OK, 0 rows affected, 2 warnings (0.00 sec)


配置主从复制过滤规则:

[root@slave mysql3306]# cat my.cnf

replicate_do_db=edusoho_e


准备复制数据:

mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000001 |      151 |              |                  |                   |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)


创建statistic库:
mysql> create database statistic;
Query OK, 1 row affected (0.01 sec)

创建statistic.t1表:
CREATE TABLE `statistic`.`t1` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`xname` VARCHAR(20) NOT NULL DEFAULT '',
`address` CHAR(20) NOT NULL DEFAULT '',
`sex` TINYINT(1) NOT NULL DEFAULT '1',
`hobby` VARCHAR(30) NOT NULL DEFAULT '',
`age` TINYINT(2) DEFAULT '18',
PRIMARY KEY (`id`),
KEY `idx_name` (`xname`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

创建edusoho_e库:
mysql> create database edusoho_e;
Query OK, 1 row affected (0.01 sec)

创建edusoho_e.t1表:
CREATE TABLE `edusoho_e`.`t1` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`xname` VARCHAR(20) NOT NULL DEFAULT '',
`address` CHAR(20) NOT NULL DEFAULT '',
`sex` TINYINT(1) NOT NULL DEFAULT '1',
`hobby` VARCHAR(30) NOT NULL DEFAULT '',
`age` TINYINT(2) DEFAULT '18',
PRIMARY KEY (`id`),
KEY `idx_name` (`xname`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;


插入测试数据:
INSERT INTO `statistic`.`t1` (`xname`, `address`, `hobby`) VALUES ('statistic', '北京', '游戏');
INSERT INTO `edusoho_e`.`t1` (`xname`, `address`, `hobby`) VALUES ('edusoho_e', '上海', '开发');


mysql> show master status;
+---------------+----------+--------------+------------------+------------------------------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+---------------+----------+--------------+------------------+------------------------------------------+
| binlog.000001 |     2139 |              |                  | b6af5b5c-666f-11e9-bed3-000c29b85ea6:1-6 |
+---------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)


导出复制数据:

[root@master mysql3306]# mysqldump -uroot -p -B edusoho_e > `date +%F`.sql(参数什么含义自己查阅文档吧)
Enter password:
Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don't want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events.


Slave主机导入复制数据:

[root@slave mysql3306]# mysql -uroot -p < 2019-05-28.sql
Enter password:


开启数据复制:
mysql> CHANGE MASTER TO MASTER_HOST='192.168.32.3',MASTER_PORT=3306,MASTER_AUTO_POSITION=1;
Query OK, 0 rows affected (0.02 sec)
MASTER_AUTO_POSITION=1,表示MySQl会通过内部机制自动找点同步,不在需要人工确认file和position