MySQL5.7.23实现Gtid主从复制

前言

1)Gtid的概念
全局事务标识:global transaction identifiers
GTID是一个事务一一对应,并且全局唯一ID
GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或主从不一致
GTID用来代替传统复制方法,不再使用MASTER_LOG_FILE+MASTER_LOG_POS开启复制。而是使用MASTER_AUTO_POSTION=1的方式开始复制。
MySQL-5.6.5开始支持的,MySQL-5.6.10后开始完善。
在传统的slave端,binlog是不用开启的,但是在GTID中slave端的binlog是必须开启的,目的是记录执行过的GTID(强制)。
2)Gtid的组成
uuid和事务id
3)Gtid优势
更简单的实现failover,不用以前那样在需要找log_file和log_pos。
更简单的搭建主从复制。
比传统的复制更加安全。
GTID是连续的没有空洞的,保证数据的一致性,零丢失。
4)Gtid的工作原理
1、当一个事务在主库端执行并提交时,产生GTID,一同记录到binlog日志中。
2、binlog传输到slave,并存储到slave的relaylog后,读取这个GTID的这个值设置gtid_next变量,即告诉Slave,下一个要执行的GTID值。
3、sql线程从relay log中获取GTID,然后对比slave端的binlog是否有该GTID。
4、如果有记录,说明该GTID的事务已经执行,slave会忽略。
5、如果没有记录,slave就会执行该GTID事务,并记录该GTID到自身的binlog,在读取执行事务前会先检查其他session持有该GTID,确保不被重复执行。
6、在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。

一、环境

主机名 OS IP
MASTER centos7.5 192.168.182.164
SLAVE centos7.5 192.168.182.163

二、配置my.cnf

1)master

[root@master opt]# cat /etc/my.cnf 
[mysqld]
user = mysql
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
socket = /usr/local/mysql/mysql.sock
log-error = /usr/local/mysql/data/mysql.err
pid-file = /usr/local/mysql/data/mysqld.pid
server_id=1  //主服务器id
gtid_mode=on   //开启gtid模式
enforce_gtid_consistency=on  //强制gtid一致性,开启后对于特定create table不被支持
log-bin=mysql-bin
log-slave-updates=1    
binlog_format=row        //强烈建议,其他格式可能导致数据不一致
skip_slave_start=1
[client]
socket = /usr/local/mysql/mysql.sock
[root@master opt]# 
2)slave

[root@slave data]# cat /etc/my.cnf 
[mysqld]
user = mysql
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
socket = /usr/local/mysql/mysql.sock
log-error = /usr/local/mysql/data/mysql.err
pid-file = /usr/local/mysql/data/mysqld.pid
server_id=2
gtid_mode=on
enforce_gtid_consistency=on
log-bin=mysql-bin
log-slave-updates=1
binlog_format=row
skip_slave_start=1
[client]
socket = /usr/local/mysql/mysql.sock
[root@slave data]# 
三、配置主从库

1)master

mysql>grant replication slave on *.* to 'masterrep'@'192.168.182.%' identified by '123.com'; 

mysql>flush privileges;mysqldump -uroot -p'123.com' -B -A -F --set-gtid-purged=OFF  --master-data=2 --single-transaction  --events | gzip >/opt/juwo_$(date +%F).sql.gz
mysql> flush tables with read lock;   //此锁表的终端必须在备份完成以后才能退出(退出锁表失效)

2)slave

mysql>mysql -uroot -p'123.com' -e "source /root/juwo_$(date +%F).sql"
mysql>changemastertomaster_host='192.168.182.164',master_port=3306,master_user='masterrep',master_password='123.com',master_auto_position=1;
mysql>start slave;
mysql>show slave status\G;

*********************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.182.164
                  Master_User: masterrep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 194
               Relay_Log_File: relay-bin.000004
                Relay_Log_Pos: 407
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
注:IO和SQL都为yes,说明成功了

 

你可能感兴趣的:(日常笔记)