Ⅰ、GTID的介绍

  • global transaction id identifier 全局事务id
  • gtid = server_uuid + transaction_id
  • server_uuid是全局唯一的,5.6开始才有,表示当前实例的uuid,保存在数据目录中的auto.conf文件中
  • transaction_id是自增的
  • gtid的作用是替代filename + position

主:show master status;

(root@localhost) [test]> show master status;
+------------+----------+--------------+------------------+----------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------+----------+--------------+------------------+----------------------------------------+
| bin.000006 | 408 | | | d565cde8-0573-11e8-89b2-525400a4dac1:1 |
+------------+----------+--------------+------------------+----------------------------------------+
1 row in set (0.00 sec)
Executed_Gtid_set:server_id:1-xxxx     表示产生了xxx个事务 从:show master status;
Retrieved_Gtid_Set: d565cde8-0573-11e8-89b2-525400a4dac1:1
Executed_Gtid_Set: d565cde8-0573-11e8-89b2-525400a4dac1:1
也能看到事务号

tips:

如果做了A和B做了双主,B上一直在同步A上数据,这时候在B上写入一个事务

A上看下Executed_Gtid_set,会发现有两个值

一个是自己做主当前的事务号,一个是同步的从上的事务号

Ⅱ、GTID的意义

之前的复制基于(file,pos),当主从发生宕机,切换的时候有问题

slave保存的是原master上的(file,pos),无法直接指向新master上的(file,pos)

mha通过relay log来判断(非常有技术性)

gtid实现了真正的全局唯一位置(所有机器上都是统一的)

更容易进行failover操作

举例:

a是master,b c d是slave,a挂了,b做主,c d做change master

此时c d 上的pos却还是a上面的pos,和b没有对应关系,文件名,文件大小,position完全不一样,change不起来

使用gtid的话,b上保存着c和d回放的位置G_a、G_b(b是通过选举出来的,保存着最多的日志)

Ⅲ、gtid配置

[mysqld]
log_bin
gtid_mode = ON
enforce_gtid_consistency = ON
log_slave_updates = 1 5.6必须开,5.7可以不开

tips:

  • MySQL5.6必须开启参数log_slave_updates,5.7.6开始无需配置
  • MySQL5.6升级到gtid模式需要停机重启
  • MySQL5.7.6版本开始可以在线升级gtid模式
  • 5.6中gtid用的比较少,最重要的原因在于gtid要么开要么不开,不能做到非gtid升级到gtid
  • gtid是一切高可用基础(gr,mha),强烈建议打开,5.6就有了,很成熟了
5.7的gtid_mode可选值
ON 完全打开GTID,如果打开状态的备库接受到不带GTID的事务,则复制中断
ON_PERMISSIVE 可以认为是打开gtid前的过渡阶段,主库在设置成该值后会产生GTID,同时备库依然容忍带GTID和不带GTID的事务
OFF_PERMISSIVE 可以认为是关闭GTID前的过渡阶段,主库在设置成该值后不再生成GTID,备库在接受到带GTID和不带GTID事务都可以容忍
主库在关闭GTID时,执行事务会产生一个Anonymous_Gtid事件,会在备库执行:set @@session.gtid_next='anonymous'
OFF 彻底关闭GTID,如果关闭状态的备库收到带GTID的事务,则复制中断
之前只有ON和OFF 平滑开启gtid
set global gtid_mode = 'off_permissive';
set global gtid_mode = 'on_permissive';
set global enforce_gtid_consistency = 'on';
set global gtid_mode = 'ON'; 平滑关闭gtid
stop slave;
set global gtid_mode = 'on_permissive';
set global gtid_mode = 'off_permissive';
change master to master_auto_position = 0;
set global gtid_mode = 'OFF';
set global enforce_gtid_consistency = 'off';
start slave; 主从上都依次敲下来

Ⅳ、简单说下搭建过程

大同小异,全备+binlog

开启gtid后,mysqldump备份单库时会报warning,意思是gtid包含所有事务,只备份了单库,忽略即可

用mydumper备份,看下metadata文件,找到gitd:xxxxxx:x-xxx

这玩意等同于mysqldump备份文件中set @@global.gtid_purged='xxxx:x-xxx';

表示这部分gtids对应的事务已经在备份中了,slave在还原备份后复制时,需要跳过这些gtids

reset master;   清空@@GLOBAL.GTID_EXECUTED,不然执行下一步会报错
SET @@GLOBAL.GTID_PURGED = '找出来的位置'
以上操作mysqldump出来的文件导入无需操作,mydumper要手动,因为myloader不执行这个 最后一把change master送给大家
change master to master_host='127.0.0.1', master_port=3306, master_user='rpl', master_password='123', MASTER_AUTO_POSITION=1;
start slave;

tips:

  • binlog文件中会有两个关于gtid的event——Previous_gtids和Anonymous_Gtid
  • 通过扫描binlog中的gtid值,可以知道gtid与filename-pos的对应关系,如果binlog很大,扫描量也很大,所以用Previous_gtid来记录之前一个binlog文件中最大的gtid
  • 如果要找的gtid比previous_gtids大,就扫描当前文件,反之扫之前的文件,依次类推
  • binlog在rotate的时候,是知道当前最大gtid的,将该值,写入下个binlog的文件头,即Previous_gtids

Ⅴ、GTID复制中处理报错小技巧

这里模拟一个1062错误即可,不演示

报错会告诉你对应的gtid

操作步骤如下:

  • 我们将gtid_next指向报错的gtid

报错中没有gtid,则用Retrieved_Gtid_Set和Executed_Gtid_Set对比一下就知道哪个事务执行出错了

