MySQL 5.7 で業務を停止せずに従来のレプリケーションを GTID レプリケーションに変更する例

MySQL 5.7 で業務を停止せずに従来のレプリケーションを GTID レプリケーションに変更する例

GTID の利点により、従来のファイル POS ベースのレプリケーションを GTID ベースのレプリケーションに変更する必要があります。オンラインで変更する方法が問題になります。具体的な方法は次のとおりです。

現在、従来のレプリケーションでは MS 構造が存在します。

ポート 3301 マスター

ポート 3302 スレーブ

マスター(3301)の場合:
[zejin] 3301>t_usersから*を選択します。
+----+------+
| ID | 名前 |
+----+------+
| 1 | ハオ |
| 2 | 周 |
+----+------+
セット内の行数 (0.00 秒)
 
 
スレーブ(3302)の場合:
[zejin] 3302>スレーブステータスを表示\G
************************** 1. 行 ****************************
Slave_IO_State: マスターがイベントを送信するのを待機中
マスターホスト: 192.168.1.240
マスターユーザー: repl
マスターポート: 3301
接続再試行: 60
マスターログファイル: binlog57.000002
読み取りマスターログ位置: 417
リレーログファイル: zejin240-relay-bin.000004
リレーログ位置: 628
リレーマスターログファイル: binlog57.000002
スレーブIO実行中: はい
スレーブSQL実行中: はい
レプリケート_Do_DB:
レプリケート_無視_DB:
テーブルの複製:
無視テーブルを複製:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
最終エラー番号: 0
最終エラー:
スキップカウンタ: 0
実行マスターログポジション: 417
リレーログスペース: 884
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: 3301
マスター_UUID: a97983fc-5a29-11e6-9d28-000c29d4dc3f
マスター情報ファイル: /home/mysql/I3302/master.info
SQL_遅延: 0
SQL_残り遅延: NULL
Slave_SQL_Running_State: スレーブはすべてのリレーログを読み取りました。さらに更新を待機しています。
マスター再試行回数: 86400
マスターバインド:
最終IOエラータイムスタンプ:
最終SQLエラータイムスタンプ:
マスターSSL証明書:
マスターSSLCrlパス:
取得済み_Gtid_Set:
実行されたGtidセット:
自動位置: 0
Replicate_Rewrite_DB:
チャンネル名:
マスター TLS バージョン:
セット内の行数 (0.00 秒)
 
[zejin] 3302>t_usersから*を選択します。
+----+------+
| ID | 名前 |
+----+------+
| 1 | ハオ |
| 2 | 周 |
+----+------+
セット内の行数 (0.00 秒)

オンラインでの変更の具体的な手順は次のとおりです。

前提:

1. すべての MySQL バージョン 5.7.6 以上が必要です。

2. 現在のトポロジ内のすべての MySQL の gtid_mode 値がオフになっています。

3. 次の手順は順番に実行してください。スキップしないでください。

グローバル システム変数 GTID_MODE 変数値の説明を補足します。

OFF 新しいトランザクションは非 GTID です。スレーブは GTID のないトランザクションのみを受け入れます。GTID のあるトランザクションはエラーを報告します。

OFF_PERMISSIVE 新しいトランザクションは非GTIDであり、スレーブはGTIDのないトランザクションとGTIDのあるトランザクションの両方を受け入れます。

ON_PERMISSIVE 新しいトランザクションは GTID であり、スレーブは GTID なしのトランザクションと GTID ありのトランザクションの両方を受け入れます。

ON 新しいトランザクションはGTIDであり、スレーブはGTIDを持つトランザクションのみを受け入れます

これらの値の変化は順序通りであることに注意すべきである。

オフ<--->OFF_PERMISSIVE<--->ON_PERMISSIVE<--->ON

実行にジャンプできません。エラーが報告されます。

ステップ 1:各 MySQL インスタンスで、 ENFORCE_GTID_CONSISTENCY を警告に設定します。どのインスタンスが最初に実行されるかは関係ありません。

[zejin] 3302> @@global.enforce_gtid_consistency=warn を設定します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
[zejin] 3301> @@global.enforce_gtid_consistency=warn を設定します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

注: このステートメントを実行した後、GTID と互換性のないステートメントの使用があった場合、エラー ログに関連情報が記録されます。その後、互換性のないステートメントが生成されなくなるまで、互換性のない書き込みを回避するようにプログラムを調整する必要があります。プログラムを使用してすべての SQL ステートメントをチェックすることも、プログラムを設定して一定期間エラー ログを観察することもできます。この手順は非常に重要です。

ステップ 2:各 MySQL インスタンスで、ENFORCE_GTID_CONSISTENCY を ON に設定します。どのインスタンスが最初に実行されるかによって結果は影響を受けません。

最初のステップが完了したら、値をオンに設定できます。

[zejin] 3301> @@global.enforce_gtid_consistency=on を設定します。
クエリは正常、影響を受けた行は 0 行 (0.03 秒)
 
