GTID简介

概念

全局事务标识符(GTID)是创建的唯一标识符,并与在源(主)服务器上提交的每个事务相关联。此标识符不但是唯一的,而且在给定复制设置中的所有服务器上都是唯一的。所有交易和所有GTID之间都有一对一的映射关系。
GTID由source_id和transaction_id组成

GTID = source_id:transaction_id

server_uuid一般为source_id

GTID集合

GTID总是保存在主从之间。这意味着您可以通过检查二进制日志来确定应用于任何从属设备的任何事务的来源。另外,一旦给定GTID的事务在给定的服务器上被提交,任何具有相同GTID的后续事务都被该服务器忽略。因此,在主站上提交的事务只在从站上应用一次,这有助于保证一致性。

GTID的生成和生命周期:
1,事务在主服务器上执行并提交。使用主服务器的UUID和此服务器上尚未使用的最小非零事务序列号为该事务分配一个GTID; GTID被写入到master的二进制日志中
2,在将二进制日志数据发送到从站并存储在从站的中继日志中,从站读取GTID并设置gtid_next这告诉slave,下一个事务必须使用这个GTID记录。
3,从服务器验证这个GTID是否应用此事务。
4,因为gtid_next不是空的,把git_next也就是从主机中获得的GTID写入到二进制日志中。

mysql.gtid_executed表

  • 该mysql.gtid_executed表使从机能够在从机上禁用二进制日志记录时使用GTID,并且可以在二进制日志丢失时保留GTID历史记录。
  • 若将mysql.gtid_executed表复位,执行RESET MASTER
  • 表格提供会周期性的压缩 当数量达到executed_gtid_compression_period值或者日志轮转时候mysql压缩储存,值默认为1000,压缩线程thread/sql/compress_gtid_table
mysql> SELECT * FROM performance_schema.threads WHERE NAME LIKE '%gtid%'\G
*************************** 1. row ***************************
THREAD_ID: 26
NAME: thread/sql/compress_gtid_table
TYPE: FOREGROUND
PROCESSLIST_ID: 1
PROCESSLIST_USER: NULL
PROCESSLIST_HOST: NULL
PROCESSLIST_DB: NULL
PROCESSLIST_COMMAND: Daemon
PROCESSLIST_TIME: 1509
PROCESSLIST_STATE: Suspending
PROCESSLIST_INFO: NULL
PARENT_THREAD_ID: 1
ROLE: NULL
INSTRUMENTED: YES
HISTORY: YES
CONNECTION_TYPE: NULL
THREAD_OS_ID: 18677

实践

两台机器
172.16.10.53
172.16.10.54

步骤

1,将master 设置read-only,使slave赶上master更新速度
mysql >set global read-only
注:read-only 设置时候super用户可写,普通用户不可写。
2,停止两台机器

>mysqladmin  -uroot -p shutdown

3,修改配置,启用GTID功能,要启用基于GTID的复制,必须通过将gtid_mode变量 设置为启用GTID模式启动每个服务器 ON,并enforce_gtid_consistency 启用变量以确保只记录对基于GTID的复制安全的语句。在slave机器启动之前,使用--skip-slave-start禁用slave的复制进程。
由于在MySQL 5.7.5中增加了mysql.gtid_executed,所以不需要slave机器启用二进制日志记录来使用GTID 。这意味着您可以使用GTID但没有二进制日志记录的从服务器。为了能够复制,主设备必须始终启用二进制日志记录。而slave,只需要配置这些变量:

gtid_mode=ON
enforce-gtid-consistency=true

不过为了高可用的切换,推荐选择如下配置

gtid_mode=ON #必选
enforce-gtid-consistency=true #必选
log-bin=mysql #5.6必选 5.7.5和它之后可选,为了高可用,最好设置
server-id=1 #开启log-bin的必须设置
log-slave-updates=ON # 5.6必选 5.7.5和它之后可选,为了高可用切换,最好设置ON

4, 配置slave使用GTID来进行同步数据,当然需要在master给slave开通权限

grant  replication slave on *.*  to repl@"172.16.10.53" identified by "password";

设置GTID同步模式

change master to master_host='172.16.10.53',master_user='repl',master_port=3306,master_password="password",master_auto_position=1;

注意:非端口号需要加上引号
5,做一个新的备份,启用GTID之前创建的现有备份现在不能再在这些服务器上使用,因为您启用了GTID。在这一点上做一个新的备份,这样你就不会没有可用的备份。
比如说物理备份。

6,启动slave的同步进程

mysql> start slave

问题

在启动slave同步进程时候,查看日志出现如下问题

2018-01-17T09:48:18.116983Z 1 [Warning] Slave SQL for channel '': If a crash happens this configuration does not guarantee that the relay log info will be consistent, Error_code: 0

