GTID实现主从复制数据同步
GTID是一个基于原始mysql服务器生成的一个已经被成功执行的全局事务ID,它由服务器ID以及事务ID组成,这个全局事务ID不仅仅在原始服务器上唯一,在所有主从关系的mysql服务器上也是唯一的。正式因为这样一个特性使得mysql主从复制变得更加简单,以及数据库一致性更可靠。
介绍
GTID的概念
全局事务标识:global transaction identifiers
GTID是一个事务一一对应,并且全局唯一ID
一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱不一致
不再使用传统的MASTER_LOG_FILE+MASTER_LOG_POS开启复制,而是采用MASTER_AUTO_POSTION=1的方式开启复制。
从MYSQL-5.6.5及后续版本开始支持
GTID的组成
GTID = server_uuid:transaction_id
server_uuid:mysql服务器的唯一标识,查看方法mysql客户端内:show variables like '%server_uuid%';
transaction_id:此id是当前服务器中提交事务的一个序列号,从1开始自增长,一个数值对应一个事务
GTID号示例:c9fba9e2-db3b-11eb-81d4-000c298d8da1:1-5
GTID的优势
实现主从更简单,不用像以前一样寻找log_file和log_pos
比传统的主从更加安全
GTID是连续没有空洞的,保证数据一致性,零丢失。
GTID工作原理
master更新数据时,会在事务前产生GTID,一同记录到binlog日志中
slave端的I/O线程将变更的binlog,写入到本地的relay log中
SQL线程从relay log中获取GTID,然后对比slave端的binlog是否有记录(所以MySQL5.6 slave端必须开启binlog)
如果有记录,说明该GTID的事务已经执行,slave会忽略
如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog
在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描
开始配置GTID复制
主:192.168.152.253 Centos7
从:192.168.152.252 Centos8
测试数据库:vfan
测试表:student
1、修改mysql服务配置文件,添加以下参数,随后重启:
server-id=100 #server idlog-bin=/var/lib/mysql/mysql-bin #开启binlog并指定存储位置
expire_logs_days=10#日志保存时间为10天
gtid_mode=on #gtid模块开关
enforce_gtid_consistency=on #启动GTID强一致性,开启gtid模块必须开启此功能。
binlog_format=row #bin_log日志格式,共有三种STATEMENT、ROW、MIXED;默认为STATEMENT
skip_slave_start=1 #防止复制随着mysql启动而自动启动
主服务器和从服务器的配置一致即可,server-id更改一下
2、在主服务器中创建从服务器连接的用户
CREATE USER 'copy'@'192.168.152.252' IDENTIFIED BY 'copy';
GRANT REPLICATION SLAVE ON*.* TO 'copy'@'192.168.152.252';
flush privileges;
创建完毕记得要测试下slave机是否能登录成功
3、使用mysqldump使两数据库数据同步
主mysql执行:
mysqldump-uroot -proot1 vfan >dump2.sqlscp dump2.sql 192.168.152.252:/data/从mysql执行:
mysql> source /data/dump2.sql
当前主、从服务器数据内容一致,都是以下数据:
mysql> select *from student;+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | Tony | 18 |
| 2 | Any | 17 |
| 3 | Goy | 20