[zejin] 3302> @@global.enforce_gtid_consistency を on に設定します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

ステップ3:各MySQLインスタンスで、GTID_MODEをoff_permissivに設定します。どちらが先に実行されても結果には影響しません。

[zejin] 3301> @@GLOBAL.GTID_MODE を OFF_PERMISSIVE に設定します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
 
[zejin] 3302> @@GLOBAL.GTID_MODE を OFF_PERMISSIVE に設定します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

ステップ 4:各 MySQL インスタンスで、GTID_MODE を on_permissive に設定します。どちらが最初に実行されても結果には影響しません。

[zejin] 3302> @@GLOBAL.GTID_MODE を on_permissive に設定します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
[zejin] 3301> @@GLOBAL.GTID_MODE を on_permissive に設定します。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

ステップ5:各MySQLインスタンスの変数ONGOING_ANONYMOUS_TRANSACTION_COUNTを確認する

[zejin] 3301> 'ONGOING_ANONYMOUS_TRANSACTION_COUNT'のようなステータスを表示します。
+-------------------------------------+-------+
| 変数名 | 値 |
+-------------------------------------+-------+
| 進行中の匿名トランザクション数 | 0 |
+-------------------------------------+-------+
セット内の行数 (0.02 秒)
 
 
[zejin] 3302>「ONGOING_ANONYMOUS_TRANSACTION_COUNT」のようなステータスを表示します。
+-------------------------------------+-------+
| 変数名 | 値 |
+-------------------------------------+-------+
| 進行中の匿名トランザクション数 | 0 |
+-------------------------------------+-------+
セット内の行数 (0.02 秒)

この変数が0になるまで待つ必要があります

ステップ 6:すべての匿名トランザクション (非 GTID トランザクション) がすべてのサーバーに完全に複製されていることを確認します。

検査方法:

マスター側:
[zejin] 3301>マスターステータスを表示します。
+-----------------+----------+--------------+------------------+------------------+
| ファイル | 位置 | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+------------------+
| binlog57.000005 | 154 | | | |
+-----------------+----------+--------------+------------------+------------------+
セット内の行数 (0.00 秒)
 
 
奴隷について
 
[zejin] 3302>スレーブステータスを表示\G
************************** 1. 行 ****************************
…
  リレーマスターログファイル: binlog57.000005
   実行マスターログ位置: 154
…

Relay_Master_Log_File の値が binlog57.000005 より大きいことを確認します。

または、Relay_Master_Log_Fileがbinlog57.000005に等しく、Exec_Master_Log_Posの値が154以上である

または、スレーブは関数を直接使用します。

[zejin] 3302>MASTER_POS_WAIT('binlog57.000005', 154)を選択します。
+-----------------------------------------+
| MASTER_POS_WAIT('binlog57.000005', 154) |
+-----------------------------------------+
| 0 |
+-----------------------------------------+
セット内の行数 (0.00 秒)

返された結果が 0 以上の場合、すべての匿名トランザクションがコピーされたことを意味します。

ステップ 7:トポロジ全体に匿名トランザクションがないことを確認します。たとえば、以前に生成されたすべての匿名トランザクションが実行され、バイナリ ログに匿名トランザクションが存在しないようにします。ログをフラッシュして、MySQL に古いバイナリ ログ ファイルを自動的にクリーンアップさせることができます。

ステップ 8:各 MySQL インスタンスで、GTID_MODE をオンに設定します。

[zejin] 3301>SET @@GLOBAL.GTID_MODE = ON;
クエリは正常、影響を受けた行は 0 行 (0.04 秒)
 
[zejin] 3302> @@GLOBAL.GTID_MODE を ON に設定します。
クエリは正常、影響を受けた行は 0 行 (0.04 秒)

ステップ 9:各 MySQL インスタンスの my.cnf 構成ファイルに gtid-mode=ON を追加します。

確認する:

