第1章 GTID介绍
1.1 什么是GTID
GTID(Global Transaction ID)是对于一个已提交事务的唯一编号,并且是一个全局(主从复制)唯一的编号
1.2 GTID的组成
GTID是由server_id:transaction_id
server_uuid是MySQL Server的只读变量,保存在数据目录下的auto.cnf中,可直接通过cat命令查看
transaction_id,同一个server_uuid下的transaction_id一般是递增的。如果一个事务是通过用户线程执行,那么MySQL在生成的GTID时,会使用它自己的server_uuid,然后再递增一个transaction_id作为该事务的GTID
例如:
GTID = source_id :transaction_id
7E11FA47-31CA-19E1-9E56-C43AA21293967:29
第2章 GTID主从复制原理
1.1 基于主从复制的原理
1. 当一个事务在主库执行并提交时,产生GTID并一同记录到binlog日志中
2. binlog传输到从库后,并存储到从库的relay-log后,读取这个GTID的值并设置gtid_next,即告诉从库,下一个 要执行的GTID值
3. SQL线程从relay-log中获取GTID,然后对比从库是否有该GTID
4. 如果有,说明该GTID已经执行,从库会忽略
5. 如果没有,从库会执行该GTID的事务,并记录到自身的binlog中
第3章 GTID核心参数介绍
1.1 核心参数
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
1.2 核心参数说明
gtid-mode=on #启用gtid类型,否则就是普通的复制架构
enforce-gtid-consistency=true #强制GTID的一致性
log-slave-updates=1 #强制从库记录主库二进制日志,而不是记录自己的二进制日志
第4章 GTID复制的搭建
1.1 规划
主库
ip:10.0.1.27
port: 3306
server_id 27
软件目录 /soft
数据目录 /data
二进制日志目录 /data/binlog
错误日志目录 /data/error
从库1
ip:10.0.1.28
port: 3306
server_28
软件目录 /soft
数据目录 /data
二进制日志目录 /data/binlog
错误日志目录 /data/error
从库2
ip:10.0.1.28
port: 3306
server_id 29
软件目录 /soft
数据目录 /data
二进制日志目录 /data/binlog
错误日志目录 /data/error
1.2 创建相应的目录并授权
主库
mkdir /soft
mkdir /data/mysql/data -p
mkdir /data/binlog
mkdir /data/error
chown -R mysql:mysql /data/*
从库1
mkdir /soft
mkdir /data/mysql/data -p
mkdir /data/binlog
mkdir /data/error
chown -R mysql:mysql /data/*
从库2
mkdir /soft
mkdir /data/mysql/data -p
mkdir /data/binlog
mkdir /data/error
chown -R mysql:mysql /data/*
1.4 编写配置文件
主库
vim /etc/my.cnf
#服务端
[mysqld]
user=mysql
#软件安装路劲
basedir=/soft/mysql5726
#数据路劲
datadir=/data/mysql/data
#服务端socket文件位置
socket=/tmp/mysql.sock
#服务器ID号
server_id=27
#二进制日志
log_bin=/data/binlog/mysql-bin
#错误日志路劲
log_error=/data/error/mysql.log
log_timestamps=system
#端口号
port=3306
#GTID
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
#客户端
[mysql]
#客户端socket文件位置
socket=/tmp/mysql.sock
从库1
vim /etc/my.cnf
#服务端
[mysqld]
user=mysql
#软件安装路劲
basedir=/soft/mysql5726
#数据路劲
datadir=/data/mysql/data
#服务端socket文件位置
socket=/tmp/mysql.sock
#服务器ID号
server_id=28
#二进制日志
log_bin=/data/binlog/mysql-bin
#错误日志路劲
log_error=/data/eror/mysql.log
log_timestamps=system
#端口号
port=3306
#GTID
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
#客户端
[mysql]
#客户端socket文件位置
socket=/tmp/mysql.sock
从库2
vim /etc/my.cnf
#服务端
[mysqld]
user=mysql
#软件安装路劲
basedir=/soft/mysql5726
#数据路劲
datadir=/data/mysql/data
#服务端socket文件位置
socket=/tmp/mysql.sock
#关闭自动提交机制
autocommit=0
#服务器ID号
server_id=29
#二进制日志
log_bin=/data/binlog/mysql-bin
#二进制日志记录模式
binlog_format=row
#错误日志路劲
log_error=/data/error/mysql.log
log_timestamps=system
#端口号
port=3306
#GTID
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
#客户端
[mysql]
#客户端socket文件位置
socket=/tmp/mysql.sock
1.5 编写启动脚本
vim /etc/systemd/system/mysqld.service
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/soft/mysql5726/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000
1.6初始化数据
三台机器都执行
mysqld --initialize-insecure --user=mysql --basedir=/soft/mysql5726 --datadir=/data/mysql/data
1.7启动数据库
三台机器都执行
systemctl start mysqld
1.8 构建主从
主库创建复制用户并授权
grant replication slave on *.* to repl@'10.0.1.%' identified by '123';
从库构建主关系(2台从库都执行)
change master to
master_host='10.0.1.27',
master_user='repl',
master_password='123' ,
MASTER_AUTO_POSITION=1;
开启线程(2台从库都执行)
start slave
1.8.1构建主从注意事项
这里是测试环境,因为没有数据,所有没有备份主库的数据在来导入从库,
实际生产中,要先备份主库的数据,然后在导入到从库
搭建GTID复制备份主库的数据时需要特别注意的事项,一定要确保--set-gtid-purged=on 或者不加(默认是开启的)
原因:
如果这个参数是--set-gtid-purged=off 从库导入数据的时候没有问题,但是IO线程去请求主库新的binlog信息,会把主库所有的binlog信息请求过来,当SQL线程回放的时候,会发现已经导入的数据有了,现在又要重新回放,这样就会导致GTID复制搭建不成功了
主库备份时加入这个参数目录就是为了告诉IO线程,从多少号开启请求从库没有的数据
第5章 GTID复制和普通复制的区别
CHANGE MASTER TO
MASTER_HOST='10.0.1.27',
MASTER_USER='repl',
MASTER_PASSWORD='123',
MASTER_PORT=3307,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=444,
MASTER_CONNECT_RETRY=10;
change master to
master_host='10.0.1.27',
master_user='repl',
master_password='123' ,
MASTER_AUTO_POSITION=1;
start slave;
(0)在主从复制环境中,主库发生过的事务,在全局都是由唯一GTID记录的,更方便Failover
(1)额外功能参数(3个)
(2)change master to 的时候不再需要binlog 文件名和position号,MASTER_AUTO_POSITION=1;
(3)在复制过程中,从库不再依赖master.info文件,而是直接读取最后一个relaylog的 GTID号
(4) mysqldump备份时,默认会将备份中包含的事务操作,以以下方式
SET @@GLOBAL.GTID_PURGED='8c49d7ec-7e78-11e8-9638-000c29ca725d:1';
告诉从库,我的备份中已经有以上事务,你就不用运行了,直接从下一个GTID开始请求binlog就行。