如何查看mysql的gtid_汇总丨MySQL GTID技术点,看这一篇就够了!

mysql> SELECT * FROM mysql.gtid_executed;

c74ae8afa79fd0f9c9381a56b49e1144.png

mysql.gtid_executed表是由MySQL服务器提供给内部使用的。它允许副本在副本上禁用二进制日志记录时使用GTIDs,并允许在二进制日志丢失时保留GTID状态。RESET MASTER命令,gtid_executed表将被清除。

服务意外停止的情况下,当前二进制日志文件中的gtid集不会保存在gtid_executed表。在恢复期间,这些gtid将从二进制日志文件添加到表中,以便可以继续复制。

3. gtid_executed

若MySQL服务器启用了二进制日志,则表mysql.gtid_executed的更新仅在二进制rotation时发生,因为发生重启等情况依旧可以通过扫描二进制日志判断得知当前运行的GTID位置。

简单来说,该表会记录当前执行的GTID

在MySQL 5.6中必须配置参数log_slave_updates的最重要原因在于当slave重启后,无法得知当前slave已经运行到的GTID位置,因为变量gtid_executed是一个内存值:

MySQL 5.7将gtid_executed这个值给持久化。采用的技巧与MySQL 5.6处理SQL thread保存位置的方式一样,即将GTID值持久化保存在一张InnoDB表中,并与用户事务一起进行提交,从而实现数据的一致性。

触发条件:

在binlog发生rotate(flush binary logs/达到max_binlog_size)或者关闭服务时,会把所有写入到binlog中的Gtid信息写入到mysql.gtid_executed表。

从库:如果没有开启log_bin或者没有开启log_slave_updates,从库在应用relay-log中的每个事务会执行一个insert mysql.gtid_executed操作。

常用命令

1. gtid设置

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

2. gtid跳过 gtid_next

stop slave;

set gtid_next='d74faa2d-5819-11e8-b248-ac853db70398:10603';

begin;commit;

set gtid_next='automatic';

start slave;

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

3. gtid清除gtid_pureged

命令的实际意义:因没有binlog信息(expire_logs_days),不考虑这些gtid确认和回滚。常用备份恢复,搭建从库的时候使用。

自动触发机制:flush,服务器重新启动

使用场景:

在副本上禁用二进制日志记录提交的复制事务的GTIDs。

写入二进制日志文件的事务的GTIDs,该文件现在已被清除。

通过语句set @@GLOBAL.gtid_purged显式添加到集合中的gtid。

mysqldump --set-gtid-purged=off/on 参数;

是否将GTID_PURGED’添加到输出中

cb2b91d291cd97d6c2af324cd40ca456.png

4. gtid升级

pos升级gtid方式,条件允许建议重新搭建从库的方式。以下方式存在风险。

gtid_mode可选值

ON:完全打开GTID,如果打开状态的备库接受到不带GTID的事务,则复制中断

ON_PERMISSIV:可以认为是打开gtid前的过渡阶段,主库在设置成该值后会产生GTID,同时备库依然容忍带GTID和不带GTID的事务

OFF_PERMISSIVE:可以认为是关闭GTID前的过渡阶段,主库在设置成该值后不再生成GTID,备库在接受到带GTID和不带GTID事务都可以容忍。主库在关闭GTID时,执行事务会产生一个Anonymous_Gtid事件,会在备库执行:set @@session.gtid_next=‘anonymous’

OFF:彻底关闭GTID,如果关闭状态的备库收到带GTID的事务,则复制中断

从position模式切换到GTID模式:

1)在每个sever执行WARN模式:

这一步设置之后,使得所有事物都允许违反GTID的一致性

mysql>SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = WARN;

#这是第一个重要步骤. 您必须确保在进入下一步骤之前不会在错误日志中生成警告.

2)在每个sever执行ON模式:

以确保所有的事务都不能违反GTID一致性

mysql>SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = ON;

3)在每个sever执行OFF模式:

这一步表示,新的事务是匿名的,同事允许复制的事务是GTID或是匿名的

mysql>SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;

#需要确保这一步操作在所有的服务器上执行

4)在每个sever执行ON模式:

这一步表示,新的事务是GTID的,同事允许复制的事务是GTID或是匿名的

mysql>SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;

#需要确保这一步操作在所有的服务器上执行

5)在每个服务器上,等待状态变量ONGOING_ANONYMOUS_TRANSACTION_COUNT为零. 可以使用如下方式查询:

mysql>SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT';

#在所有从库上查询该状态,必须为0 才能进行下一步。该状态宝石已标示为匿名的正在#进行的事务数量,如果状态值为0表示无事务等待被处理

等待生成到步骤5的所有事务复制到所有服务器. 可以在不停止更新的情况下执行此操作:唯一重要的是所有anonymous transactions都被复制了.

6)GTID_MODE = ON在每所有服务器上执行:

mysql>SET @@GLOBAL.GTID_MODE = ON;

7)修改每个my.cnf文件:

gtid-mode=ON

ENFORCE_GTID_CONSISTENCY = ON

