MySQL GTID一致性违规

时间:2016-11-21 15:45:48

标签: mysql sql gtid

我正在尝试从select语句创建一个表,它会给我一个GTID一致性违规。 [HY000][1786] Statement violates GTID consistency: CREATE TABLE ... SELECT.

create TABLE tags_mentions as
    select t.*, st.ts, m.user_id_from, m.user_id_to from Tags as t join Mentions as m
        on t.status_id = m.status_id AND m.user_id_from != m.user_id_to
        left join Statuses as st on t.status_id = st.status_id;

什么是GTID一致性,如何修复SQL语句以避免违规?

4 个答案:

答案 0 :(得分:5)

从这里https://dev.mysql.com/doc/refman/5.6/en/replication-options-gtids.html

  

由于在启用--enforce-gtid-consistency时只能记录事务安全语句,因此此处列出的操作不能与此选项一起使用:

     
      
  • CREATE TABLE ... SELECT陈述
  •   事务中的
  • CREATE TEMPORARY TABLE个陈述
  •   
  • 更新事务和非事务表的事务或语句
  •   

您似乎已强制执行GTID设置。所以这个陈述是不允许的。

答案 1 :(得分:5)

CREATE TABLE ... SELECT对于基于语句的复制不安全。使用基于行的复制时,此语句实际上记录为两个单独的事件 - 一个用于创建表,另一个用于将源表中的行插入刚刚创建的新表中。

当在事务中执行此语句时,在某些情况下,这两个事件可能会接收相同的事务标识符,这意味着从属设备将跳过包含插入的事务。因此,使用基于GTID的复制时不支持CREATE TABLE ... SELECT

答案 2 :(得分:1)

如果您想以其他方式解决该错误,则可以简洁地创建表并使用以下命令分别插入:

CREATE TABLE new_table LIKE old_table; 
INSERT new_table SELECT * FROM old_table;

答案 3 :(得分:0)

如果您不想在从服务器上复制它,则可以关闭二进制日志:

set sql_log_bin=0;
create table ... select ...