(root@localhost) [(none)]> set gtid_next='xxxxxx:xxxx';  # 设置为之前失败的那个GTID的值
Query OK, 0 rows affected (0.00 sec)
  • 执行一个空事务
(root@localhost) [(none)]> begin;commit;
Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec)
  • 将gtid_next还原为automatic
(root@localhost) [(none)]> set gtid_next="automatic";
Query OK, 0 rows affected (0.00 sec) (root@localhost) [(none)]> stop slave;
Query OK, 0 rows affected (0.01 sec)
(root@localhost) [(none)]> start slave;
Query OK, 0 rows affected (0.07 sec)

该操作类似于sql_slave_skip_counter,只是跳过错误,不能保证数据一致性,需要人工介入,固强烈建议从机开启read_only=1

Ⅵ、GTID的限制

  • 在开启GTID后,不能在一个事物中使用创建临时表的语句
  • 在开启GTID后,不能使用create table select ... 的语法来创建表了,因为这其实是多个事物了,GTID没法对应

基于gtid的复制的更多相关文章

  1. MYSQL 基于GTID的复制

    1.概述 从MYSQL5.6 开始,mysql开始支持GTID复制. 基于日志点复制的缺点: 从那个二进制日志的偏移量进行增量同步,如果指定错误会造成遗漏或者重复,导致数据不一致. 基于GTID复制: ...

  2. MySQL5.7配置基于GTID的复制

    MySQL5.7下配置GTID复制的方法: 修改主库和从库的配置文件,加入下列部分的配置项:主库:[mysqld]log-bin=mysql-binbinlog_format= ROWgtid-mod ...

  3. 详解MySQL主从复制实战 - 基于GTID的复制

    基于GTID的复制 简介 基于GTID的复制是MySQL 5.6后新增的复制方式. GTID (global transaction identifier) 即全局事务ID, 保证了在每个在主库上提交 ...

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

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

  5. Mysql基于GTID复制模式-运维小结 (完整篇)

    先来看mysql5.6主从同步操作时遇到的一个报错:mysql> change master to master_host='192.168.10.59',master_user='repli' ...

  6. 5.7 并行复制配置 基于GTID 搭建中从 基于GTID的备份与恢复,同步中断处理

    5.7 并行复制配置 基于GTID 搭建中从 基于GTID的备份与恢复,同步中断处理 这个文章包含三个部分 1:gtid的多线程复制2:同步中断处理3:GTID的备份与恢复 下面文字相关的东西 大部分 ...

  7. Mysql基于GTID主从复制

    Mysql5.6基于GTID全局事务的复制 什么是GTID?   GTID(Global Transaction Identifiers)是全局事务标识 当使用GTIDS时,在主上提交的每一个事务都会 ...

  8. MySQL5.7.18基于GTID的主从复制过程实现

    GTID是5.6时加入的,在5.7中被进一步完善,生产环境建议在5.7版本中使用.GTID全称为Global Transaction Identifiers,全局事务标识符.GTID的复制完全是基于事 ...

  9. 基于GTID的MySQL主从复制#从原理到配置

    GTID是一个基于原始mysql服务器生成的一个已经被成功执行的全局事务ID,它由服务器ID以及事务ID组合而成.这个全局事务ID不仅仅在原始服务器器上唯一,在所有存在主从关系 的mysql服务器上也 ...

随机推荐

  1. 重新初始化VS2010

    开始->所有程序->Microsoft Visual Studio 2010->Visual Studio Tools->Visual Stdio命令提示(2010)  这时会 ...

  2. 用xml来编写动画

    我们可以使用代码来编写所有的动画功能,这也是最常用的一种做法.不过,过去的补间动画除了使用代码编写之外也是可以使用XML编写的,因此属性动画也提供了这一功能,即通过XML来完成和代码一样的属性动画功能 ...

  3. hadoop 数据倾斜

    数据倾斜是指,map /reduce程序执行时,reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理时间很长,这是因为某一个key的条数比其他key多很多(有 ...

  4. Linux内核中断和异常分析(下)

    这节,我们继续上,中(以前的日志有)篇目进行分析,结合一个真实的驱动案例来描述linux内核中驱动的中断机制,首先我们先了解一下linux内核中提供的中断接口. 这个接口我们需要包含一个头文件:#in ...

  5. 记我的第二次自动化尝试——selenium+pageobject+pagefactory实现自动化下单、退款、撤销回归测试

    需求: 系统需要做下单.退款.撤销的回归测试,有下单页面,所以就想到用selenium做WEB UI 自动化 项目目录结构: common包上放通用的工具类方法和浏览器操作方法 pageobject包 ...

  6. linux系统安装mysql数据库

    1.首先关闭linux的防火墙,执行命令 chkconfig iptables off 2.从mysql官网上下载自己适合的mysql版本https://dev.mysql.com/downloads ...

  7. MySQL中的行级锁,表级锁,页级锁

    在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引 ...

  8. python常见模块之time,datetime模块

    一.time模块 time模块提供了一些用于管理时间和日期. time模块中时间的表现形式有三种: format_string  格式化的字符串 struct_time     结构化时间 times ...

  9. Java 中遇到null 和为空的情况,使用Optional来解决。

    Java 中遇到null 和为空的情况,使用Optional来解决 示例代码: package crazy; import java.util.Optional; class Company { pr ...

  10. vfd电子时钟制作

    17年也没干个啥,年后就去折腾着玩意儿了,也不知道我折腾它还是它折腾我.反正总之现在勉强可以交作业了,呵呵 硬件: 1.罗耶振荡电路输出一路4v交流,一路25v交流 其中4v直接驱动灯丝,另一路经电桥 ...