主从复制(GTID)

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


你可能感兴趣的:(主从复制(GTID))