1、什么是GTID?
全局事务标识:global transaction identififiers 是用来代替传统复制的方法,GTID复制与普通复制模式 的最大不同就是不需要指定二进制文件名和位置。
2、GTID工作原理
1、master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。
2、slave端的i/o 线程将变更的binlog,写入到本地的relay log中。
3、sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。
4、如果有记录,说明该GTID的事务已经执行,slave会忽略。
5、如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。
3、部署主从复制
准备环境两台机器,关闭防火墙和selinux。---机器环境必须一致,时间也得一致,解析两台机器的主机名
192.168.46.15 master
192.168.46.16 slave
开启两台机器的mysql,并设置成开机自启
[root@master ~]# systemctl start mysqld
[root@master ~]# systemctl enable mysqld
配置并修改密码,最好把两台机器的密码都设成一样的
master 配置
[root@master ~]# vim /etc/my.cnf
#在[mysqld]下添加如下内容
server-id=1 #定义server id master必写
log-bin = mylog #开启binlog日志,master必写
gtid_mode = ON #开启gtid
enforce_gtid_consistency=1 #强制gtid
[root@master ~]# systemctl restart mysqld #重启
主服务器创建账户:
mysql> grant replication slave,reload,super on *.* to 'slave'@'%' identified by 'Aa@123.';
#注:生产环境中密码采用高级别的密码,实际生产环境中将'%'换成slave的ip
mysql> flush privileges;
replication slave:拥有此权限可以查看从服务器,从主服务器读取二进制日志。
super权限:允许用户使用修改全局变量的SET语句以及CHANGE MASTER语句
reload权限:必须拥有reload权限,才可以执行flush [tables | logs | privileges]
slave配置
[root@slave ~]# vim /etc/my.cnf #添加如下配置
server-id=2
gtid_mode = ON
enforce_gtid_consistency=1
master-info-repository=TABLE
relay-log-info-repository=TABLE
[root@slave ~]# systemctl restart mysqld #重启
[root@slave ~]# mysql -uroot -p'123' #登陆mysql
mysql> change master to
-> master_host='master', #主ip 地址 最好用域名
-> master_user='授权用户', #主服务上面创建的用户
-> master_password='授权密码',
-> master_auto_position=1;
mysql> start slave; #启动slave角色
mysql> show slave status\G #查看下面两行是否=Yes
Slave_IO_Runing: Yes
Slave_SQL_Runing: Yes
一主双从(gtid方式)
再准备一台虚拟机做为slave2,关闭防火墙和selinux
192.168.46.10 slave2
192.168.46.15 master
由于刚才测试已经有了数据,需要先将master服务上面的数据备份出来。导入slave2的mysql中。这样才 能保证集群中的机器环境一致。
master
[root@master ~]# mysqldump -uroot -p'123' --set-gtid-purged=OFF test > master.sql
[root@master ~]# ls master.sql
[root@master ~]# scp master.sql 192.168.46.10:/root/ #拷贝到slave2
# 开启 GTID 后的导出导入数据的注意点
> 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
意思是: 当前数据库实例中开启了 GTID 功能, 在开启有 GTID 功能的数据库实例中, 导出其中任何一个 库, 如果没有显示地指定--set-gtid-purged参数, 都会提示这一行信息. 意思是默认情况下, 导出的库 中含有 GTID 信息, 如果不想导出包含有 GTID 信息的数据库, 需要显示地添加--set-gtid- purged=OFF参数.
[root@slave2 ~]#mysqldump-uroot -p --set-gtid-purged=OFF --all-databases > alldb.db
导入数据是就可以相往常一样导入了。
slave2
[root@slave2 ~]# systemctl start mysqld
[root@slave2 ~]# systemctl enable mysqld #登陆mysql创建一个test的库
[root@slave2 ~]# mysql -uroot -p'123' -e 'create database test;'
[root@slave2 ~]# mysql -uroot -p'123' test < master.sql #将数据导入。
配置slave2
[root@slave2 ~]# vim /etc/my.cnf
server-id=3 #每台机器的id不一样
gtid_mode = ON
enforce_gtid_consistency=1
master-info-repository=TABLE
relay-log-info-repository=TABLE
[root@slave2 ~]# systemctl restart mysqld
[root@slave2 ~]# mysql -uroot -p'123'
mysql>change master to
->master_host='master',
->master_user='授权用户',
->master_password='授权密码',
->master_auto_position=1;
mysql> start slave; #将slave启动起来
mysql> show slave status\G #查看一下状态
Slave_IO_Runing: Yes
Slave_SQL_Runing: Yes