如何查看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,一经查实,立即删除!

相关文章

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…

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

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

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…

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

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

python pandas excel数据处理_Python处理Excel数据-pandas篇

Python处理Excel数据-pandas篇非常适用于大量数据的拼接、清洗、筛选及分析在计算机编程中,pandas是Python编程语言的用于数据操纵和分析的软件库。特别是,它提供操纵数值表格和时间序列的数据结构和运算操作。它的名字衍生自术语“面板数据”(panel dat…

Proe Top-Down设计演示

前段时间有网友问我,proe 里面有没有装配设计中当某一零件尺寸需要修改时, 与其相关的零件尺寸都需要随之做相应改变的法子。我认为top-down是很好的选择。 下面介绍一下top-down的理论: 就按照产品的功能要求先定义产品架构并考虑组件与零件…

python映射实体类_【HIBERNATE框架开发之二】第一个HIBERNATE-ANNONATION项目(采用@ENTITY、@ID直接映射实体类)...

紧接上一篇,这里Himi直接copy上一篇创建的HelloHibernate项目,然后改名为:HelloAnnonation,Ok;OK,准备工作:首先第一步,继续再我们自定义的user libraries 中添加Annotation所需的包&#xff0c…

从Java集成Active Directory

首先,您将需要设置Active Directory,以便可以运行和测试代码。 如果(像我一样)没有一台装有Windows Server的计算机,那么即使在Mac OSX上,也可以通过这种方法设置Active Directory。 您要做的第一件事是在…

编译 php mysql 依赖包_MySQL 5.5.15源码包编译安装

mysql果然是不愧是目前最火的数据库,自从mysql5.5.8之后,mysql的源码包编译安装都要用到cmake来进行编译了,编译的过程没有本质mysql果然是不愧是目前最火的数据库,自从mysql5.5.8之后,mysql的源码包编译安装都要用到c…

云计算之路-阿里云上:基于Xen的IO模型进一步分析“黑色0.1秒”问题

在发现云服务器读取OCS缓存的“黑色0.1秒”是发生在socket读取数据时,而且是发生在读取开始的字节,甚至在socket写数据时(比如写入缓存key)也会出现超过50ms的情况,我们的好奇心被激发到一个新的高度。 根据我们的实测…

ARIMA模型建模步骤

ARIMA模型建模步骤一. 绘制时序图判断序列是否有明显的趋势或周期二. 单位根检验检验方法ADFDFGLSPPKPSSERSNP前三种有有关常数与趋势项假设,应用不方便,建议少用。后三种是去除原序列趋势后进行检验,应用方便。原假设6种方法除KPPS外&#x…

WT2605C音频蓝牙语音芯片:单芯片实现蓝牙+MP3+BLE+电话本多功能应用

在当今的电子产品领域,多功能、高集成度成为了一种趋势。各种产品都需要具备多种功能,以满足用户多样化的需求。针对这一市场趋势,唯创知音推出了一款集成了蓝牙、MP3播放、BLE和电话本功能的音频蓝牙语音芯片——WT2605C,实现了单…

mysql as join_mysql as 别名与 join 多表连接语法

在MySQL中,使用AS关键字为字段、表、视图取别名,或者不用as,用空格隔开:SELECT (SELECT id a,title b FROM blog c limit 1)d;使用字段别名,可以帮助我们有效的组织查询的输出结果。---------------------------------…

'固定' table宽度,走起!

为了让表格能够填充屏幕(剩余空白区域),常将其宽度属性定义为:100%,单元格也是用百分数来定义。 但这样就会出现问题: 如果单元格中的文本超过宽度限制,就会自动换行,高度自动增高,导致整个表格…

python中view的用法_APIview使用

ModelVIewSet 是对 APIView 封装ModelSerializer 是对 Serializer1.1 在user/urls.py中添加路由urlpatterns [ path(apiview/, views.UserInfoViewSet.as_view()), ]1.2 创建user/serializers.py写序列化器serializers.ModelSerializer 和 serializers.Serializer field参数…

spring mvc 教程_Spring MVC开发–快速教程

spring mvc 教程这是我们的JCG合作伙伴之一,来自Manoj的有关使用Spring开发Web应用程序的简短教程, 网址为“ The Khangaonkar Report ”。 (注意:对原始帖子进行了少量编辑以提高可读性) Spring MVC使用基于模型视图…

实时监听输入框值变化的完美方案:oninput onpropertychange

实时监听输入框值变化的完美方案:oninput & onpropertychange 原文:实时监听输入框值变化的完美方案:oninput & onpropertychange在 Web 开发中经常会碰到需要动态监听输入框值变化的情况,如果使用 onkeydown、onkeypress、onkeyup 这…

R语言对矩阵按某一列排序

[plain] view plaincopy a <- c(5,4,3,2,1) b <- c(1,2,3,4,5) c <- cbind(a,b) [plain] view plaincopyc[order(c[,1]),] #按第一列递增排序 转载于:https://www.cnblogs.com/jamesf/p/4751573.html

java 是用什么写的_java用什么写的

java用什么写的JAVA本身就是一门编程语言&#xff0c;它编译生成的文件运行在JVM上(java虚拟机)。JVM是由c语言和汇编语言开发的。基于此之上就是java了&#xff0c;虚拟机是起到解析执行的作用。JVM是java语言最大的特点&#xff0c;java的优缺点也是缘于JVM技术。JVM是一个可…