8)上面复制虽然配置了GTID模式,但还是基于Binlog方式的。可通过选项MASTER_AUTO_POSITION设置为1,把复制调整为基于GTID模式的复制,具体操作如下:

mysql>STOP SLAVE [FOR CHANNEL 'channel'];

mysql>CHANGE MASTER TO MASTER_AUTO_POSITION = 1 [FOR CHANNEL 'channel'];

mysql>START SLAVE [FOR CHANNEL 'channel'];

5. gtid 压缩 gtid_executed_compression_period

启用GTID时,服务器会定期在mysql.gtid_executed表上执行此类压缩。通过设置gtid_executed_compression_period系统变量,可以控制压缩表之前允许的事务数,从而控制压缩率。该变量的默认值为1000; 这意味着,默认情况下,在每1000次事务之后执行表压缩。

将gtid_executed_compression_period设置为0可以防止执行压缩; 但是,如果执行此操作,应该为gtid_executed表可能需要的磁盘空间量的大幅增加做好准备。

使用以下语句查询:

mysql> select thread_id,thread_os_id,name, processlist_command,processlist_statefrom `performance_schema`.threads where name like '%compress%';+-----------+--------------+--------------------------------+---------------------+-------------------+| thread_id |thread_os_id | name |processlist_command | processlist_state |+-----------+--------------+--------------------------------+---------------------+-------------------+| 26 |8024| thread/sql/compress_gtid_table |Daemon | Suspending |+-----------+--------------+--------------------------------+---------------------+-------------------+

备注:如发现 processlist_state 值一直是: "Compressing gtid_executed table"说明进行压缩。记录锁的内存从操作系统申请,所以当表gtid_executed不断增大时,最终会导致MySQL OOM。

6. binlog_gtid_simple_recovery

MySQL启动或重启时在搜索GTIDs期间迭代二进制日志文件的方式。就是为了初始化 gtid_executed , gtid_purged参数,扫描binlog 或则 event相关信息

MySQL 5.7.7或更老版本的二进制日志,需要在设置binlog_gtid_simple_recovery=FALSE,如果存在非gtid的binlog比较多的时候,会非常影响性能的。

限制

到目前为止已经发展完善,但存在一些场景是受限的。

1. create table xxx as select:

拆分成两部分:

create table xxxx like table;

insert into xxxx select *from table;

2. 临时表的限制

使用GTID复制模式:

1.不支持create temporary table 和 drop temporary table。

2.在autocommit=1的情况下可以创建临时表,

3.Master端创建临时表不产生GTID信息,所以不会同步到slave,但是在删除临时表的时候会产生GTID会导致,主从中断.

3.事务操作

涉及非事务性存储引擎的更新,非事务性存储引擎事务性存储引擎更新表则不能在同一条语句或同一事务中执行。

4.mysql_upgrade

GTID模式和mysql_upgrade。在启用全局事务标识符(GTIDs)的情况下运行时,不要通过mysql_upgrade(——write binlog选项)启用二进制日志记录。

5.sql_slave_skip_counter

传统模式的跳过postion方式gtid模式下不支持。

总结

1. gtid能不能做的更好。返回搜狐,查看更多

像并行复制的writeset一样 压缩机制

binlog内容能不能更简洁

gtid能不能实现物理级别的复制模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为JPA的本机查询API键入安全查询

当您使用JPA时-有时-JPQL无法解决问题,您将不得不使用本机SQL。 从一开始,像Hibernate这样的ORM就为这些情况保留了一个开放的“后门”,并为Spring的JdbcTemplate , Apache DbUtils或jOOQ提供了类似的API,用于纯SQL 。…

vb.net详解MDI窗体操作方法

MDI窗体可以避免打开窗体的时候被无数个子窗体困扰,我将为大家一一的介绍一下vb.net中MDI窗体的操作方法 一、如何创建MDI窗体? 1、创建mdi主窗体 新建建立一个默认空白的Windows应用程序,在Form1窗体的属性窗口中找到IsMDIContainer 属性&am…

lokijs可以用mysql_JavaScript实现的内存数据库LokiJS介绍和入门实例_javascript技巧

LokiJS是一个内存数据库,将性能考虑放在第一位。LokiJS支持索引和更快的文档访问,执行性能非常好(近50万OPS/秒)。其内置DynamicView类可以用于数据子集的索引,甚至获取更快的性能。*阅读这篇文章来看一看LokiJS的性能表现。LokiJS支持collec…

除了修改WEBCONFIG会导致WEB服务重启外,还有其他的什么操作会导致重启?

1、修改WEBCONFIG文件 2、BIN文件夹下,添加、删除、覆盖文件 3、IIS应用程序池回收 参考文章:http://blog.csdn.net/hb_gx/archive/2007/05/21/1619941.aspx转载于:https://www.cnblogs.com/niaowo/p/3686097.html

院队选拔赛

结束了,大半年的干活结束了,后面就是自己算法的大干活了。恩恩,目测就是下一站省赛了,早点睡觉。晚安~ 留个地址后面ak掉。hust stodgersma 转载于:https://www.cnblogs.com/stodgers/p/3898317.html

pandaboard 安装_linux fb设备(pandaboard) | 学步园

