2016-11-21 3 views
3

Ich versuche, eine Tabelle aus einer Select-Anweisung zu erstellen, und es gibt mir eine GTID Konsistenzverletzung. [HY000][1786] Statement violates GTID consistency: CREATE TABLE ... SELECT.MySQL GTID Konsistenz Verletzung

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; 

Was ist GTID Konsistenz, und wie kann ich die SQL-Anweisung zu beheben, die Verletzung zu vermeiden?

+0

Verwenden Sie einen replizierten Server? –

+0

@Hogan Tags-Tabellen haben 'tag' und 'status_id'. Ich kann die select-Anweisung alleine ausführen und die Ergebnisse abrufen. Die Erstellung der Tabelle gibt jedoch den Fehler. –

+0

@GordonLinoff Was meinen Sie mit "replizierten Server"? Ich verwende Datagrip (JetBrains-Anwendung für die Datenbankverwaltung), um eine Verbindung zum MySQL-Server auf der Google Cloud Platform herzustellen. Hoffe, das könnte die Information sein, nach der Sie suchen. –

Antwort

2

Von hier https://dev.mysql.com/doc/refman/5.6/en/replication-options-gtids.html

Da nur transaktions sicheren Aussagen protokolliert werden können, wenn --enforce-GTID-Konsistenz aktiviert ist, folgt daraus, dass die hier aufgeführten Operationen können mit dieser Option nicht verwendet werden:

CREATE TABLE ... SELECT statements 

CREATE TEMPORARY TABLE statements inside transactions 

Transactions or statements that update both transactional and nontransactional tables 

Sie scheinen GTID Set erzwingen. Also diese Aussage ist nicht erlaubt.

+0

Dies ist eine großartige Information. Haben Sie eine Idee, warum CREATE TABLE ... SELECT-Anweisung unsicher sein kann? Liegt es daran, dass die Ergebnisse der SELECT-Anweisung jederzeit anders sein können? Benötige ich root-Berechtigung, um diese Option zu deaktivieren? –

+0

Wahrscheinlich, weil es eine temporäre nicht transaktionale Tabelle verwendet, bevor es die finale Tabelle erstellt, aber ich weiß es nicht sicher. – Hogan

2

CREATE TABLE ... SELECT ist nicht für die statementbasierte Replikation sicher. Bei der zeilenbasierten Replikation wird diese Anweisung tatsächlich als zwei separate Ereignisse protokolliert - eines für die Erstellung der Tabelle und ein weiteres für das Einfügen von Zeilen aus der Quelltabelle in die gerade erstellte neue Tabelle.

Wenn diese Anweisung innerhalb einer Transaktion ausgeführt wird, ist es in einigen Fällen möglich, dass diese beiden Ereignisse dieselbe Transaktionskennung erhalten, was bedeutet, dass die Transaktion, die die Einfügungen enthält, vom Slave übersprungen wird. Daher wird CREATE TABLE ... SELECT bei der GTID-basierten Replikation nicht unterstützt.