[zejin] 3301>t_users に値(3,'chen') を挿入します。
クエリは正常、1 行が影響を受けました (0.02 秒)
[zejin] 3301>t_users を更新し、name='li' を設定し、id=1 を設定します。
クエリは正常、1 行が影響を受けました (0.03 秒)
一致した行: 1 変更された行: 1 警告: 0
[zejin] 3301>t_usersから*を選択します。
+----+------+
| ID | 名前 |
+----+------+
| 1 | 李 |
| 2 | 周 |
| 3 | チェン |
+----+------+
セット内の行数 (0.00 秒)
 
 
[zejin] 3302>スレーブステータスを表示\G
************************** 1. 行 ****************************
    Slave_IO_State: マスターがイベントを送信するのを待機中
     マスターホスト: 192.168.1.240
     マスターユーザー: repl
     マスターポート: 3301
    接続再試行: 60
    マスターログファイル: binlog57.000006
   読み取りマスターログ位置: 462
    リレーログファイル: zejin240-relay-bin.000012
    リレーログ位置: 673
  リレーマスターログファイル: binlog57.000006
    スレーブIO実行中: はい
   スレーブSQL実行中: はい
    レプリケート_Do_DB: 
   レプリケート_無視_DB: 
   テーブルの複製: 
  無視テーブルを複製: 
  Replicate_Wild_Do_Table: 
 Replicate_Wild_Ignore_Table: 
     最終エラー番号: 0
     最終エラー: 
     スキップカウンタ: 0
   実行マスターログポジション: 462
    リレーログスペース: 969
    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: 3301
     マスター_UUID: a97983fc-5a29-11e6-9d28-000c29d4dc3f
    マスター情報ファイル: /home/mysql/I3302/master.info
     SQL_遅延: 0
   SQL_残り遅延: NULL
  Slave_SQL_Running_State: スレーブはすべてのリレーログを読み取りました。さらに更新を待機しています。
   マスター再試行回数: 86400
     マスターバインド: 
  最終IOエラータイムスタンプ: 
  最終SQLエラータイムスタンプ: 
    マスターSSL証明書: 
   マスターSSLCrlパス: 
   取得済み_Gtid_Set: a97983fc-5a29-11e6-9d28-000c29d4dc3f:1-2
   実行されたGtidセット: a97983fc-5a29-11e6-9d28-000c29d4dc3f:1-2
    自動位置: 0
   Replicate_Rewrite_DB: 
     チャンネル名: 
   マスター TLS バージョン: 
セット内の行数 (0.00 秒)

これにより、従来のレプリケーションから GTID レプリケーションへのオンライン変換が完了します。

MySQL 5.7 の業務を停止せずに従来のレプリケーションを GTID レプリケーションに変更する上記の例は、私が皆さんと共有したいことのすべてです。これが皆さんの参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MySQL マスタースレーブレプリケーションの GTID モードの詳細な紹介
  • MYSQL データベース GTID はマスタースレーブレプリケーションを実現します (超便利)
  • MySQL5.6 GTIDモードで同期レプリケーションエラーをスキップできない問題の解決方法
  • MySQL マスタースレーブレプリケーションの実践の詳細説明 - GTID ベースのレプリケーション
  • GTID に基づく MySQL 5.6 マスタースレーブ レプリケーション
  • MySQL での GTID レプリケーション プロトコルと停止プロトコルの使用に関するチュートリアル
  • MySQL レプリケーションにおける GTID レプリケーションの具体的な使用法

<<:  SSH ポート転送、ローカル ポート転送、リモート ポート転送、動的ポート転送の詳細

>>:  固定サイドバーを実現するためのJavaScript

推薦する

IE10以下のimgタグ問題の解決方法

問題を見つける以前、簡単なデモを書いたのですが、IE10以下では動作しないことがわかりました。ここに...

ReactのEffectListの簡単な分析

目次EffectList コレクション最初のレンダリング時のEffectList EffectLis...

Nginx の realip モジュールの使い方の基礎学習

序文nginx モジュールには、公式とサードパーティの 2 種類があります。nginx のインストー...

デザイン理論:人間中心のデザインコンセプト

<br />思想が東西に分かれていた時代、東洋の叡智を代表するものの一つとして「禅」は多...

Linux の 5 ステップ ビルド カーネル ツリー

目次0. システムに付属するカーネルツリー1. 環境設定最初のステップステップ2 2. ソースコード...

Centos7 FFmpeg オーディオ/ビデオ ツールのインストールに関する簡単なドキュメント

ffmpeg は非常に強力なオーディオおよびビデオ処理ツールです。公式 Web サイトは http:...

Kubernetes を使用して Springboot または Nginx をデプロイするための詳細なチュートリアル

1 はじめに「Maven がワンクリックで Springboot を Docker リポジトリにデプ...

Oracle と MySQL の高可用性ソリューションの比較分析

Oracle と MySQL の高可用性ソリューションについては、以前からまとめたいと思っていたので...

MySQLデータベースを作成し、中国語の文字をサポートする方法

まずMySQLの公式ドキュメントを見てみましょう: 5.7 {データベース | スキーマ} を作成 ...

Zabbixのカスタム監視項目とトリガーについて

目次1. 監視ポート関係の説明操作する2. 監視サービス関係の説明操作する3. テンプレートのインポ...

CSS の 4 つのインポート方法と優先順位の簡単な分析

第一に: CSSを導入する4つの方法CSS を導入する方法には、インライン スタイル、埋め込みスタイ...

MySql ファジークエリ JSON キーワード取得ソリューションの例

目次序文オプション1:オプション2:オプション3:オプション4(最終的に採用されたオプション):要約...

HTML でのメタタグと使用法の詳細な説明

これ以上無駄話をして時間を無駄にしないので、今日の話題を始めましょう。 HTML のメタタグ1. メ...

MySQL における ${param} と #{param} の違い

${param}によって渡されるパラメータは、テーブル名やフィールド名を渡すなど、SQL文の一部と...