1、GTID介绍
GTID (Global Transaction ID): 是对于一个已提交事务的唯一编号, 并且是一个全局 (主从复制)唯一的编号它的官方定义如下:GTID = source_id: transaction_id7E11FA47-31CA-19E1-9E56-C43AA21293967:29什么是sever_uuid, 和server-id 区别?核心特性: 全局唯一, 具备幂等性
2、GTID核心参数
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
参数解释
gtid-mode=on : 启用gtid类型,否则就是普通的复制架构
enforce-gtid-consistency=true : 强制GTID的一致性
log-slave-updates=1 : slave更新是否记入日志
3、构建GTID主从
主库配置
default_authentication_plugin=mysql_native_password
server_id=16
log_bin=/data/3316/logs/mysql-bin
binlog_format=row
autocommit=0
secure-file-priv=""
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
从库配置
default_authentication_plugin=mysql_native_password
server_id=17
log_bin=/data/3317/logs/mysql-bin
binlog_format=row
autocommit=0
secure-file-priv=""
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
主库创建复制用户
mysql> create user 'slave'@'127.0.0.1' identified by '123';
mysql> grant replication slave on *.* to 'slave'@'127.0.0.1';
mysql> flush privileges;
从库change master to
CHANGE MASTER TO
MASTER_HOST='127.0.0.1',
MASTER_PORT=3316,
MASTER_USER='slave',
MASTER_PASSWORD='123',
MASTER_AUTO_POSITION=1;
从库 start slave
start slave;
4、GTID主从复制与传统基于二进制日志和position号复制的区别
GTID 复制不在需要
MASTER_LOG_POS=filename,
MASTER_CONNECT_RETRY=number;
MASTER_AUTO_POSITION=1;
从库会自动从当前GTID编号去请求主库当前GTID之后的binlog内容
1. 在主从复制环境中, 主库发生过的事务, 在全局都是由唯一GTID记录的, 更方便Failover
2. 额外功能参数, 3个GTID配置参数
3. change master to 的时候不再需要binlog 文件名和position号, MASTER_AUTO_POSITION=1;
4. 在复制过程中, 从库不再依赖master.info文件, 而是直接读取最后一个relaylog的GTID号
5. mysqldump备份时, 默认会将备份中包含的事务操作, 以以下方式
SET @@GLOBAL.GTID_PURGED='8c49d7ec-7e78-11e8-9638-000c29ca725d:1';
告诉从库, 我的备份中已经有以上事务, 你就不用运行了, 直接从下一个GTID开始请求binlog就行
5、基于备份恢复构建GTID主从
基于mysqldump备份恢复搭建GTID主从复制
#主库
--set-gtid-purged=ON: 必须设置ON, 会记录当前GTID编号
mysqldump -uroot -p123 -S /data/3316/mysql.sock -B test --master-data=2 --single-transaction --max_allowed_packet=64M -R -E --triggers --set-gtid-purged=ON > test.sql
#从库
reset master;
reset slave all;
CHANGE MASTER TO
MASTER_HOST='127.0.0.1',
MASTER_PORT=3316,
MASTER_USER='slave',
MASTER_PASSWORD='123',
MASTER_AUTO_POSITION=1;
start slave;
基于xtrabackup备份恢复搭建GTID主从复制
# 安装xbk
yum installhttps://repo.percona.com/yum/percona-release-latest.noarch.rpm -y
percona-release enable-only tools release
yum install percona-xtrabackup-80
# 全备
xtrabackup --defaults-file=/data/3316/my.cnf --host=127.0.0.1 --user=root --password=123 --port=3316 --no-timestamp --backup --target-dir=/data/backup/full
xtrabackup --prepare --target-dir=/data/backup/full
# 恢复
mkdir -p /data/backup/bak
cd /data/backup/full && mv mysql performance_schema/ sys/ /data/backup/bak
systemctl stop mysql3317
\cp -a /data/backup/full/* /data/3317/data/
systemctl stop mysql3317
reset master;
reset slave all;
# 设置当前GTID编号
SET @@GLOBAL.GTID_PURGED='c012bcc5-8d34-11eb-b069-000c2909345a:1-6';
# 启动主从
CHANGE MASTER TO
MASTER_HOST='127.0.0.1',
MASTER_PORT=3316,
MASTER_USER='slave',
MASTER_PASSWORD='123',
MASTER_AUTO_POSITION=1;
start slave;
6、GTID从库误写入操作处理
#查看监控信息
Last_SQL_Error: Error 'Can't create database 'oldboy'; database exists' on query. Default database: 'oldboy'. Query: 'create database oldboy'
Retrieved_Gtid_Set: 71bfa52e-4aae-11e9-ab8c-000c293b577e:1-3
Executed_Gtid_Set: 71bfa52e-4aae-11e9-ab8c-000c293b577e:1-2,
7ca4a2b7-4aae-11e9-859d-000c298720f6:1
#注入空事物的方法
stop slave;
set gtid_next='99279e1e-61b7-11e9-a9fc-000c2928f5dd:3';
begin;commit;
set gtid_next='AUTOMATIC';
这里的xxxxx:N 也就是你的slave sql thread报错的GTID, 或者说是你想要跳过的GTID
最好的解决方案: 重新构建主从环境