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 ...
随机推荐
- 【sping揭秘】23、Spring框架内的JNDI支持
JndiTemplate 经过jdbctemplate,transactionTemplate...的洗礼,想必大家看到template就知道是个什么尿性了吧 一样的,我们只需要调用jnditempl ...
- mysql 开发进阶篇系列 31 工具篇(mysql连接工具与MyISAM表压缩工具)
一.mysql 连接工具 在mysq提供的工具中,DBA使用最频繁的莫过于mysql.这里的mysql是指连接数据库的客户端工具. 1.1 连接选项 -u, -- user=name 指定用户名 -p ...
- mybatis随笔五之Executor
在上一篇文章我们分析到了mapper接口方法的实现实际上是交由代理类来实现的,并最终调用Executor来查询,接下来我们对executor.query(ms, wrapCollection(para ...
- PostgreSQL Json字段作为查询条件案例
业务扩展字段在数据库中经常会使用json格式的数据来存储,这就涉及到一个头疼的问题,假设要使用扩展字段里的某个值作为查询条件怎么办,原来PostgreSQL本身就支持这种查询方式. 例子:假设业务扩展 ...
- js实现oss文件上传及一些问题
关于兼容性问题,ie8以下的可以使用4.x的版本 一.引入sdk和jq <script src="http://libs.baidu.com/jquery/2.0.0/jquery.m ...
- 面试:C++工厂模式实现
#include <iostream> enum CTYPE {PRODUCTA,PRODUCTB}; class Product{ public: ; virtual ~Product( ...
- Java 8 新特性-菜鸟教程 (9) -Java8 Base64
Java8 Base64 在Java 8中,Base64编码已经成为Java类库的标准. Java 8 内置了 Base64 编码的编码器和解码器. Base64工具类提供了一套静态方法获取下面三种B ...
- php使用curl模拟GET和POST请求
GET方式提交数据 function http_get($url, $ssl = FALSE) { $curl = curl_init(); // 启动一个CURL会话 curl_setopt($cu ...
- vue-cli keep-alive用法以及activated,deactivated
keep-alive用法 <keep-alive>是Vue的内置组件,能在组件切换过程中将状态保留在内存中,防止重复渲染DOM. include: 字符串或正则表达式.只有匹配的组件会被 ...
- #6 Python数据类型及运算
前言 前文讲述了Python的输入输出以及变量的相关知识点,本节将探讨Python的数据类型以及数据之间的运算方式! 一.Python数据类型 上一节弄清了变量,其实变量所指向的值是有自己独特的数据类 ...