我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL中GTID的几个限制和解决方案是怎样的

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL中GTID的几个限制和解决方案是怎样的

本篇文章给大家分享的是有关MySQL中GTID的几个限制和解决方案是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

   现在我看待一个技术,总是会换一种角度来看,在他能实现什么的基础上,我更喜欢看他不能做什么,为什么不能这么做。

   比如MySQL GTID在5.6试水,5.7已经发展完善,但是还是有一些场景是受限的。比如下面的两个。

    一个是create table xxx as select 的模式,另外一个是临时表相关的。

MySQL中GTID的几个限制和解决方案是怎样的

   今天我们就来简单说说这两个场景。

GTID中create 语句限制的解法

   create table xxx as select的语句,其实会被拆分为两部分,create语句和insert语句,但是如果想一次搞定,MySQL会抛出如下的错误。

mysql> create table test_new as select *from test;
ERROR 1786 (HY000): Statement violates GTID consistency: CREATE TABLE ... SELECT.

   这种语句其实目标明确,复制表结构,复制数据,insert的部分好解决,难点就在于create table的部分,如果一个表的列有100个,那么拼出这么一个语句来就是一个工程了。

    我们也巧学巧用,看看MySQL有什么特别的方法来处理。

    除了规规矩矩的拼出建表语句之外,还有一个方法是MySQL特有的用法 like。

    create table xxx as select 的方式会被拆分成两部分。

 create table xxxx like data_mgr;
 insert into xxxx select *from data_mgr;

临时表的限制和考虑

   另外一个看起来就有些蹊跷了,看着文档就是没有什么好说的,记住了就好,其实不然。

    如果在事务中有临时表的变动,很可能会导致数据不一致,这在MySQL的5.5版本中有相应的bug,可以参见https://bugs.mysql.com/bug.php?id=76940

     如果需要复现,可以在找一套5.5的环境来模拟一下,分分钟出效果。

    我们创建两个表t1,t2,然后建立两个表之间的外键关联,作为 后续测试所用。

create table t1(c1 int primary key)  engine=innodb;
insert into t1 values(1),(2),(3),(4),(5);
create table t2 (c1 int, c2 int, foreign key(c2) references t1(c1)) engine=innodb;
insert into t2 values(1,1),(2,2),(5,5);  

 创建临时表

> create temporary table tmp as select * from t1;
Query OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0

模拟这个bug,开启事务。

> begin;
> drop temporary table if exists tmp;
Query OK, 0 rows affected (0.00 sec)
> delete from t1 where c1 > 2;
ERROR 1451 (23000): Cannot delete or update a parent row: a fore;
Query OK, 0 rows affected (0.00 sec)

然后使用mysqlbinlog来查看一下里面的信息。可以看到除了上面的临时表操作,后面的delete也会写入binlog

use `test`;
SET TIMESTAMP=1499784283;
DROP TEMPORARY TABLE IF EXISTS `tmp`
;
# at 300
# at 341
#170711 22:44:46 server id 13386  end_log_pos 341       Table_map: `test`.`t1` mapped to number 207
#170711 22:44:46 server id 13386  end_log_pos 380       Delete_rows: table id 207 flags: STMT_END_F

BINLOG '
XuRkWRNKNAAAKQAAAFUBAAAAAM8AAAAAAAEABHRlc3QAAnQxAAEDAAA=
XuRkWRlKNAAAJwAAAHwBAAAAAM8AAAAAAAEAAf/+AwAAAP4EAAAA
';
### DELETE FROM test.t1
### WHERE
###   @1=3
### DELETE FROM test.t1
### WHERE
###   @1=4
# at 380
#170711 22:44:49 server id 13386  end_log_pos 449       Query   thread_id=176   exec_time=0     error_code=0
SET TIMESTAMP=1499784289;
COMMIT

   通过这个可以清晰的看到尽管已经做了事务回滚,但是binlog还是会记录下回滚的变更,这在某些场景中会触发主从数据不一致。

   而在GTID中,已经做了这个检查,归根结底,还是cache里面的机制,大体来说,binlog有两个cache来缓存事务的binlog:

  binlog_cache_data stmt_cache; //存放非事务表和临时表binlog
  binlog_cache_data trx_cache;  //存放事务表binlog

以上就是MySQL中GTID的几个限制和解决方案是怎样的,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL中GTID的几个限制和解决方案是怎样的

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

解决mysql中group_concat长度限制的方案

解决mysql中group_concat长度限制的方案 group_concat函数获得group_concat的最大长度两种解决方案 group_concat函数 在mysql中的group_concat函数默认支持的最大
2023-08-17

JAVA常见中文问题的解决方案是怎样的呢

JAVA常见中文问题的解决方案是怎样的呢,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。JAVA常见中文问题的解决方法以下解决方案是笔者在日常生活中遇到的,希望能
2023-06-03

CentOS系统中英文问题解决方案是怎样的

今天就跟大家聊聊有关CentOS系统中英文问题解决方案是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在CentOS系统中,文字一直是困扰我们的一个大问题。由于CentOS系统
2023-06-16

SAP Cloud for Customer的CTI呼叫中心解决方案是怎样的

这篇文章给大家介绍SAP Cloud for Customer的CTI呼叫中心解决方案是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。有同事问到title的问题,解答如下:(1) 入站调用是使用客户端应用程序传递
2023-06-04

CentOS ip_conntrack中表满和丢包的解决方法是怎样的

本篇文章给大家分享的是有关CentOS ip_conntrack中表满和丢包的解决方法是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。那么,为什么会出现 ip_connt
2023-06-10

C++在嵌入式设备开发中面临的限制和解决方案有哪些?

在嵌入式设备开发中使用 c++++ 时,因资源受限、低级硬件访问、实时限制和代码大小限制,需要采用特定的解决方案,如使用轻量级库、c++ 包装器、确定性 c++ 和仔细选择库等。 实战案例中,使用 arduino 框架,内联函数和减小预定义
C++在嵌入式设备开发中面临的限制和解决方案有哪些?
2024-05-12

在JavaWeb开发过程中遇到乱码现象的解决方案是怎样的

在JavaWeb开发过程中遇到乱码现象的解决方案是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在组件类中编写一个于用转换字符串编码的成员方法,如下所示:
2023-06-03

微软在Windows系统中为用户提供的一键解决问题的方案是怎样的

本篇文章给大家分享的是有关微软在Windows系统中为用户提供的一键解决问题的方案是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。微软在Windows系统如XP和Vist
2023-06-14

编程热搜

目录