我正在尝试从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语句以避免违规?
答案 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 ...