2016-11-21 150 views
3

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

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语句,以避免违规?

+0

您使用的是复制服务器吗? –

+0

@Hogan标签表有'标签'和'status_id'。我可以单独运行select语句并获得结果。但是,创建表格会导致错误。 –

+0

@GordonLinoff你是什么意思的“复制服务器”?我正在使用Datagrip(JetBrains应用程序进行数据库管理)连接到Google Cloud Platform上的MySQL服务器。希望这可能是你正在寻找的信息。 –

回答

2

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

因为只有当事务启用 --enforce-GTID一致性安全的语句,可以记录,它遵循这里列出的操作不能与此选项一起使用:

CREATE TABLE ... SELECT statements 

CREATE TEMPORARY TABLE statements inside transactions 

Transactions or statements that update both transactional and nontransactional tables 

您似乎强制执行GTID集。所以这个声明是不允许的。

+0

这是很棒的信息。你有一个想法,为什么CREATE TABLE ... SELECT语句可能是不安全的?这是因为SELECT语句的结果在任何时候都可能不同吗?我是否需要root权限才能禁用此选项? –

+0

可能是因为它在构建最终表之前使用临时非事务表,但我不确定。 – Hogan

2

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

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