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

推薦する

インスピレーションを得るための7つのクールなダイナミックウェブサイトデザイン

デザインの分野では、毎年さまざまなデザインのトレンドや流行があります。たとえば、近年のレスポンシブデ...

CSS でのシングル div 描画テクニックの実装

純粋な HTML + CSS を使ってドラえもんの絵を描くなど、CSS 描画に関する記事をよく見かけ...

Tencent Cloud Serverの構築方法を説明します(グラフィックチュートリアル)

この記事は元々ブロガーのWeiwei Miaoによって書かれたものです。ブログホームページ: htt...

Nginx で Http、Https、WS、WSS を設定する方法

前面に書かれた今日のインターネット分野では、Nginx は最も広く使用されているプロキシ サーバーの...

MySQL 8.0.11 のインストールと設定方法のグラフィックチュートリアル MySQL 8.0 の新しいパスワード認証方法

この記事では、参考までにMySQL8.0.11のインストールと設定方法、およびMySQL8.0の新し...

Vue が天気予報機能を実装

この記事では、天気予報機能を実現するためのVueの具体的なコードを参考までに共有します。具体的な内容...

22 Vue 最適化のヒント (プロジェクトの実践)

目次コードの最適化v-for でキーを使用するv-if/v-else-if/v-else でキーを使...

macOS での MySQL 8.0.17 のインストールと簡単な設定チュートリアル

私が書いた内容が理解できない場合は、インターネット上に理解できるチュートリアルがない可能性があります...

Vue プロジェクトのパッケージ化、マージ、圧縮により、Web ページの応答速度を最適化します。

目次序文1. リクエスト内容が大きすぎる解決: CDN の紹介リクエストリソースを圧縮する1. HT...

Vue でのルータービューコンポーネントの使用に関する詳細な説明

Vue プロジェクトを開発する場合、さまざまなコンポーネント ページを表示するために切り替えることが...

フロントエンドJavaScript ES6の詳細について

目次1. はじめに1.1 Babel トランスコーダ1.2 ポリフィル2. let と const ...

vue3 カスタムディレクティブの詳細

目次1. カスタム指示の登録1.1. グローバルカスタム指示1.2. ローカルカスタム指示2. カス...

Nginx で Basic Auth ログイン認証を設定する方法

nginx でファイルサーバーを構築することもありますが、これは一般に公開されていますが、サーバーが...

ウェブサイト上で flv/MP4 やその他のビデオ ファイルを再生できない問題は、MIME タイプに関連しています。

ウェブサイトを作成している際に、flv や MP4 形式などのビデオ ファイルはローカルでは正常に再...