什么是GTID呢, 简而言之,就是全局事务ID(global transaction identifier ),最初由google实现,官方MySQL在5.6才加入该功能。
GTID是事务提交时创建分配的唯一标识符,给每个事务做一个唯一的编号,所有事务均与GTID一一映射。
MySQL5.7的GTID实现
首先搭建普通模式的主从
之后添加如下参数
gtid_mode = on
log-slave-updates = on
enforce-gtid-consistency = on
 
在线将GTID模式复制改为传统模式复制
1、将主库设置为read_only,查看复制的位置
(root@localhost) [(none)]> set @@global.read_only = on;
Query OK, 0 rows affected (0.00 sec)
(root@localhost) [(none)]> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000007 |      688 |              |                  | 766d5362-c923-11e6-85b5-000c29de38de:1-2 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)
2、在从库上关闭基于GTID模式的复制,调整为传统复制
(root@localhost) [(none)]> stop slave;
Query OK, 0 rows affected (0.00 sec)
(root@localhost) [(none)]> change master to master_auto_position=0,master_log_file='mysql-bin.000007',master_log_pos=688;
Query OK, 0 rows affected (0.01 sec)
(root@localhost) [(none)]> start slave;
Query OK, 0 rows affected (0.01 sec)
3、在每一台服务器上设置GTID模式为ON_PERMISSIVE
(root@localhost) [(none)]> set @@global.gtid_mode=on_permissive;
Query OK, 0 rows affected (0.01 sec)
4、在每一台服务器上设置GTID模式为OFF_PERMISSIVE
(root@localhost) [(none)]> set @@global.gtid_mode=off_permissive;
Query OK, 0 rows affected (0.02 sec)
5、等待所有的服务器上的变量@@global.gtid_owned为空,它表示正在由线程执行的全局GTID集合
6、等待所有的SLAVE上都复制完成匿名事务
7、在每一台服务器上关闭GTID
(root@localhost) [(none)]> set @@global.gtid_mode=off;
Query OK, 0 rows affected (0.02 sec)
8、修改配置文件,即使重启数据库,配置也是生效的
gtid_mode = off
enforce-gtid-consistency = off
9、将主库的read_only设置为off
 
在线将传统模式复制改为GTID模式复制
1、在每一台服务器上设置ENFORCE_GTID_CONSISTENCY=WARN
(root@localhost) [(none)]> set @@global.enforce_gtid_consistency=warn;
Query OK, 0 rows affected (0.00 sec)
这一步设置之后,使得所有事务都允许违反gtid的一致性,在进行下一步之前,需要确保在错误日志中无任何警告
2、在每一台服务器上设置ENFORCE_GTID_CONSISTENCY=ON
(root@localhost) [(none)]> set @@global.enforce_gtid_consistency=on;
Query OK, 0 rows affected (0.00 sec)
这步是确保所有的事务都不能违反GTID的一致性
3、在每一台服务器上设置GTID_MODE=OFF_PERMISSIVE
这步是新的事务是匿名的,同时允许复制的事务是GTID或匿名的
(root@localhost) [(none)]> set @@global.gtid_mode=off_permissive;
Query OK, 0 rows affected (0.04 sec)
4、在每一台服务器上设置GTID_MODE=ON_PERMISSIVE
(root@localhost) [(none)]> set @@global.gtid_mode=on_permissive;
Query OK, 0 rows affected (0.06 sec)
5、等待ONGOING_ANONYMOUS_TRANSACTION_COUNT状态值为0
在所有从库上查看
(root@localhost) [(none)]> show status like 'ongoing_anonymous_transaction_count';
+-------------------------------------+-------+
| Variable_name                       | Value |
+-------------------------------------+-------+
| Ongoing_anonymous_transaction_count | 0     |
+-------------------------------------+-------+
1 row in set (0.01 sec)
6、在每一台服务器上设置GTID_MODE=ON
(root@localhost) [(none)]> set @@global.gtid_mode=on;
Query OK, 0 rows affected (0.06 sec)
7、此时复制还是基于Binlog位置的,可以通过将选项MASTER_AUTO_POSITION设置为1,将复制调整为基于GTID模式的复制
(root@localhost) [(none)]> stop slave;
Query OK, 0 rows affected (0.00 sec)
(root@localhost) [(none)]> change master to master_auto_position=1;
Query OK, 0 rows affected (0.06 sec)
(root@localhost) [(none)]> start slave;
Query OK, 0 rows affected (0.00 sec)
8、修改配置文件,即使重启数据库,配置也是生效的
gtid_mode = on
enforce-gtid-consistency = on
 
利用GTID模式快速改变主从复制关系
现在的复制模型为201为主,202,203为201的从
需要调整为201为主,202为201的从,203为202的从
1、停止203的复制
(root@localhost) [(none)]> stop slave;
Query OK, 0 rows affected (0.00 sec)
2、调整203的复制关系,修改复制源为202节点
(root@localhost) [(none)]> change master to master_host='192.168.1.202',master_port=3306,master_auto_position=1;
Query OK, 0 rows affected (0.06 sec)
3、启动203的复制
(root@localhost) [(none)]> start slave;
Query OK, 0 rows affected (0.00 sec)
 

mysql.gtid_executed表:GTID持久化的介质,MySQL启动阶段会读取这个表来获取gtid_executed变量的值。

gtid_executed变量(show global variables):MySQL数据库已经执行了哪些GTID事务,处于内存中。show slave status中的executed_gtid_set也取自这里。

