文章目录

  • GTID复制
  • GTID简介
  • GTID相关的配置参数
  • GTID主从配置
  • GTID在主从模式下故障的处理
  • GTID主从复制和普通主从复制的一些区别


GTID复制

GTID简介

GTID(global transaction identifier)全称全局事务ID号,也是在MySQL中事务唯一的标识号,这个GTID不管是在主库还是在从库,号码都是唯一的。
GTID的格式:

gtid由source_id和transaction_id构成
source_id其实就是数据库实例的唯一UUID,来证明这个库的唯一性
transaction_id则就是这个库的事务编号
一般表现为:ae544f46-6533-11ea-92a6-000c29c2a58c:1

GTID相关的配置参数

gtid_mode=on					开启GTID
enforce-gtid-consistency=true	强制GTID一致性
log-slave-updates=1				使配置这个参数的从库也生成自己的binlog
log-bin=/opt/mysql-replication/mysql3310/binlog/mysql-bin

GTID主从配置

一、准备好三台虚拟机,或者三个数据库实例
1、进行配置文件的内容配置
db01(master)

cat > /etc/my.cnf <<EOF
[mysqld]
basedir=/opt/mysql-basedir/mysql
datadir=/opt/mysql-data/mysql
socket=/tmp/mysql.sock
server_id=1
port=3306
secure-file-priv=/tmp
autocommit=0
log_bin=/opt/mysql-data/mysql/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=hdfeng01 [\\d]>
EOF
[root@hdfeng mysql]# chown -R mysql.mysql *

db02(slave1)

cat > /etc/my.cnf <<EOF
[mysqld]
basedir=/opt/app/mysql
datadir=/opt/data/mysql
socket=/tmp/mysql.sock
server_id=2
port=3306
secure-file-priv=/tmp
autocommit=0
log_bin=/opt/data/mysql/binlog/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=hdfeng02 [\\d]>
EOF
[root@hdfeng mysql]# chown -R mysql.mysql *

db03(slave2)

cat > /etc/my.cnf <<EOF
[mysqld]
basedir=/opt/app/mysql
datadir=/opt/data/mysql
socket=/tmp/mysql.sock
server_id=3
port=3306
secure-file-priv=/tmp
autocommit=0
log_bin=/opt/data/mysql/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=hdfeng03 [\\d]>
EOF
[root@hdfeng mysql]# chown -R mysql.mysql *

配置完成以后每个库进行初始化

mysqld --initialize-insecure --user=mysql --basedir=/opt/app/mysql  --datadir=/opt/data/mysql

启动

systemctl start mysqld

hdfeng01(master)创建复制帐户

grant replication slave on *.* to 'repl'@'192.168.%.%' identified by '123';

hdfeng02(slave1)/hdfeng03(slave2)进行数据库内配置

change master to 
master_host='192.168.xx.xx',
master_user='repl',
master_password='123',
MASTER_AUTO_POSITION=1;		自动寻找pos号

start slave;

说明一下master_auto_position这个参数,这个参数是会自己去找你主库的position号。
原理:
1、首先IO_thread会去读取relaylog中的gtid号
2、读到以后比如说是5,然后IO_thread会向dump线程要第6个GTID的事务数据
3、如果是全新的从库,从库relaylog是空的,io会直接向主库请求他没有的GTID事务
4、还有–set-gtid-purged=OFF/ON这个备份的配置特别要注意,off是不在配置文件中添加GTID号,在导入的从库中会重新生成GTID号,这样做主从的话就会报错,因为在从库重新生成的GTID肯定和主库的GTID不对应,就会报错。因此这个参数在主从环境下的备份必须使用–set-gtid-purged=on,会把相应的GTID号也备份在备份文件中。

GTID在主从模式下故障的处理

首先,如果sql线程在从库发生了操作,主库过来的这个事务对应的刚好是这个操作,那这个操作就会执行失败,导致SQL线程报错。所以有一种注入空事务的方法,但是这种方法有隐患。例:可能这个操作是个建库操作,但是这两个库的字符编码不一样,这样在主库中会根据插不进去,或者插进去从库根本没有数据。

注入空事务的方法

stop slave;
set gtid_next='c9317d28-6742-11ea-b987-000c29b6e0ec:xxxx';
begin;commit;
set gtid_next='AUTOMATIC';

第二条命令中xxxx就是你要做空事务的GTID号,而且GTID号不能有跳过这种操作,就是号码不能断开,必须得有号码。

GTID主从复制和普通主从复制的一些区别

普通主从:

change master to 
master_host='192.168.28.78',
master_user='repl',
master_password='123',
master_port=3306,
master_log_file='mysql-bin.000001',
master_log_pos=154,
master_connect_retry=10;
start slave;

GTID主从:

change master to 
master_host='192.168.28.78',
master_user='repl',
master_password='123',
master_auto_position=1;
start slave;