MySQL gtid特性

问题

MySQL中有两种很方便的建表的语句:

  • create table t1 like t2
  • create table t1 select * from t2
  • 第一种创建出来的t1表其表结构和t2完全一样,包括主键以及index
  • 第二种创建出来的t1只有字段以及字段类型和t2完全一样不包含主键以及index字段,同时从t2 select出来的数据会插入t1

在升级MySQL到5.7之后在使用过程中遇到了一些问题,其中一个就是使用create table t1 select * from t2的时候会报错:

ERROR 1786 (HY000): Statement violates GTID consistency: CREATE TABLE … SELECT.

解决方法

字面意思是违反了gtid一致性,解决方法就是执行show variable like ‘%gtid%’会看到两个gtid相关的配置项,之后修改将其关闭之后再执行上面的sql语句就没有问题了

注意:改动此配置会影响到现有MySQL主从关系导致同步失败

根源

那么这个gtid到底是啥?又为会影响到以上的建表语句呢。

首先来说,gtid是glob transaction id的缩写,即:全局事务id,5.6版本就已经开始试用,5.7开始正式推广的,之前在主从数据库进行数据同步的时候都是使用的binlog的稳健偏移量来实现,比较麻烦。GTID的组成是source_id:transaction_id生成的便于识别使用起来方便。到这里我们就知道了,这个特性涉及到了事务

Since only transactionally safe statements can be logged when --enforce-gtid-consistency is enabled, it follows that the operations listed here cannot be used with this option:

create table ti select * from t2 这条语句在执行时会被拆分成两条语句create table like 和insert into为了事务的强一致性以上三种sql是禁止的

非事务安全的sql可能会导致binlog错误写入,进而导致主从的mismatch,所以应该是处于这种考虑,在enforece-gitd-consistency模式下禁止执行有风险的sql

相关Bug

转载请注明来源链接 http://just4fun.im/2017/10/04/MySQL-gtid相关/ 尊重知识,谢谢:)