MySQL5.6 GTIDモードで同期レプリケーションエラーをスキップできない問題の解決方法

MySQL5.6 GTIDモードで同期レプリケーションエラーをスキップできない問題の解決方法

データベースバージョン:

mysql> select version();

+------------+
| バージョン() |
+------------+
| 5.6.10-ログ |
+------------+
セット内の1行(0.02秒)

同期レプリケーション情報:

mysql> show slave status\G;

************************** 1. 行 ****************************
Slave_IO_State: マスターがイベントを送信するのを待機中
マスターホスト: 192.168.8.25
マスターユーザー: repl
マスターポート: 3306
接続再試行: 60
マスターログファイル:mysql-bin.000007
読み取りマスターログ位置: 5036
リレーログファイル: M2-relay-bin.000008
リレーログ位置: 408
リレーマスターログファイル: mysql-bin.000007
スレーブIO実行中: はい
スレーブSQL実行中: いいえ
レプリケート_Do_DB:
レプリケート_無視_DB: mysql
テーブルの複製:
無視テーブルを複製:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
最終エラー番号: 1062
Last_Error: テーブル test.t で Write_rows イベントを実行できませんでした。エントリ '12' が重複しています。
キー 'PRIMARY'、Error_code: 1062、ハンドラー エラー HA_ERR_FOUND_DUPP_KEY、イベントのマスター ログ mysql-bin.000007、
終了ログ位置 2267
スキップカウンタ: 0
実行マスターログポジション: 2045
リレーログスペース: 3810
Until_Condition: なし
ログファイルまで:
ログ位置まで: 0
マスターSSL許可: いいえ
マスターSSLCAファイル:
マスターSSLCAパス:
マスターSSL証明書:
マスターSSL暗号:
マスターSSLキー:
マスターより遅れている秒数: NULL
Master_SSL_Verify_Server_Cert: いいえ
最終IOエラー番号: 0
最後のIOエラー:
最終SQLエラー番号: 1062
Last_SQL_Error: テーブル test.t で Write_rows イベントを実行できませんでした。エントリ '12' が重複しています。
キー 'PRIMARY'、Error_code: 1062、ハンドラー エラー HA_ERR_FOUND_DUPP_KEY、イベントのマスター ログ mysql-bin.000007、
終了ログ位置 2267
Replicate_Ignore_Server_Ids:
マスターサーバー ID: 25
マスター_UUID: cf716fda-74e2-11e2-b7b7-000c290a6b8f
マスター情報ファイル: /usr/local/mysql/data2/master.info
SQL_遅延: 0
SQL_残り遅延: NULL
スレーブSQL実行状態:
マスター再試行回数: 86400
マスターバインド:
最終IOエラータイムスタンプ:
最終 SQL エラー タイムスタンプ: 130313 07:24:43
マスターSSL証明書:
マスターSSLCrlパス:
取得済み_Gtid_セット: cf716fda-74e2-11e2-b7b7-000c290a6b8f:141-151
実行されたGtidセット: cf716fda-74e2-11e2-b7b7-000c290a6b8f:1-140
自動位置: 1
セット内の1行(0.02秒)

エラー:
クエリが指定されていません

主キーの競合を促します。テスト機なのでそのままスキップします。

mysql> set global sql_slave_skip_counter=1;

エラー 1858 (HY000): サーバーが GTID_MODE = ON で実行されている場合、sql_slave_skip_counter を設定することはできません。
代わりに、スキップしたいトランザクションごとに、そのトランザクションと同じGTIDを持つ空のトランザクションを生成します。

ヒント: GTID モードで実行されるため、 sql_slave_skip_counter構文はサポートされていません。スキップする場合は、トランザクション ID を null 値に設定する必要があります。
これが唯一の方法のようです。

mysql> show global variables like '%GTID%';

