前言
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,说明成功了
本文深入探讨MySQL中GTID(全局事务标识符)的概念、组成及优势,详细讲解其工作原理,包括如何通过GTID简化主从复制的搭建与故障转移过程,以及在连续性和数据一致性方面的保障。
1101

被折叠的 条评论
为什么被折叠?



