2016-11-21 3 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タグテーブルには「タグ」と「ステータスID」があります。私はselect文だけを実行して結果を得ることができます。ただし、テーブルを作成するとエラーが発生します。 –

+0

@ GordonLinoff "複製サーバー"とはどういう意味ですか?私は、Google Cloud PlatformのMySQLサーバーに接続するDatagrip(データベース管理用のJetBrainsアプリケーション)を使用しています。これがあなたが探している情報かもしれないことを願っています。 –

答えて

2

--enforce-GTID一貫性が有効になっている場合にのみ、トランザクションの安全なステートメントをログに記録することができますので、ここに記載された操作は、このオプションを使用することはできませんということになる

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

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

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