fb设备主要作用是获取帧buffer, 并设置,用于显示。fbmem是主要的框架层和抽象层。 每个具体的平台的帧设备是在调用platform_driver_register注册之后,由其probe函数调用create framebuffer将fbinfo设置给registered_fb(数组, 不同…

WinForm窗体之间传值

当程序需要将一个窗体中的一些信息传给另一个窗体并让其使用时,就需要用到这个知识点 方法一:通过接受参数的窗体的构造函数传值 例:现有Form1和Form2两个窗体,二者都包含一个文本框,Form1还包含一个按钮.程序从Form1开始运行,当点击Form1上的按钮时,Form2弹出,并将Form1中文本…

多线程写mysql数据库_多线程读写mysql数据库

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼unsigned int __stdcall scan(PVOID pM){char ip[20];strcpy(ip, (char*)pM);MYSQL mysql;MYSQL_RES* result;//初始化mysql句柄mysql_init(&mysql);//连接mysql数据库if(!mysql_real_connect(&mysql,"localhost"…

C++学习之路,漫长而遥远

一、C/C语言 如果你的基础很差, 建议不要一开始就学C语言,从C开始学起,对程序有个初步的认识,循序渐进。C语言的书嘛,先买一本 300 页以内的,把书中的每一个例子都通过键盘敲打进去到 Visual studio里面去&…

python图标icon_用Python提取exe图标icon

这里使用Python win32包中的win32gui.ExtractIconEx方法来提取exe的图标,除了安装Python,还需要到这里下载Pywin。第一份代码将指定的a.exe图标保存为bmp格式:import win32uiimport win32guilarge, small win32gui.ExtractIconEx(r"c:/…

python读取word图片_Python中如何读取Word中的图片

Python能够快速的编写、调试,用来提取各类软件中的图片再好不过了。今天小编就为大家带来在Python中提取Word图片的方法。方法需要批量的修改文件后缀名,并且解压之后将图片拷贝到需要存放的地方,然后将该文件夹清空留作下次的路径&#xff0…

layoutSubviews 详解

ios layout机制相关方法 - (CGSize)sizeThatFits:(CGSize)size - (void)sizeToFit——————- - (void)layoutSubviews - (void)layoutIfNeeded - (void)setNeedsLayout——————– - (void)setNeedsDisplay - (void)drawRectlayoutSubviews在以下情况下会被调用&#xff…

jdk中的设计模式_JDK中的设计模式

jdk中的设计模式Zen的JCG合作伙伴Brian Du Preez 是IT领域的合作伙伴, 在收集JDK中最常见的设计模式方面做得非常出色。 模式列表的确令人印象深刻且很长,因此让我们不再ba不休,然后将其呈现给您。 前几天,我在Enterprise Dev上看…

python鼠标选中事件_python对绑定事件的鼠标、按键的判断实例

当多个事件绑定了同一个命令,那么在命令内部根据不同的事件进行处理的时候,怎么确定哪个事件发生了呢,用下面的来检测,经过测试处理tab键和alt键不能识别,其他单个都能被识别。还有个事件的type属性,这个经…

PAT 1074. Reversing Linked List (25)

Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K 3, then you must output 3→2→1→6→5→4; if K 4, you must output 4→3→2→1→5→6. Input Sp…

jOOQ,H2和Maven入门

本文是我们学院课程的一部分,标题为jOOQ –类型安全的数据库查询 。 在SQL和特定关系数据库很重要的Java应用程序中,jOOQ是一个不错的选择。 当JPA / Hibernate抽象过多,JDBC过多时,这是一种替代方法。 它显示了一种现代的领域特…

sqlserver迁移数据到mysql_SQLServer数据库之将ABP的数据库从SQLSERVER迁移到MySql

本文主要向大家介绍了SQLServer数据库之将ABP的数据库从SQLSERVER迁移到MySql,通过具体的内容向大家展现,希望对大家学习SQLServer数据库有所帮助。安装MySql.Data.Entity然后你需要安装 MySql.Data.Entity和 MySql.Data 到你的 .EntityFramework 和 .We…

查询SQL中某表里有多少列包含某字段

select c.namefrom SYSCOLUMNS as c left join SYSOBJECTS as t on c.idt.id where c.name like 这里是某个字段% and t.name这里是表名 转载于:https://www.cnblogs.com/qiywtc/p/3719087.html

php与mysql连接程序_PHP与Mysql连接

首先请确保LAMP环境完全配置成功,否则请猛击我!然后通过mysql的密码登陆到phpMyAdmin,在浏览器中输入http://127.0.0.1/phpMyAdmin登陆后就像是这样:首先我们来创建一个用于测试的数据库。偷懒的话直接在phpMyAdmin中创建就可以了…

java自动gc_具有Java 7中自动资源管理功能的GC

java自动gc这篇文章简要概述了Java 7中引入的称为自动资源管理或ARM的新功能。 文章探讨了ARM如何减少开发人员为有效释放分配的资源的JVM堆而必须编写的代码。 Java编程语言中编程的最甜蜜之处之一是对象取消分配的自动处理。 在Java世界中,这通常被称为垃圾收集。…