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

推薦する

Vue+echart で 2 列チャートを実現

この記事では、vue+echart を使って二重列チャートを実現するための具体的なコードを参考までに...

HTML で div+CSS を使用してシンプルな矢印アイコンを実装するコード

ウェブデザインでは、ウェブページを美しく見せるために矢印を装飾としてよく使用します。現在、多くのウェ...

MySQL ユーザー権限管理の実装

1. MySQL の権限の概要MySQL には、権限を制御する 4 つのテーブルがあります。user...

Linux で time(NULL) 関数と localtime() を使用して現在の時刻を取得する方法

time(); 関数関数プロトタイプ: time_t time(time_t *timer)関数の目...

IE6/7 は混乱するだろう: 空のテキスト ノードの高さの問題

序文: ietester でドキュメント コードを表示するには、debugbar を使用します。すべ...

MySQL の binlog ログと、binlog ログを使用してデータを回復する方法を説明します。

ご存知のとおり、binlog ログは MySQL データベースにとって非常に重要です。万が一、データ...

ウェブフロントエンドウェブ開発の一般的なプロセスの簡単な紹介

フロントエンド開発を行っている初心者の学生を多く見かけますが、彼らの効率は比較的遅いです。常にコード...

Vueのキャッシュ方法の例の詳細な説明

最近、「フロントエンドキャッシュ」という新しい要件が作成されました要件背景: フォームへの高頻度の繰...

2つのウェブサイトページ翻訳プラグインの共有

TranslateThis URL: http://translateth.is Google 翻訳...

Unicode における CJK (中国語、日本語、韓国語の統合表意文字) 文字の概要

CJK は CJK Unified Ideographs の略称で、「中国語、日本語、韓国語の統一表...

Vue3でカルーセルコンポーネントをカプセル化する方法

目的カルーセルコンポーネントをカプセル化して直接使用します。具体的な内容は以下のとおりです。一般的な...

MySQLの使用中に発生した問題

ここでは、MySQL の使用中に発生するいくつかの問題とその解決策を示します。 sql_mode=o...

新しい Linux ファイル権限設定における umask の詳細な理解

序文起源は質問 1 です: umask が 022 に設定されている場合、作成するファイルのデフォル...

CSS を使用してテクスチャ付きグラデーション背景画像を記述するためのサンプル コード

プロジェクト内のページの長さはおよそ2000px以上あり、背景画像にはテクスチャやグラデーションがあ...

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

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