+--------------------------+------------------------------------------+
| 変数名 | 値 |
+--------------------------+------------------------------------------+
| 強制GTID一貫性 | オン |
| gtid_executed | cf716fda-74e2-11e2-b7b7-000c290a6b8f:1-140 |
| gtid_mode | オン |
| gtid_owned | |
| gtid_purged | cf716fda-74e2-11e2-b7b7-000c290a6b8f:1-140 |
+--------------------------+------------------------------------------+
セットに5行(0.04秒)

mysql> グローバル gtid_executed='' を設定します。
エラー 1238 (HY000): 変数 'gtid_executed' は読み取り専用変数です
マイSQL>
mysql> グローバル gtid_purged='' を設定します。

エラー 1840 (HY000): GTID_PURGED は、GTID_EXECUTED が空の場合にのみ設定できます。
イライラします。直接的な設定が機能しません。

マニュアルを確認した後、マスターのリセットを実行する必要があることがわかりました (注意: スレーブで実行し、マスターでは実行しないでください)。

mysql> マスターをリセットします。
クエリは正常、影響を受けた行は 0 行 (0.16 秒)

mysql> スレーブをリセットします。
エラー 1198 (HY000): この操作は実行中のスレーブでは実行できません。まず STOP SLAVE を実行してください。
mysql> スレーブを停止します。
クエリは正常、影響を受けた行は 0 行 (0.08 秒)

mysql> スレーブをリセットします。
クエリは正常、影響を受けた行は 0 行 (0.16 秒)

reset slave を実行する目的は、master.info と relay-log.info をクリアして、後でマスターをマスター スレーブ レプリケーションに変更できるようにすることです。
先ほどの gtid_purged ポイントを覚えていますか? 次のポイントをリセットするだけです。

手順は次のとおりです。

mysql> '%GTID%' のようなグローバル変数を表示します。
+--------------------------+-------+
| 変数名 | 値 |
+--------------------------+-------+
| 強制GTID一貫性 | オン |
| gtid_executed | |
| gtid_mode | オン |
| gtid_owned | |
| gtid_purged | |
+--------------------------+-------+
セットに5行(0.06秒)

mysql> グローバル gtid_purged='cf716fda-74e2-11e2-b7b7-000c290a6b8f:1-141' を設定します。
クエリは正常、影響を受けた行は 0 行 (0.16 秒)

mysql> マスターを MASTER_HOST='192.168.8.25'、MASTER_USER='repl'、MASTER_PASSWORD='repl' に変更します
、MASTER_AUTO_POSITION = 1;
クエリは正常、影響を受けた行は 0 行、警告は 2 個 (0.32 秒)

mysql> スレーブを起動します。
クエリは正常、影響を受けた行は 0 行 (0.13 秒)

mysql> スレーブステータスを表示します\G;
************************** 1. 行 ****************************
Slave_IO_State: マスターがイベントを送信するのを待機中
マスターホスト: 192.168.8.25
マスターユーザー: repl
マスターポート: 3306
接続再試行: 60
マスターログファイル:mysql-bin.000007
読み取りマスターログ位置: 5036
リレーログファイル: M2-relay-bin.000008
リレーログ位置: 408
リレーマスターログファイル: mysql-bin.000007
スレーブIO実行中: はい
スレーブSQL実行中: いいえ
レプリケート_Do_DB:
レプリケート_無視_DB: mysql
テーブルの複製:
無視テーブルを複製:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
最終エラー番号: 1050
Last_Error: クエリでエラー「テーブル 't0' は既に存在します」が発生しました。
デフォルトのデータベース: 'test'。クエリ: 'create table t0 like t'
スキップカウンタ: 0
実行マスターログ位置: 2298
リレーログスペース: 3557
Until_Condition: なし
ログファイルまで:
ログ位置まで: 0
マスターSSL許可: いいえ
マスターSSLCAファイル:
マスターSSLCAパス:
マスターSSL証明書:
マスターSSL暗号:
マスターSSLキー:
マスターより遅れている秒数: NULL
Master_SSL_Verify_Server_Cert: いいえ
最終IOエラー番号: 0
最後のIOエラー:
最終SQLエラー番号: 1050
Last_SQL_Error: クエリでエラー「テーブル 't0' は既に存在します」が発生しました。
デフォルトのデータベース: 'test'。クエリ: 'create table t0 like t'
Replicate_Ignore_Server_Ids:
マスターサーバー ID: 25
マスター_UUID: cf716fda-74e2-11e2-b7b7-000c290a6b8f
マスター情報ファイル: /usr/local/mysql/data2/master.info
SQL_遅延: 0
SQL_残り遅延: NULL
スレーブSQL実行状態:
マスター再試行回数: 86400
マスターバインド:
最終IOエラータイムスタンプ:
最終 SQL エラー タイムスタンプ: 130313 07:50:42
マスターSSL証明書:
マスターSSLCrlパス:
取得済み_Gtid_セット: cf716fda-74e2-11e2-b7b7-000c290a6b8f:142-151
実行されたGtidセット: cf716fda-74e2-11e2-b7b7-000c290a6b8f:1-141
自動位置: 1
セット内の1行(0.02秒)

