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 ... SELECT
は、ステートメントベースのレプリケーションには安全ではありません。行ベースのレプリケーションを使用する場合、このステートメントは実際には2つの別個のイベントとしてログに記録されます。1つはテーブルの作成用、もう1つはソーステーブルから作成したばかりの新しいテーブルへの行の挿入用です。
このステートメントがトランザクション内で実行される場合、これらの2つのイベントが同じトランザクション識別子を受け取る可能性があります。つまり、挿入を含むトランザクションがスレーブによってスキップされます。したがって、CREATE TABLE ... SELECT
は、GTIDベースのレプリケーションを使用する場合はサポートされません。
別の方法でエラーを修正する場合は、テーブルを簡潔に作成し、次のように個別に挿入できます。
CREATE TABLE new_table LIKE old_table;
INSERT new_table SELECT * FROM old_table;
ここから https://dev.mysql.com/doc/refman/5.6/en/replication-options-gtids.html
--enforce-gtid-consistency
が有効になっているため、ここにリストされている操作はこのオプションでは使用できません。
CREATE TABLE ... SELECT
ステートメントCREATE TEMPORARY TABLE
トランザクション内のステートメント- トランザクションテーブルと非トランザクションテーブルの両方を更新するトランザクションまたはステートメント
GTIDセットを強制しているようです。したがって、このステートメントは許可されていません。
スレーブで複製する必要がない場合は、binlogをオフにすることができます。
set sql_log_bin=0;
create table ... select ...