什么!!not consistent,绝对不能忍
在网上查了下添加如下配置就好了
在my.cnf中设置,

relay_log_info_repository = TABLE
master_info_repository = TABLE
relay_log_recovery = on

报错原因:
MySQL5.6版本号開始支持把master.info和relay-log.info的内容写入到mysql库的表中。

master.info--> mysql.slave_master_info
relay-log.info--> mysql. slave_relay_log_info

同一时候在MySQL5.6版本号中,添加了 Slave crash-safe replication功能,为了保证mysql的replication可以crash-safe。slave_master_info和slave_relay_log_info表必须使用事务型的存储引擎(InnoDB),不要尝试去手动改动这两张表的内容。
同一时候,Slave还要开启relay_log_recovery功能。
解决方法:
设置master_info_repository和relay_log_info_repository的值为TABLE。同一时候开启relay_log_recovery功能。

GTID的故障处理和恢复。

1,简单的复制,在新服务器上重现所有标识符和事务的最简单方法是将新服务器变为具有全部执行历史记录的主服务器的从服务器,并在两台服务器上启用全局事务标识符,缺点是较慢,且需要master保持所有的bin-log
2,使用mysqldump的方式,设置新slave机器(较快)
首先使用mysqldump命令备份

mysqldump --single-transaction --set-gtid-purged=OFF  --triggers --routines --events  -uroot -p >all.sql

此时会出现提示

mysqldump: [Warning] Using a password on the command line interface can be insecure.
Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don't want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events.

若不需要进行GTID的恢复和从库设置,则可以添加--set-gtid-purged=OFF 关闭(默认为ON)
若需要进行GTID的主从设置则--set-gtid-purged=ON 既可

mysqldump --single-transaction --set-gtid-purged=ON  --triggers --routines --events  -uroot -p >all.sql

查看sql文件中会出现以下语句,设置GTID_PURGED来跳过一些事务。

--
-- GTID state at the beginning of the backup
--
SET @@GLOBAL.GTID_PURGED='7abe211e-fb4f-11e7-b16e-000c29ba88ca:1-69726';

然后在slave机器上进行恢复(需要slave开启GTID功能),在恢复时候可能需要下面问题。

[root@localhost ~]# mysql -uroot -pMysql3200$%^ test < /tmp/all.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.

解决办法:登录执行reset master 清空 GTID_EXECUTED

[root@localhost ~]# mysql -uroot -p
mysql> reset master;
Query OK, 0 rows affected (0.02 sec)

导入binlog后,再start slave既可。

mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.16.10.53
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql.000005
Read_Master_Log_Pos: 777138
Relay_Log_File: localhost-relay-bin.000018
Relay_Log_Pos: 88658
Relay_Master_Log_File: mysql.000005
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

3,使用空事务处理故障
情况1:
主键重复

                   Last_Error: Could not execute Write_rows event on table test.a; Duplicate entry '500' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql.000005, end_log_pos 651107

方法1:
注入空事务

      Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set: 7abe211e-fb4f-11e7-b16e-000c29ba88ca:66253-68381:69091-70362
Executed_Gtid_Set: 7abe211e-fb4f-11e7-b16e-000c29ba88ca:1-70362,
9a455b69-fb4f-11e7-b993-000c29e8a43c:1 (root@Slave)[tempdb]>stop slave sql_thread; (root@Slave)[tempdb]>set gtid_next='7abe211e-fb4f-11e7-b16e-000c29ba88ca:70363'; (root@Slave)[tempdb]>begin;commit; (root@Slave)[tempdb]>set gtid_next='AUTOMATIC'; (root@Slave)[tempdb]>start slave sql_thread; (root@Slave)[tempdb]>show slave status \G

方法2:
删除冲突行

使用GTID的限制

  • 涉及非事务性存储引擎的更新。对使用非事务性存储引擎的表进行的更新与在同一事务中使用事务性存储引擎的表的更新混合在一起会导致将多个GTID分配给同一事务。
  • CREATE TABLE ... SELECT语句。在使用基于行的复制时,该语句实际上被记录为两个单独的事件 - 一个用于创建表,另一个用于将源表中的行插入刚刚创建的新表中。当这个语句在一个事务中被执行时,这些事件在某些情况下可能会被接收到相同的事务标识符,这意味着包含插入事务的事务被从机跳过。
  • 创建临时表。
  • GTID模式和mysql_upgrade,当服务器在启用全局事务标识符(GTID)时候,不要用mysql_upgrade --write-binlog启用二进制日志记录。

参考链接:
http://www.cnblogs.com/gcczhongduan/p/4869525.html
https://dev.mysql.com/doc/refman/5.7/en/replication-gtids-failover.html