エラー:
クエリが指定されていません
### ご覧のとおり、ここでのエラー メッセージが異なります。同期レプリケーションが正常になるまでこの方法を繰り返します。

mysql> スレーブを停止します。
クエリは正常、影響を受けた行は 0 行 (0.07 秒)

mysql> マスターをリセットします。
クエリは正常、影響を受けた行は 0 行 (0.17 秒)

mysql> スレーブをリセットします。
クエリは正常、影響を受けた行は 0 行 (0.16 秒)

mysql> グローバル gtid_purged='cf716fda-74e2-11e2-b7b7-000c290a6b8f:1-151' を設定します。
クエリは正常、影響を受けた行は 0 行 (0.13 秒)

mysql> マスターを MASTER_HOST='192.168.8.25'、MASTER_USER='repl'、MASTER_PASSWORD='repl' に変更します
、MASTER_AUTO_POSITION = 1;
クエリは正常、影響を受けた行は 0 行、警告は 2 件 (0.33 秒)

mysql> スレーブを起動します。
クエリは正常、影響を受けた行は 0 行 (0.11 秒)

mysql> スレーブステータスを表示します\G;
************************** 1. 行 ****************************
Slave_IO_State: マスターがイベントを送信するのを待機中
マスターホスト: 192.168.8.25
マスターユーザー: repl
マスターポート: 3306
接続再試行: 60
マスターログファイル:mysql-bin.000007
読み取りマスターログ位置: 5036
リレーログファイル: M2-relay-bin.000008
リレーログ位置: 408
リレーマスターログファイル: mysql-bin.000007
スレーブIO実行中: はい
スレーブSQL実行中: はい
レプリケート_Do_DB:
レプリケート_無視_DB: mysql
テーブルの複製:
無視テーブルを複製:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
最終エラー番号: 0
最終エラー:
スキップカウンタ: 0
実行マスターログ位置: 5036
リレーログスペース: 819
Until_Condition: なし
ログファイルまで:
ログ位置まで: 0
マスターSSL許可: いいえ
マスターSSLCAファイル:
マスターSSLCAパス:
マスターSSL証明書:
マスターSSL暗号:
マスターSSLキー:
マスターより遅れている秒数: 0
Master_SSL_Verify_Server_Cert: いいえ
最終IOエラー番号: 0
最後のIOエラー:
最終SQLエラー番号: 0
最後のSQLエラー:
Replicate_Ignore_Server_Ids:
マスターサーバー ID: 25
マスター_UUID: cf716fda-74e2-11e2-b7b7-000c290a6b8f
マスター情報ファイル: /usr/local/mysql/data2/master.info
SQL_遅延: 0
SQL_残り遅延: NULL
Slave_SQL_Running_State: スレーブはすべてのリレー ログを読み取りました。スレーブ I/O スレッドがそれを更新するのを待機しています。
マスター再試行回数: 86400
マスターバインド:
最終IOエラータイムスタンプ:
最終SQLエラータイムスタンプ:
マスターSSL証明書:
マスターSSLCrlパス:
取得済み_Gtid_Set:
実行されたGtidセット: cf716fda-74e2-11e2-b7b7-000c290a6b8f:1-151
自動位置: 1
セット内の1行(0.01秒)

