什么是MySQL GTID ?
MySQL GTID(Global Transaction Identifier)是MySQL
5.6版本引入的一种全局事务标识符,用于唯一标识一个事务,并确保事务在主从复制中的一致性。
原理
GTID的原理
是通过在主库上为每个事务分配一个全局唯一的标识符。每个GTID由以下三个部分组成:源服务器的唯一标识符(server_uuid)、事务序号(transaction_id),以及集群名称(gtid_domain_id)。这个标识符会随着事务的提交被写入二进制日志,并被主库和从库的服务器记录和追踪。
GTID的作用:
主从切换
:使用GTID可以简化主从切换的过程,从库可以通过GTID自动找到上一次复制的位置,从而无需手动指定二进制日志文件和偏移量。
数据一致性
:GTID保证了主从复制的数据一致性。主库上的每个事务都被唯一标识,从库会根据GTID进行复制,避免了重复复制或跳过复制的情况。
简化拓扑
:使用GTID,可以更轻松地改变主从复制的拓扑结构,比如添加或移除从库,而无需重新设置复制位置。
搭建过程
1,准备两台虚拟机,自行规划谁是主,谁是从,并安装mysql (此处省略)
2,在主库创建一个同步账户授权给从数据库使用
grant replication slave on *.* to 'sync'@'%' identified by 'HGHnice_666';
flush privileges;
3,修改主库my.cnf配置文件
[mysqld]
port=3306
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
skip-name-resolve
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
skip-name-resolve
log-bin=mysql-bin #开启二进制日志
server-id=11 #服务器ID,必须唯一
gtid-mode=on #开启gtid模式
enforce-gtid-consistency=on #强制gtid一致性,开启后对特定的create table不支持
binlog-format=row #默认为mixed混合模式,更改成row复制,为了数据一致性
log-slave-updates=1 #从库binlog记录主库同步的操作日志
skip-slave-start=1 #跳过slave复制线程
binlog-ignore-db=mysql
#lower_case_table_names=1
4,重启主库的mysql
systemctl restart mysqld
5,查看主库gtid开启状态
mysql> show variables like "%GTID%";
6,配置从库的my.cnf文件
[mysqld]
port=3306
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
skip-name-resolve
log-bin=mysql-bin #启用二进制日志,将日志文件保存为 mysql-bin
server-id=12
gtid-mode=on #开启gtid
enforce-gtid-consistency=on #强制要求在复制过程中严格遵守GTID的一致性,确保数据一致性。
binlog-format=row #设置二进制日志的格式为行级别的格式,以记录每个事务中具体执行的行变更。
log-slave-updates=1 #允许从服务器将接收到的更新事务写入自身的二进制日志文件,用于级联复制中的中继服务器。
skip-slave-start=1
#lower_case_table_names=1
7,重启从库的mysql
systemctl restart mysqld
8,查看gtid的状态
mysql> show variables like "%GTID%";
9,开启主从同步(下面的命令是在从库上执行)
mysql> stop slave;
mysql> change master to
master_host='192.168.10.201',
master_user='sync',
master_password='HGHnice_666',
master_auto_position=1;
mysql> start slave;
使用GTID方式同步的时候,必须指定master_auto_position=1
GTID使用master_auto_position=1代替了基于binlog和position号的主从同步方式,更便于主从同步的搭建
mysql> show slave status\G
看见两个yes,则表示搭建成功(如果显示为no,确保命令是在从库执行,并且配置了防火墙规则,或者之间关闭防火墙)