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

推薦する

「さらに表示」ボタンによる複数行テキストの切り捨てに関する考察

最近、たまたまこの小さな要件に遭遇しました。昔、JS を使用してこれを処理したことを覚えていますが、...

MySQL での r2dbc の使用に関する詳細な理解

導入MySQL は、私たちが日常業務で使用する非常に一般的なデータベースです。MySQL は現在 O...

Mysqlクエリ条件で文字列の末尾にスペースがあっても一致しない問題の詳細な説明

1. テーブル構造テーブル人id名前1あなた2あなた(スペース) 3あなた(スペース2つ) 2. ク...

Mysql 5.7.19 無料インストール版 (64 ビット) の設定方法に関する詳細なチュートリアル

公式サイトから mysql-5.7.19-winx64 をダウンロードします。これはシステムの 64...

Nginx のアンチホットリンクを設定する方法

実験環境• 最小限のインストール済みの CentOS 7.3 仮想マシン• 構成: 1 コア/512...

Linux オペレーティング システムでよく使用される MySQL コマンドの概要

以下に、一般的な MySQL コマンドをいくつか示します。 -- データベース サービスを開始します...

Linux コマンドラインで電卓を使用する 5 つのコマンド

みなさんこんにちは。私は梁旭です。 Linux を使用するときに、計算を行う必要がある場合があり、そ...

Nginxはリバースプロキシを使用して負荷分散プロセス分析を実装します

導入dockerコンテナとdocker-composeに基づいて、Linux環境でのdockerの基...

Tomcat クラスローダーの実装方法とサンプルコード

Tomcat は内部的に複数の ClassLoader を定義し、アプリケーションとコンテナーが異な...

Nginx ロケーション ディレクティブ URI マッチング ルールの詳細な概要

1. はじめにロケーション命令は、http モジュールのコア構成です。事前に定義された URL マッ...

Nginx の負荷分散構成、ダウンタイム発生時の自動切り替えモード

厳密に言えば、nginx には負荷分散バックエンド ノードのヘルス チェック機能はありませんが、デフ...

MySQL データベース トランザクション例のチュートリアル

目次1. トランザクションとは何ですか? 2. トランザクションに関連するステートメントは、挿入、削...

MySQLのFreeListメカニズムの詳細な説明

1. はじめにMySQL が起動すると、BufferPool が初期化されます。クエリ操作を実行する...

Mysql の追加、削除、変更、クエリステートメントのシンプルな実装

Mysql の追加、削除、変更、クエリステートメントのシンプルな実装追加されたレコード: テーブル名...