エラー:
クエリが指定されていません

ハハハ、やっと解決しました。本当に面倒な問題でした。より良く、より便利な解決策がありましたら、私に返信してください。ありがとうございます。

以下もご興味があるかもしれません:
  • MySQL マスタースレーブレプリケーションの GTID モードの詳細な紹介
  • MYSQL データベース GTID はマスタースレーブレプリケーションを実現します (超便利)
  • MySQL 5.7 で業務を停止せずに従来のレプリケーションを GTID レプリケーションに変更する例
  • MySQL マスタースレーブレプリケーションの実践の詳細説明 - GTID ベースのレプリケーション
  • GTID に基づく MySQL 5.6 マスタースレーブ レプリケーション
  • MySQL での GTID レプリケーション プロトコルと停止プロトコルの使用に関するチュートリアル
  • MySQL レプリケーションにおける GTID レプリケーションの具体的な使用法

<<:  jQuery をベースにリスト ループ スクロールを実装するためのヒント (超簡単)

>>:  よく使われるLinuxコマンド「ll」が無効、またはコマンドが見つからないという問題を解決します

推薦する

任意の長さの配列を作成または埋めるための JS のヒントの要約

目次序文直接充填方式for ループの push() メソッド配列コンストラクタメソッド配列コンストラ...

CSS コンテナ背景 10 色グラデーション デモ (linear-gradient())

文法 背景: linear-gradient(direction,color-stop1,color...

Tomcat 実行時の JVM エンコーディングの問題を修正

質問:最近、プロジェクトを展開すると文字化けしたデータが出てきました。確認したところ、プロジェクトは...

CSS フィルターを使用してマウスオーバー効果を記述する例

CSSフィルターを使用してマウスオーバー効果を記述する <div class="fi...

メンテナンスしやすい CSS コードを書くための 5 つのガイドライン

1. スタイルシートの先頭にコメント ブロックを追加して、スタイルシートの作成日、作成者、タグ、その...

MySQL の複合インデックスはどのように機能しますか?

目次背景複合インデックスを理解する左端一致原則フィールド順序の影響複合インデックスは単一のインデック...

ドロップダウンメニュー効果を実現するJavaScript

参考までに、JavaScriptを使用してドロップダウンメニューを実装します。具体的な内容は次のとお...

Ubuntuがネットワークに接続できない場合の解決策

仮想マシン内の Ubuntu がネットワークに接続できない場合の効果的な解決策: 1. Ubuntu...

ソースコードの観点からキープアライブコンポーネントのキャッシュ原理に答える

今日は、早速本題に入り、面接中に尋ねられた質問、つまりキープアライブ コンポーネントのキャッシュ原理...

Dockerコンテナ内の設定ファイルの変更の実装

1. コンテナに入るdocker run [オプション] イメージ名 [起動コンテナに渡されるコマン...

MySQL クエリ キャッシュとバッファ プール

1. キャッシュ - クエリキャッシュ次の図は、MySQL 公式サイトから提供されています: MyS...

Linux サーバーが処理できる接続数をご存知ですか?

序文まず、TCP 接続を識別する方法を見てみましょう。システムは、(src_ip、src_port、...

count(1)、count(*)、count(列名)の実行の違いの詳細な説明

実施効果: 1. count(1) と count(*)テーブル内のデータ量が多い場合、テーブルを分...

ChromeとIEに対応したWMPに埋め込まれたHTMLの詳細な紹介

実際には、対応する記述方法は多数ありますが、最も一般的なのは object + embedded で...

5 分で vue-cli3 を使用してプロジェクトを作成する方法を説明します (初心者向けガイド)

目次1. Vue環境を構築する2. Vue スキャフォールディングツール3. プロジェクトを作成する...