2016-11-21 72 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。