四十二、GTID复制

GTID复制介绍

全称 Global Transaction ID
GTID会对每个已提交的事务提供一个唯一的编号,用于区分不同事务,可用于备份恢复,DUMP并发传输,SQL线程并发回放等。

5.6版本默认没有开启。
5.7版本默认没有开启也有类似于GTID的功能。

官方定义如下
GTID = source_id :transaction_id
例如:7E11FA47-31CA-19E1-9E56-C43AA21293967:29

source_id:
也就是server_uuid,用于取代server_id,是MySQL首次启动自动生成的一个128位全局唯一的一串字符,保存在data/auto.cnf文件中,用于标识一个MySQL数据库实例。

transaction_id:
从1开始自增的序号,表示这个主库执行的第n个事务。

server_id:
是手工配置在my.cnf文件中的参数,用于表示mysql实例

GTID相关参数

重要参数

gtid-mode=on #开启gtid复制模式
enforce-gtid-consistency=true #强制GTID的一致性
log-slave-updates=1 #让slave更新binlog日志

案例

环境如下:
主库:master 10.154.0.111
从库1:slave1 10.154.0.112
从库2:slave2 10.154.0.113

为了保证实验环境不受其他因素干扰,先删除从库原来的数据,重新构建主从,生产环境最好做好备份。

1、如果原来开启了MySQL,需要关闭

#关闭的几种方式
$ /etc/init.d/mysqld stop
$ pkill mysql
$ pkill mysqld

$ ps -ef | grep mysql
$ kill -9 xxxx

2、删除data/目录下的文件

$ rm -rf /usr/local/mysql/data

3、配置/etc/my.cnf

#master配置文件
cat > /etc/my.cnf <<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
server_id=111
port=3306
secure-file-priv=/tmp
autocommit=0
log_bin=/data/binlog/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=master [\\d]> #这个标签可替换mysql> 样式,用了就知道
EOF

#slave1配置文件
cat > /etc/my.cnf <<EOF
...
server_id=112
...
[mysql]
prompt=slave1 [\\d]>
EOF

#slave2配置文件
cat > /etc/my.cnf <<EOF
...
server_id=113
...
[mysql]
prompt=slave2 [\\d]>
EOF

4、初始化数据

$ mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql  --datadir=/usr/local/mysql/data

5、启动数据库

/etc/init.d/mysqld start

6、构建主从

#在主库master创建授权复制用户
mysql> grant replication slave  on *.* to repl@'10.154.0.%' identified by '123';

#备份主库,注意不能加--set-gtid-purged=OFF参数,后续会说明
$ mysqldump -A -B  |gzip >/backup/full20210414.sql.gz

#复制到从库中
$ scp -rp /backup/full20210414.sql.gz root@10.154.0.112:/backup
$ scp -rp /backup/full20210414.sql.gz root@10.154.0.113:/backup

#恢复数据
$ gzip -d full20210414.sql.gz
$ mysql < /backup/full20210414.sql

#在slave1跟slave2中更改change master to
mysql> change master to 
master_host='10.154.0.111',
master_user='repl',
master_password='123',
master_port=3306,
MASTER_AUTO_POSITION=1;

mysql> start slave;

GTID开启主从复制无需在从库的change master to中写binlog日志名,跟pos号。

--set-gtid-purged参数说明
默认值为AUTO,会在备份里插入如下标记,方便从库恢复数据后从哪里开始进行gtid复制,如果为OFF,则从库恢复完成后会从头开始请求主库的GTID。
SET @@GLOBAL.GTID_PURGED='3d111a50-9355-11eb-b573-000c29a2912e:1-6;

MASTER_AUTO_POSITION=1参数说明
读取relaylog最后一个事务GTID,然后向主库索取新的GTID事务。

7、验证

#主库
mysql> show master status;
3d111a50-9355-11eb-b573-000c29a2912e:1-3

#从库
mysql> show slave status\G;
...
Retrieved_Gtid_Set: 3d111a50-9355-11eb-b573-000c29a2912e:1-3 #已经接收到的GTID事务
Executed_Gtid_Set: 3d111a50-9355-11eb-b573-000c29a2912e:1-3, #已经执行到的GTID事务

可以从上述,清楚的看到接收到的GTID事务编号,执行了多少等,精确到每个事务。

GTID跳过事务冲突

因为GTID是连续的,不允许空缺的,所以不能简单的skip掉冲突的事务,只能通过注入空事务替换掉冲突的事务。

stop slave;
set gtid_next='3d111a50-9355-11eb-b573-000c29a2912e:3'; #这里为报错的GTID号,也就是想跳过的GTID号
begin;commit; #写入空事务替换
set gtid_next='AUTOMATIC'; #自动比较GTID,恢复继续进行
start slave;

GTID复制优点

1、保证事务全局统一,每个事务都对应一个号码
2、截取日志方便,判断起点终点方便
3、直观看到主从工作状态,是否延时,卡在了哪个事务上
4、并发传输binlog,并发SQL回放
5、主从复制构建很方便,不再需要binlog文件名,pos号,只需要MASTER_AUTO_POSITION=1


学习来自:B站课程:GTID复制 P139-143,《MySQL入门与提高实践》第17章

posted @ 2021-04-14 17:26  努力吧阿团  阅读(109)  评论(0编辑  收藏  举报