MySQl新特性 GTID的更多相关文章

  1. 不想业务被中断?快来解锁华为云RDS for MySQL新特性

    摘要:新特性上线!华为云RDS for MySQL又添新技能,实力保障业务连续性. 本文分享自华为云社区<不想业务被中断?快来解锁华为云RDS for MySQL新特性>,作者:Gauss ...

  2. MySQL新特性MTS

    一.MTS:多线程复制 MTS简介 在MySQL 5.6版本之前,Slave服务器上有两个线程I/O线程和SQL Thread线程.I/O线程负责接收二进制日志(Binary Log,更准确的说是二进 ...

  3. mysql新特性

    5.7新特性 sys库 document store X protocol json支持 空间数据 虚拟列 query rewrite plugin 表空间传输 innodb undo表空间 表空间管 ...

  4. 新特性GTID

    什么是GTID 每提交一个事务,当前的执行过程都会拿到一个唯一的标识符,此标识符不仅对其源mysql 实列是唯一的而在给定的复制环境中的所有mysql 实列也是唯一的,所哟的事务与其GTID 之间都是 ...

  5. MySQL新特性文档型数据库

    mongodb在文档型数据库这方面一直做的很好,也发展了很多年,MySQL作为一个比较大众的数据库也慢慢支持了该特性,下面介绍一下MySQL支持文档型数据库的简单操作. 环境: 主机名 IP 系统 软 ...

  6. mysql 新特性之geometry

    1.获取矩形两个点的数据(左上角和右下角) SELECT  *    FROM    t_location    WHERE   MBRContains                    (    ...

  7. 总结一下关于mysql 5.6 新特性

    一直断断续续的看一些mysql特性,今天总结一下,以下是列表,网址 http://mariadb.org/ (也是类似的特性), http://mysql.com/ 最近在看关于mysql新特性的一些 ...

  8. MySQL5.6 GTID新特性实践

    MySQL5.6 GTID新特性实践 GTID简介 搭建 实验一:如果slave所需要事务对应的GTID在master上已经被purge了 实验二:忽略purged的部分,强行同步 本文将简单介绍基于 ...

  9. [MySQL5.6 新特性] 全局事务标示符(GTID)

    GTID的全称为 global transaction identifier  , 可以翻译为全局事务标示符,GTID在原始master上的事务提交时被创建.GTID需要在全局的主-备拓扑结构中保持唯 ...

随机推荐

  1. 高可用的MongoDB集群-实战篇

    1.概述 最近有同学和网友私信我,问我MongoDB方面的问题:这里我整理一篇博客来赘述下MongoDB供大家学习参考,博客的目录内容如下: 基本操作 CRUD MapReduce 本篇文章是基于Mo ...

  2. 高可用Hadoop平台-答疑篇

    1.概述 这篇博客不涉及到具体的编码,只是解答最近一些朋友心中的疑惑.最近,一些朋友和网友纷纷私密我,我总结了一下,疑问大致包含以下几点: 我学 Hadoop 后能从事什么岗位? 在遇到问题,我该如何 ...

  3. Ice简介+Qt代码示例

    1.ICE是什么? ICE是ZEROC的开源通信协议产品,它的全称是:The Internet Communications Engine,翻译为中文是互联网通信引擎,是一个面向对象的中间件,它封装并 ...

  4. (转)Spring常见注解总结

    传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点: 1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文 ...

  5. GoogLeNetv1 论文研读笔记

    Going deeper with convolutions 原文链接 摘要 研究提出了一个名为"Inception"的深度卷积神经网结构,其目标是将分类.识别ILSVRC14数据 ...

  6. java设计模式--Builder模式

    一.Builder模式 二.使用例子 三.Spring中的Builder模式 Builder模式,构建者.构造者模式,在<图解设计模式>中归为 生成实例 一栏,该模式用于组装具有复杂结构的 ...

  7. Join 具体用法

    一.Join 语法概念 Join 按照功能可分为三大类: left join (左连接) 即:取左边表的全部数据,即使右边表没有对应的数据,也是会把左边表的数据取出来,并返回 right join(右 ...

  8. Java JDBC的基础知识(三)

    在前面的Java JDBC的基础知识(二)和(三)中,主要介绍JDBC的原理和简单的应用过程.尤其在(二)中,可以发现代码进行多次try/catch,还有在前面创建连接等过程中好多参数我都给写定了. ...

  9. 吉哥系列故事——临时工计划(dp)

    吉哥系列故事——临时工计划 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total ...

  10. Android - fragment Manager

    fragment基本使用: http://www.cnblogs.com/qlky/p/5415679.html Fragmeng优点 Fragment可以使你能够将activity分离成多个可重用的 ...