[英]MySQL GTID consistency violation
我试图从 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 语句以避免违规?
如果您想以另一种方式修复错误,您可以简洁地创建表并单独插入:
CREATE TABLE new_table LIKE old_table;
INSERT new_table SELECT * FROM old_table;
CREATE TABLE ... SELECT
对于基于语句的复制是不安全的。 当使用基于行的复制时,这个语句实际上被记录为两个单独的事件——一个用于创建表,另一个用于将行从源表插入到刚刚创建的新表中。
当这个语句在一个事务中执行时,在某些情况下这两个事件有可能接收到相同的事务标识符,这意味着包含插入的事务被从属跳过。 因此,使用基于 GTID 的复制时不支持CREATE TABLE ... SELECT
。
从这里https://dev.mysql.com/doc/refman/5.6/en/replication-options-gtids.html
由于在启用
--enforce-gtid-consistency
时--enforce-gtid-consistency
记录事务安全语句,因此此处列出的操作不能与此选项一起使用:
CREATE TABLE ... SELECT
语句- 在事务中
CREATE TEMPORARY TABLE
语句- 同时更新事务表和非事务表的事务或语句
您似乎已强制设置 GTID。 所以这个说法是不允许的。
如果你不想在slave上复制它,你可以关闭binlog:
set sql_log_bin=0;
create table ... select ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.