七. GTID的限制以及解决方案

7.1 事务中混合多个存储引擎,会产生多个GTID。

当使用GTID,在同一个事务中,更新包括了非事务引擎(MyISAM)和事务引擎(InnoDB)表的操作,就会导致多个GTID分配给同一个事务。

mysql> CREATE TABLE `t_test_myisam` (
-> `id` int(11) NOT NULL,
-> `name` varchar(10) DEFAULT NULL,
-> PRIMARY KEY (`id`)
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.01 sec) mysql> begin;
Query OK, 0 rows affected (0.00 sec) mysql> update t_test set name ='aa1' where id =1;
Query OK, 1 row affected (0.04 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> insert into t_test_myisam values(1,'aa2');
ERROR 1785 (HY000): Statement violates GTID consistency:
Updates to non-transactional tables can only be done in either autocommitted statements
or single-statement transactions, and never in the same statement as updates to transactional tables.

7.2 主从表的存储引擎不一致,会导致数据不一致。

7.3 基于GTID复制,不支持CREATE TABLE....SELECT 语句

该语句实际上被记录为两个单独的事件,一个是创建表,另一个插入数据。当事务执行该语句时,在一些情况下,这两个事件可能接收到相同的事务ID,导致插入的事件被从库跳过。

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

解决方案:

mysql> create table t_test_new like t_test;
Query OK, 0 rows affected (0.06 sec) mysql> insert into t_test_new select * from t_test;
Query OK, 5 rows affected (0.03 sec)
Records: 5 Duplicates: 0 Warnings: 0

7.4 不支持事务里包含 CREAT TEMPORARY TABLE和DROP TEMPORARY TABLE

在 autocommit=1的情况下,可以创建临时表,MASTER创建临时表不产生GTID信息,所以不会同步到SLAVE。

#事务里
mysql> begin;
Query OK, 0 rows affected (0.00 sec) mysql> CREATE TEMPORARY TABLE TMP_TEST(ID int);
ERROR 1787 (HY000): Statement violates GTID consistency:
CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE can only be executed outside transactional context.
These statements are also not allowed in a function or trigger because functions and triggers are
also considered to be multi-statement transactions. #事务外
mysql> CREATE TEMPORARY TABLE TMP_TEST(ID int);
Query OK, 0 rows affected (0.00 sec)

MySQL5.7中cache里面的机制,大体来说,binlog有两个cache来缓存事务的binlog

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

GTID中,会检查这两个cache,如有冲突,则抛出错误

7.5 不推荐在GTID模式的实例上进行 mysql_upgrade

归根结底,还是因为mysql_upgrade的过程中要创建或修改系统表(非事务引擎)

MySQL GTID (四)的更多相关文章

  1. mysql gtid 主从复制

    基于GTID环境搭建主从复制 1.环境 ----------------------------------------------------------| |mysql版本 | 5.7.14 | ...

  2. MySQL GTID 错误处理汇总

    MySQL GTID是在传统的mysql主从复制的基础之上演化而来的产物,即通过UUID加上事务ID的方式来确保每一个事物的唯一性.这样的操作方式使得我们不再需要关心所谓的log_file和log_P ...

  3. MySQL GTID (二)

    MySQL GTID 系列之二 三.在线将GTID转化为传统模式 环境见上篇系列文章 关闭GTID,不用停止服务,不影响线上业务 3.1 关闭GTID复制,调整为传统复制 #SLVAE实例上停止复制 ...

  4. MySQL优化四(优化表结构)

    body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-top: 10 ...

  5. Python/MySQL(四、MySQL数据库操作)

    Python/MySQL(四.MySQL数据库操作) 一.数据库条件语句: case when id>9 then ture else false 二.三元运算: if(isnull(xx)0, ...

  6. day40 python MySQL【四】 之 【索引】【视图】【触发器】【存储过程】【函数】

    MySQL[四] 之 [索引][视图][触发器][存储过程][函数]   1.索引 索引相当于图书的目录,可以帮助用户快速的找到需要的内容. 数据库利用各种各样的快速定位技术,能够大大提高查询效率.特 ...

  7. 一、初识MySQL数据库 二、搭建MySQL数据库(重点) 三、使用MySQL数据库 四、认识MySQL数据库的数据类型 五、操作MySQL数据库的数据(重点)

    一.初识MySQL数据库 ###<1>数据库概述     1. 数据库         长期存储在计算机内的,由组织的可共享的数据集合         存储数据的仓库         文件 ...

  8. MySQL GTID你知多少【转】

    MySQL在5.6的版本推出了GTID复制,相比传统的复制,GTID复制对于运维更加友好,这个事务是谁产⽣,产⽣多少事务,⾮常直接的标识出来,当然GTID也有限制,对于什么是GTID可以参考我之前的文 ...

  9. MySQL GTID (一)

    MySQL GTID 系列之一 一.GTID相关概念 GTID:全局事务标识符,MySQL5.6版本开始在主从复制中推出的重量级特性. 每提交一个事务,当前执行线程都会拿到一个给定复制环境中唯一的GT ...

随机推荐

  1. linux下升级npm以及node

    npm升级 废话不多说,直接讲步骤.先从容易的开始,升级npm. npm这款包管理工具虽然一直被人们诟病,很多人都推荐使用yarn,但其使用人数还是不见减少,况且npm都是随node同时安装好的,一时 ...

  2. UVA-10816 Travel in Desert (最小瓶颈最短路)

    题目大意:给一张无向图,图中的每条边都有两个权值,长度d和热度r.找出从起点到终点的一条最大热度最小的路径,如果这样的路径有多条,选择一个最短的. 题目分析:如果只考虑最小的最大热度,那么本题就是一个 ...

  3. 基于Oracle的SQL优化(崔华著)-学习笔记

    201704171025 01. 列rows记录的就是执行计划中每一个执行步骤所对应的Cardinality的值 列Cost(%CPU)记录的就是执行计划中的每一个执行步骤对应的成本 02. Comp ...

  4. jsr303 参考表

    下面是主要的验证注解及说明: 注解 适用的数据类型 说明 @AssertFalse Boolean, boolean 验证注解的元素值是false @AssertTrue Boolean, boole ...

  5. linux提权辅助工具(二):linux-exploit-suggester-2.pl

    来自:https://github.com/jondonas/linux-exploit-suggester-2/blob/master/linux-exploit-suggester-2.pl #! ...

  6. DIY远程控制开关(tiny6410+LED+yeelink+curl)

    上一次,介绍了如何实现远程监控室内温度,大家伙反响还是很热烈的,笔者很欣慰,独乐乐不如众乐乐啊.不过话说回来,那个实现只能是远程监测家中温度,假如发现家里热得很,想远程打开空调开关提前降降温,回家后不 ...

  7. webpack 提升90%的构建速度 HardSourceWebpackPlugin

    HardSourceWebpackPlugin 插件 不能提升第一次构建的速度,但对于第二次构建能提升99%的构建速度 第一次构建: 第二次: 提升了..,算不出来,反正就是很多啦~~~ npm in ...

  8. .NET CORE微服务实践

    .NET CORE微服务实践 https://www.cnblogs.com/zengqinglei/p/9570343.html .NET CORE 实践部署架构图 实践源码:https://git ...

  9. 【项目经验】macpro上安装office办公软件并破解

    链接: https://pan.baidu.com/s/1i5hyKO9 密码: 7zjf 如果本机原有office,先卸载 双击pkg文件安装office for Mac 2016 安装完不要做打开 ...

  10. 去掉PowerDesigner生成SQL脚本中字段名带的引号

    使用PowerDesigner生成数据库建表SQL脚本时,尤其是Oracle数据库时,表名一般会带引号.其实加引号是PL/SQL的规范,数据库会严格按照“”中的名称建表,如果没有“”,会按照ORACL ...