MySQL GTID 一致性违规

MySQL GTID consistency violation

我正在尝试从 select 语句创建一个 table,它给我一个 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 语句以避免违规?

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

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 ... SELECT statements
  • CREATE TEMPORARY TABLE statements inside transactions
  • Transactions or statements that update both transactional and non-transactional tables

您似乎强制设置了 GTID。所以这种说法是不允许的。

CREATE TABLE ... SELECT 对于基于语句的复制是不安全的。使用基于行的复制时,此语句实际上记录为两个单独的事件 — 一个用于创建 table,另一个用于将行从源 table 插入到新的 [=16] =] 刚刚创建。

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

如果您想以其他方式修复错误,您可以简洁地创建 table 并单独插入:

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

如果不想复制到slave上,可以关闭binlog:

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