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」が無効、またはコマンドが見つからないという問題を解決します

推薦する

alpineをベースにdockerfileで作成したtomcatイメージの実装

1.アルパインイメージをダウンロードする [root@docker43 ~]# docker pul...

MySQL ピボットテーブルについての簡単な説明

次のような製品部品表があります。一部 部品ID 部品タイプ 製品ID ---------------...

Vue はスクロール可能なポップアップウィンドウ効果を実装します

この記事では、スクロール可能なポップアップウィンドウ効果を実現するためのVueの具体的なコードを参考...

InnoDB ロック (レコード、ギャップ、Next-Key ロック) の詳細な説明

レコード ロックは、単一のインデックス レコードをロックします。レコード ロックは常にインデックスを...

MySQLのUPDATE文の落とし穴を記録する

背景最近、オンライン操作中に DML ステートメントを実行しました。これは絶対確実だと思っていました...

シェルスクリプトはNginxのaccess.logのPVを定期的にカウントし、APIに送信してデータベースに保存します。

1. PVとIPの統計一日のPV(ページビュー)をカウントする cat access.log | ...

MySQLへのJava接続の基礎となるカプセル化の詳細な説明

この記事では、Java接続MySQLの基礎となるカプセル化コードを参考までに紹介します。具体的な内容...

リンク更新ページと js 更新ページの使用例

1. リンクの使用方法:コードをコピーコードは次のとおりです。 <a href="j...

VMware Workstation のインストール Linux システム

始める段階から初心者になるまで、Linux オペレーティング システムは不可欠です。最初のステップは...

MySQLデータテーブルの基本操作:テーブル構造の操作、フィールド操作例の分析

この記事では、テーブル構造操作やフィールド操作など、MySQL データ テーブルの基本的な操作につい...

MySQLがクエリキャッシュをキャンセルした理由

MySQL には以前、クエリ キャッシュ (Query Cache) がありました。8.0 以降では...

MYSQL クエリの効率を向上させる 10 の SQL ステートメント最適化テクニック

MySQL データベースの実行効率はプログラムの実行速度に大きな影響を与えます。データベースの効率的...

html5 の新しいメソッドを使用して JavaScript で要素クラス名を操作する方法の詳細な説明

目次1. classList属性2. 実用化以前の JavaScript では、最初にクラス属性を取...

Vue.jsは9グリッド画像表示モジュールを実装します

Vue.js を使用して、クリックしてズームできる 9 グリッドの画像表示モジュールを作成しました。...