gtid_purged变量(show global variables):由于BINLOG文件的删除(如purge binary logfiles或者超过expire_logs_days设置)已经丢失的GTID事务,同时在搭建备库的我们使用set global gtid_purged变量来提示MySQL哪些GTID事务我已经执行过了。

 
 

GTID复制的更多相关文章

  1. MySQL5.7不停业务将传统复制变更为GTID复制

      由于GTID的优势,我们需要将传统基于file-pos的复制更改为基于GTID的复制,如何在线变更成为我们关心的一个点,如下为具体的方法: 目前我们有一个传统复制下的M-S结构: port 330 ...

  2. MariaDB的GTID复制和多源复制

    什么是GTID? GTID就是全局事务ID(global transaction identifier ),最初由google实现,官方MySQL在5.6才加入该功能.GTID实际上是由UUID+TI ...

  3. MariaDB GTID 复制同步

    MariaDB GTID 复制同步 GTID:Global Transaction ID,全局事务ID,在整个主从复制架构中任何两个事物ID是不能相同的.全局事务ID是Mster服务器生成一个128位 ...

  4. mysql之 MySQL 主从基于 GTID 复制原理概述

    一. 什么是GTID ( Global transaction identifiers ):MySQL-5.6.2开始支持,MySQL-5.6.10后完善,GTID 分成两部分,一部分是服务的UUid ...

  5. mysql之 mysql 5.6不停机主从搭建(一主一从基于GTID复制)

    环境说明:版本 version 5.6.25-log 主库ip: 10.219.24.25从库ip:10.219.24.22os 版本: centos 6.7已安装热备软件:xtrabackup 防火 ...

  6. GTID复制详解

    前言 GTID复制是MySQL 5.6后的新功能,在传统的方式里,主从切换后,需要找到binlog和POS点,然后执行命令change master to 指向新的主库.对于不是很有经验的人来说,往往 ...

  7. MySQL的GTID复制与传统复制的相互转换

    主库:192.168.225.128:3307从库1:192.168.225.129:3307 Gtid作为5.6版本以来的杀手级特性,却因为不支持拓扑结构内开关而饱受诟病.如果你需要从未开启GTID ...

  8. MySQL GTID复制Slave跳过错误事务Id以及复制排错问题总结

    GTID复制典型的复制错误有两种:1,数据对象级别的错误,包括主库上update的数据在从库上不存在,主从逐渐冲突,库表索引等对象的冲突等等,   如果是纯粹的跳过错误的话,这一类的错误需要跳过思路是 ...

  9. 深入MySQL复制(二):基于GTID复制

    相比传统的MySQL复制,gtid复制无论是配置还是维护都要轻松的多.本文对gtid复制稍作介绍. MySQL基于GTID复制官方手册:https://dev.mysql.com/doc/refman ...

  10. MySQL5.7 的GTID复制

    MySQL5.7 的GTID复制 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 在MySQL5.6之后其官方推出了GTID复制方式,和传统的基于bin log复制方式有所不同,接 ...

随机推荐

  1. 无法连接虚拟设备 ide1:0及上不网

    无法连接虚拟设备 ide1:0 问题: 启动vmware之后,发现出现无法连接 ide 1:0. 网络查找之后,发现是之前挂载的iso镜像找不到了. 原因: 我把iso镜像放到其他位置. 解决: 指定 ...

  2. Python2.x 里解决中文编码的万能钥匙

    注意: Python2.x默认编码环境是ASCII,当和取回的数据编码格式不一致时,可能会造成乱码:我们可以指定保存内容的编码格式,一般情况下,我们可以在代码最上方添加 import sys relo ...

  3. markdown简单的使用方法

    转自 https://www.cnblogs.com/math/p/se-tools-001.html 作者:正交分解 1.如何切换编辑器 切换博客园编辑器为MarkDown:MarkDown Edi ...

  4. fastadmin 全手动添加规则

    全手动的话 你需要在规则管理里面添加规则 然后角色组就可以设置权限了如果是自动的话 应该就都生成了权限设置 1.增删改查的规则也要添加哦 2.角色组勾选相应的规则 https://ask.fastad ...

  5. 【互联网运营P1】

    一.导论 [运营]是什么 二.运营的职业分工和职能发展 三.转化型文案 4个高转化率短文案的常见姿势 2个短文案写作的核心要则 中长型转化文案的写作 针对所有问题点依次进行详细解读 四.第三方推广 常 ...

  6. buildscript和allprojects的作用和区别是什么?

    在Android Studio的Project的build.gradle中, // Top-level build file where you can add configuration optio ...

  7. 在业务控制方法中收集List<JavaBean>参数

    @Controller @RequestMapping(value="/user") public class UserAction { @RequestMapping(value ...

  8. Nodejs源码系列

    一直想着看Nodej源码,断断续续的折腾了一下,但总串不起来,太久不看又忘记.决心每天看一点,特地记录在这里,作为逼迫自己的动力. 2019/09/22 一.源码编译 之前在电脑上了下源码,源码目录截 ...

  9. 线程池小结(JDK8)

    1.线程池的好处 降低资源消耗(重复利用已创建的线程减少创建和销毁线程的开销) 提高响应速度(无须创建线程) 提高线程的可管理性 2.相关类图 JDK5以后将工作单元和执行机制分离开来,工作单元包括R ...

  10. iis管理器的程序应用池中没有Asp.NET v4.0

    然后 windows + r 输入 cmd 然后输入CD C:\Windows\Microsoft.NET\Framework64\v4.0.30319 然后 输入 aspnet_regiis.exe ...