2016-11-21 8 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 для управления базой данных), подключающееся к серверу MySQL на Google Cloud Platform. Надеюсь, это может быть информация, которую вы ищете. –

ответ

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 небезопасен для репликации на основе инструкций. При использовании репликации на основе строк этот оператор фактически регистрируется как два отдельных события - один для создания таблицы, а другой для вставки строк из исходной таблицы в только что созданную новую таблицу.

Когда этот оператор выполняется в рамках транзакции, в некоторых случаях для этих двух событий возможно получение одного и того же идентификатора транзакции, что означает, что транзакция, содержащая вставки, пропускается ведомым. Поэтому CREATE TABLE ... SELECT не поддерживается при использовании репликации на основе GTID.