簡體   English   中英

MySQL GTID 一致性違規

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM