25

我正在尝试从 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

4 回答 4

34

如果您想以另一种方式修复错误,您可以简洁地创建表并单独插入:

CREATE TABLE new_table LIKE old_table; 
INSERT new_table SELECT * FROM old_table;
于 2019-05-09T23:06:20.617 回答
16

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

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

于 2017-04-02T19:36:52.380 回答
9

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

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

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

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

于 2016-11-21T19:31:45.023 回答
0

如果你不想在slave上复制它,你可以关闭binlog:

set sql_log_bin=0;
create table ... select ...
于 2019-09-05T01:51:48.173 回答