web-dev-qa-db-ja.com

MySQL GTID整合性違反

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ステートメントを修正するにはどうすればよいですか?

16
Jiho Noh

CREATE TABLE ... SELECTは、ステートメントベースのレプリケーションには安全ではありません。行ベースのレプリケーションを使用する場合、このステートメントは実際には2つの別個のイベントとしてログに記録されます。1つはテーブルの作成用、もう1つはソーステーブルから作成したばかりの新しいテーブルへの行の挿入用です。

このステートメントがトランザクション内で実行される場合、これらの2つのイベントが同じトランザクション識別子を受け取る可能性があります。つまり、挿入を含むトランザクションがスレーブによってスキップされます。したがって、CREATE TABLE ... SELECTは、GTIDベースのレプリケーションを使用する場合はサポートされません。

9
DarbyM

別の方法でエラーを修正する場合は、テーブルを簡潔に作成し、次のように個別に挿入できます。

CREATE TABLE new_table LIKE old_table; 
INSERT new_table SELECT * FROM old_table;
10
David Thomas

ここから https://dev.mysql.com/doc/refman/5.6/en/replication-options-gtids.html

--enforce-gtid-consistencyが有効になっているため、ここにリストされている操作はこのオプションでは使用できません。

  • CREATE TABLE ... SELECTステートメント
  • CREATE TEMPORARY TABLEトランザクション内のステートメント
  • トランザクションテーブルと非トランザクションテーブルの両方を更新するトランザクションまたはステートメント

GTIDセットを強制しているようです。したがって、このステートメントは許可されていません。

7
Hogan

スレーブで複製する必要がない場合は、binlogをオフにすることができます。

set sql_log_bin=0;
create table ... select ...
0
Sasha Pachev