一.什么是GTID
GTID(Global Transaction ID)全局事务标识符:是一个唯一的标识符,它创建并与源服务器(主)上提交的每个事务相关联。
此标识符不仅对其发起的服务器是唯一的,而且在给定复制设置中的所有服务器上都是唯一的。 所有交易和所有GTID之间都有1对1的映射。
GTID实际上是由UUID+TID组成的。其中UUID是一个MySQL实例的唯一标识。TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增。
下面是一个GTID的具体形式:
它的官方定义如下:
GTID = source_id :transaction_id
3E11FA47-71CA-11E1-9E33-C80AA9429562:23
什么是sever_uuid,和Server-id 区别?
source_id 也叫uuid 默认在是第一次启动数据库时,自动生成的
/application/mysql/data/auto.cnf
手工删除掉此文件,重启数据库,可以生成新的。
二.GTID新特性
(1).支持多线程复制:事实上是针对每个database开启相应的独立线程,即每个库有一个单独的(sql thread).
(2).支持启用GTID,在配置主从复制,传统的方式里,你需要找到binlog和POS点,然后change master to指向.
在mysql5.6里,无须再知道binlog和POS点,只需要知道master的IP/端口/账号密码即可,因为同步复制是自动的,MySQL通过内部机制GTID自动找点同步.
(3).基于Row复制只保存改变的列,大大节省Disk Space/Network resources和Memory usage.
(4).支持把Master 和Slave的相关信息记录在Table中
原来是记录在文件里,记录在表里,增强可用性
(5).支持延迟复制
基于GTID复制构建过程(3307主,3308从)
1、更新参数文件
vim /data/3307/my.cnf
添加:
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
去掉复制过滤功能!!!!
vim /data/3308/my.cnf
添加:
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
2、删除历史数据
pkill mysqld
rm -rf /data/3307/data/*
rm -rf /data/3307/mysql-bin*
rm -rf /data/3308/data/*
rm -rf /data/3308/mysql-bin*
3、重新初始化数据
mv /etc/my.cnf /etc/my.cnf.bak ----》如果有就mv一下,没有的话就不做
/application/mysql/scripts/mysql_install_db --user=mysql --basedir=/application/mysql --datadir=/data/3307/data/
/application/mysql/scripts/mysql_install_db --user=mysql --basedir=/application/mysql --datadir=/data/3308/data/
修改目录权限
[root@db01 3307]# touch /data/330{7..8}/mysql.log
[root@db01 3307]# chown -R mysql.mysql /data/330*
启动多实例
mysqld_safe --defaults-file=/data/3307/my.cnf &
mysqld_safe --defaults-file=/data/3308/my.cnf &
4、构建主从
(1)主库创建用户:
mysql -S /data/3307/mysql.sock
grant replication slave on *.* to repl@'10.0.0.%' identified by '123';
(2)备份主库数据
mysqldump -S /data/3307/mysql.sock -A -R --triggers --master-data=2 --single-transaction >/tmp/full.sql
(3)开启主从
mysql -S /data/3308/mysql.sock
mysql> CHANGE MASTER TO
MASTER_HOST='10.0.0.51',
MASTER_USER='repl',
MASTER_PASSWORD='123',
MASTER_PORT=3307,
MASTER_AUTO_POSITION = 1;
mysql> start slave;
-----------------------------
GTID 从库误写入操作 处理
注入空事物的方法:
stop slave;
set gtid_next='8c49d7ec-7e78-11e8-9638-000c29ca725d:2';
begin;commit;
set gtid_next='AUTOMATIC';
start slave;
这里的xxxxx:N 也就是你的slave sql thread报错的GTID,或者说是你想要跳过的GTID。
最好的解决方案:重新构建主从环境
----------------------------
GTID 复制和普通复制的区别
(0)在主从复制环境中,主库发生过的事务,在全局都是由唯一GTID记录的,更方便Failover
(1)额外功能参数(3个)
(2)change master to 的时候不再需要binlog 文件名和position号
(3)在复制过程中,从库不再依赖master.info文件,而是直接读取最后一个relaylog的 GTID号
(4) mysqldump备份时,默认会将备份中包含的事务操作,以以下方式
SET @@GLOBAL.GTID_PURGED='8c49d7ec-7e78-11e8-9638-000c29ca725d:1';
告诉从库,我的备份中已经有以上事务,你就不用运行了,直接从下一个GTID开始请求binlog就行。