MySQL5.7 GTID学习笔记,[MySQL 5.6] GTID实现、运维变化及存在的bug
GTID(global transaction identifier)是对于一个已提交事务的全局唯一编号,前一部分是server_uuid,后面一部分是执行事务的唯一标志,通常是自增的。
下表整理了GTID常用的查看命令,以及变量的描述及原理,供大家参考(以下基于MySQL5.7,对于MySQL5.6的GTID由于存在性能问题,不推荐使用)
角色 |
常用查看GTID的相关命令 |
变量示例 |
描述 |
变量的更新时机 |
master |
show global variables like '%gtid%'; |
gtid_mode=ON |
GTID模式,开启GTID时在配置文件中开启 gtid_mode参数的4种选项 1> GTID_MODE = OFF : 不产生Normal_GTID,只接受来自master的ANONYMOUS_GTID 2> GTID_MODE = OFF_PERMISSIVE : 不产生Normal_GTID,可以接受来自master的ANONYMOUS_GTID & Normal_GTID 3> GTID_MODE = ON_PERMISSIVE : 产生Normal_GTID,可以接受来自master的ANONYMOUS_GTID & Normal_GTID 4> GTID_MODE = ON : 产生Normal_GTID,只接受来自master的Normal_GTID |
在my.cnf配置中指定,或者online可以通过下面修改 SET @@GLOBAL.GTID_MODE= 或 SET GLOBAL GTID_MODE= |
enforce_gtid_consistency=ON |
保证GTID安全的参数,开启GTID时在配置文件中开启 ENFORCE_GTID_CONSISTENCY参数的3种选项 1> OFF:所有事务允许违反gtid一致性。 2> ON:没有事务允许违反gtid一致性。 3> WARN:所有事务允许违反gtid一致性,但一个警告会产生,Mysql5.7.6新增。 |
在my.cnf配置中指定,或者online可以通过下面修改 SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY= 或 SET GLOBAL ENFORCE_GTID_CONSISTENCY= |
||
gtid_executed= 06ae7c12-fe57-11e6-b021-883fd32565d6:1-4792038936, 14361082-83ae-11e8-8328-883fd32565d6:1-1051075034 |
执行过的所有GTID集合 |
ordered_commit flush阶段生成GTID,在commit阶段才计入gtid_executed变量,在内存中实时更新 |
||
gtid_purged= 06ae7c12-fe57-11e6-b021-883fd32565d6:1-4792038936, 14361082-83ae-11e8-8328-883fd32565d6:1-1045677424 |
由于binlog文件的删除(如purge binary logfiles或者超过expire_logs_days设置)已经丢失的GTID事务,同时在搭建从库时使用set global gtid_purged变量来标识哪些GTID事务已经执行过了。 |
在MySQL触发清理binlog的情况下,比如purge binary logs to或者超过参数expire_logs_days设置的天数后自动删除,需要将丢失的GTID计入这个变量中 |
||
gtid_owned= 14361082-83ae-11e8-8328-883fd32565d6:1049600466#997780200 |
分配GTID发生在GROUP COMMIT的第一个阶段,也就是flush stage,大概可以描述为: 1、事务过程中,碰到第一条DML语句需要记录Binlog时,分配一段Gtid事件的cache,但不分配实际的GTID 2、事务完成后,进入commit阶段,分配一个GTID并写入Step1预留的Gtid事件中,该GTID必须保证不在gtid_owned集合和gtid_executed集合中。 分配的GTID随后被加入到gtid_owned集合中。 3、将Binlog 从线程cache中刷到Binlog文件中。 4、将GTID加入到gtid_executed集合中。 5、在完成sync stage 和commit stage后,各个会话将其使用的GTID从gtid_owned中移除。 |
|||
master |
show global variables like '%uuid%'; |
server_uuid=14361082-83ae-11e8-8328-883fd32565d6 |
server_uuid实际上是一个32字节+1字节(/0)的字符串。 |
MySQL启动的时候会调用init_server_auto_options() 读取auto.cnf文件。如果没有读取到则调用generate_server_uuid()调用生成一个server_id。 |
master |
select * from mysql.gtid_executed; |
source_uuid=14361082-83ae-11e8-8328-883fd32565d6 |
uuid of the source where the transaction was originally executed. gtid_executed表是5.7.5以后新增的,是GTID持久化的介质,实例重启后读取这个表初始化。 |
1、从库在binlog关闭或者binlog开启,参数log_slave_updates关闭的情况,实时将GTID持久化到gtid_executed表中。 2、从库在binlog开启同时参数log_slave_updates开启的情况,不实时更新 3、主库不实时更新。 4、执行reset master时,清空表 5、set global gtid_purged时,设置表 |
interval_start=1 |
First number of interval |
同上 |
||
interval_end=1053828634 |
Last number of interval |
同上 |
||
master |
show master status\G |
Executed_Gtid_Set= 06ae7c12-fe57-11e6-b021-883fd32565d6:1-4792038936, 14361082-83ae-11e8-8328-883fd32565d6:1-1054196743 |
执行过的所有GTID集合 |
同gtid_executed |
master |
Mysqlbinlog -vvv SVR14077HW2288-bin.030734|less |
Previous-GTIDs= # 14361082-83ae-11e8-8328-883fd32565d6:1-1055704939, #e36c6adf-fe56-11e6-9f8e-883fd325654a:74434853-7475373424 |
Previous gtid Event是包含在每一个binlog的开头用于描述所有以前binlog所包含的全部Gtid的一个集合 (包括已经删除的binlog) |
产生的binlog中开头会包含这个值 在5.7中不开启GTID也会包含这个Previous gtid Event |
slave |
show slave status\G |
Master_UUID: 14361082-83ae-11e8-8328-883fd32565d6 |
对应master的server_uuid |
|
Retrieved_Gtid_Set:14361082-83ae-11e8-8328-883fd32565d6:962977557-1057333221 |
IO线程已经读取的GTID的集合 |
1、IO线程收到一个GTID EVENT就会把它加入到Retrieved_Gtid_Set中 2、MySQL重启时会从relay log中初始化Retrieved_Gtid_Set |
||
Executed_Gtid_Set:06ae7c12-fe57-11e6-b021-883fd32565d6:1-4792038936, 14361082-83ae-11e8-8328-883fd32565d6:1-1057333220 |
表示SQL线程已经执行的GTID的集合 |
主库的binlog在从库应用时,会更新Executed_Gtid_Set值 |
https://dev.mysql.com/doc/refman/5.7/en/replication-gtids-lifecycle.html
https://www.tuicool.com/articles/NjqQju
[MySQL 5.6] GTID实现、运维变化及存在的bug
前言:什么是GTID
#130502 23:23:27 server id 119821 end_log_pos 231 CRC32 0x4f33bb48 Previous-GTIDs
# 10a27632-a909-11e2-8bc7-0010184e9e08:1,
# 7a07cd08-ac1b-11e2-9fcf-0010184e9e08:1-1129
mysql> show global variables like ‘%gtid_executed%’\G
f914fb74-a908-11e2-8bc6-0010184e9e08:1
本文讨论的内容包括:
一、主库上的Gtid
a.相关变量
mysql> show global variables like ‘%gtid_owned%’\G
b.如何分配和使用GTID
c.如何持久化GTID
5419 if (mysql_bin_log.init_gtid_sets(
二、备库上的GTID
a.如何保持主备GTID一致
$2 = {
type = GTID_GROUP,
gtid = {
sidno = 2,
gno = 1127,
static MAX_TEXT_LENGTH = 56
},
static MAX_TEXT_LENGTH = 56
}
|–>检查该gtid是否在logged_gtids集合中,如果在的话,则返回(gtid_pre_statement_checks会忽略该事务)
b.备库如何发起DUMP请求
引入GTID,最大的好处当然是我们可以随心所欲的切换主备拓扑结构了。在一个正常运行的复制结构中,我们可以在备库简单的执行如下SQL:
2974 if (command == COM_BINLOG_DUMP_GTID)
2983 RETURN_STATUS_OK)
在主库上接受到命令后,调用入口函数com_binlog_dump_gtid,流程如下:
三、运维操作
a.如何忽略复制错误
mysql> set global sql_slave_skip_counter = 1;
ERROR 1858 (HY000): sql_slave_skip_counter can not be set when the server is running with @@GLOBAL.GTID_MODE = ON. Instead, for each transaction that you want to skip, generate an empty transaction with the same GTID as the transaction
mysql> STOP SLAVE;
Query OK, 0 rows affected (0.00 sec)
mysql> SET SESSION GTID_NEXT = AUTOMATIC;
Query OK, 0 rows affected (0.00 sec)
b.重指主库
c.新的until条件
d.适当减小binlog文件的大小
四、存在的bug
解决办法:将备库的复制模式设置为’ROW’ ,保持主备一致
参考文档
MySQL5.7 GTID学习笔记,[MySQL 5.6] GTID实现、运维变化及存在的bug的更多相关文章
- [MySQL 5.6] GTID实现、运维变化及存在的bug
[MySQL 5.6] GTID实现.运维变化及存在的bug http://www.tuicool.com/articles/NjqQju 由于之前没太多深入关注gtid,这里给自己补补课,本文是我看 ...
- MySQL学习笔记-MySQL体系结构总览
MySQL体系结构总览 不管是用哪种数据库,了解数据库的体系结构都是极为重要的.MySQL体系结构主要由数据库和数据库实例构成. 数据库:物理操作系统文件或者其它文件的集合,在mysql中,数据库文件 ...
- MySQL5.7 GTID学习笔记
GTID(global transaction identifier)是对于一个已提交事务的全局唯一编号,前一部分是server_uuid,后面一部分是执行事务的唯一标志,通常是自增的. 下表整理了G ...
- MySQL学习笔记——MySQL启动过程(一)
首先去官网或者github下载MySQL5.7的源码. 官网地址:https://dev.mysql.com/downloads/mysql/ github地址:https://github.com/ ...
- Ionic2学习笔记(10):扫描二维码
作者:Grey 原文地址: http://www.cnblogs.com/greyzeng/p/5575843.html 时间:6/11/2016 说明: 在本文发表的时候(2016-06-1 ...
- matlab学习笔记8 基本绘图命令-初级二维绘图/交互式绘图
一起来学matlab-matlab学习笔记8 基本绘图命令_5 初级二维绘图/交互式绘图 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用&g ...
- MySQL针对Swap分区的运维注意点
Linux有很多很好的内存.IO调度机制,但是并不会适用于所有场景.对于运维人员来说,Linux比较让人头疼的一个地方是:它不会因为MySQL很重要就避免将分配给MySQL的地址空间映射到swap上. ...
- MySQL数据库学习笔记----MySQL多表查询之外键、表连接、子查询、索引
本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...
- CentOS学习笔记--MySQL安装
MySQL安装 Linux中使用最广泛的数据库就是MySQL,使用在线yum的方式安装的版本落后MySQL网站好几个小版本,本节亲自测试安装新版的MySQL. 测试机器环境: VMware Works ...
随机推荐
- Xamarin.Android 记住账号
1.存储登陆信息 if(login_cb_user.Checked) { ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPr ...
- tcp 三次握手 四次挥手
TCP协议中的三次握手和四次挥手 建立TCP需要三次握手才能建立,而断开连接则需要四次挥手. 三次握手,建立连接 首先Client发送连接请求报文,Server端接收连接后回复ACK报文,并为这次连接 ...
- MobaXterm不能读取C:\Windows\system32作为系统变量
OS环境:Win7 pro x64 已勾选:Settings-->Terminal-->勾选Use Windows PATH environment 然后在MobaXterm中查看系统变量 ...
- Java NIO中的通道Channel(一)通道基础
什么是通道Channel 这个说实话挺难定义的,有点抽象,不过我们可以根据它的用途来理解: 通道主要用于传输数据,从缓冲区的一侧传到另一侧的实体(如文件.套接字...),反之亦然: 通道是访问IO服务 ...
- MariaDB 数据库
1. MariaDB 介绍 MariaDB数据库管理系统是 MySQL 的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成 ...
- 再会,OI
现在时间是一八年的七月二十一日下午,NOI2018 闭幕式已经结束.嗯,结束了... 谢绝了李总的好意也没有让父母来接,有段路还是要自己一个人走的... 总结一下 NOI ...其实也没有什么好总结的 ...
- 四层和七层负载均衡的特点及常用负载均衡Nginx、Haproxy、LVS对比
一.四层与七层负载均衡在原理上的区别 图示: 四层负载均衡与七层负载均衡在工作原理上的简单区别如下图: 概述: 1.四层负载均衡工作在OSI模型中的四层,即传输层.四层负载均衡只能根据报文中目标地址和 ...
- springboot使用遇到问题:Class “model.Address” is listed in the persistence.xml file but not mapped
报错如下: 解决如下: 这是一个Eclipse的怪癖.我最近在创建一个禁用了JPA库配置的新JPA项目时遇到了这个问题,但是在我通过Eclipse New JPA Entity向导创建实体之前没有手动 ...
- 初识SqlLite ---.net连接数据库
Sqlite 是一款轻量级的关系型数据库,以小巧和嵌入式闻名.以前只是听说,现在终于忍不住要尝试下.本文的初衷是为.net平台的使用者提供帮助. Sqlite有专门为VS2010开发的程序包,大家可以 ...
- CentOS7下查看系统环境(内存CPU磁盘使用率)
1.方法一 yum install atop --安装atop sudo atop--开启监视 2.方法二 top 3.方法三 free --查看没存情况 ps ux --查看CPU 情况 磁盘 df