MySQL レプリケーションの詳細な説明と簡単な例

MySQL レプリケーションの詳細な説明と簡単な例

MySQL レプリケーションの詳細な説明と簡単な例

マスタースレーブレプリケーション技術は、MySQL で広く使用されており、主に 1 つのサーバー上のデータを複数のスレーブサーバーに同期するために使用されています。負荷分散、高可用性、フェイルオーバーの実現、バックアップの提供などに使用できます。 MySQL は、一方向、半同期、非同期レプリケーションなどのさまざまなレプリケーション テクノロジや、データベース レベル、テーブル レベル、データベース間同期などのさまざまなレベルのレプリケーションをサポートしています。この記事では、基本的なマスター スレーブ レプリケーションについて簡単に説明し、例を示します。

1. 複製の基本原理(手順)

a. マスターデータベースに記録されたデータ変更のバイナリログ
b. スレーブ データベースの I/O スレッドがマスター データベースに接続し、バイナリ ログ ファイルを送信するように要求します (マスター データベースの binlog dump スレッドがバイナリ ログの内容をスレーブ データベースに送信します)。
c. スレーブのI/Oスレッドは、マスターサービスから送信されたバイナリコンテンツを読み取り、リレーログにコピーします。
d. スレーブ上のSQLスレッドはリレーログを読み取り、ログに含まれる更新を実行します。

2. 設定ファイルにコピー項目を追加する

# この記事のデモンストレーションは、同じサーバー上のマルチインスタンス環境に基づいており、ポート 3406 がマスター ライブラリとして使用され、ポート 3506 がスレーブ ライブラリとして使用されます。 
# マルチインスタンス展開の詳細については、以下を参照してください。 
# MySQL マルチインスタンス構成 (I) http://blog.csdn.net/leshami/article/details/40339167 
# MySQL マルチインスタンス構成 (パート 2) http://blog.csdn.net/leshami/article/details/40339295 
# 3406 と 3506 は両方とも新しくインストールされ、デフォルトのライブラリが含まれているため、この記事では、プライマリ ライブラリからスタンバイ ライブラリにデータを移行する手順と、プライマリ ライブラリ上の構成ファイルは説明しません。# my3406.cnf の詳細  
[mysqld] 
ソケット = /tmp/mysql3406.sock 
ポート = 3406 
pid ファイル = /data/inst3406/data3406/my3406.pid 
ユーザー = mysql 
ログエラー=/data/inst3406/data3406/inst3406.err 
データディレクトリ=/data/inst3406/data3406 
ベースディレクトリ=/app/soft/mysql5 
 
#### マスターアイテムの場合 #### 
サーバーID=3406 
log_bin=/data/inst3406/log/bin/inst3406bin 
innodb_flush_log_at_trx_commit=1 
同期バイナリログ=1 
 
b. ライブラリの設定ファイルから# more my3506.cnf  
[mysqld] 
socket = /tmp/mysql3506.sock # 作者: Leshami 
port = 3506 # ブログ: <a target="_blank" href="http://blog.csdn.net/leshamipid-file" rel="external nofollow" >http://blog.csdn.net/leshami 
pid ファイル = /data/inst3506/data3506/my3506.pid 
ユーザー = mysql 
ログエラー=/data/inst3506/data3506/inst3506.err 
データディレクトリ=/data/inst3506/data3506 
ベースディレクトリ=/app/soft/mysql5 
 
#### スレーブアイテムの場合 #### 
サーバーID=3506 
リレーログ=/data/inst3506/log/リレー/リレー-bin 
読み取り専用=1 

3. コピーアカウントを作成する

#ポート3406でインスタンスを起動し、アカウント[mysql@app ~]を追加します$ mysqld_safe --defaults-file=/data/inst3406/data3406/my3406.cnf & 
[mysql@app ~]$ mysql -P3406 #3406にログイン 
 
master@localhost[(none)]> 'server_id'のような変数を表示します。 
+---------------+-------+ 
| 変数名 | 値 | 
+---------------+-------+ 
| サーバーID | 3406 | 
+---------------+-------+ 
 
#レプリケーション用のアカウントを作成します。master@localhost[(none)]> grant replication slave,replication client on *.* 
  -> 'repl' で識別される repl@'192.168.1.177' へ; 
 
#メインデータベースのログファイルを初期化し、ビルド環境ではリセットを慎重に使用してください 
master@localhost[(なし)]> マスターをリセットします。 
クエリは正常、影響を受けた行は 0 行 (0.01 秒) 
 
#メインデータベースのステータスを確認し、ログを 000001 に初期化します。 
master@localhost[(none)]> マスターステータスを表示、位置は120 
+--------------------+----------+--------------+------------------+-------------------+ 
| ファイル | 位置 | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | 
+--------------------+----------+--------------+------------------+-------------------+ 
| inst3406bin.000001 | 120 | | | | 
+--------------------+----------+--------------+------------------+-------------------+ 

4. マスタースレーブ同期を構成する

#ポート3506でインスタンスを起動します [mysql@app ~]$ mysqld_safe --defaults-file=/data/inst3506/data3506/my3506.cnf & 
 
[mysql@app ~]$ msyql -P3506 
 
slave@localhost[(none)]> 'server_id'のような変数を表示します。 
+---------------+-------+ 
| 変数名 | 値 | 
+---------------+-------+ 
| サーバー ID | 3506 | 
+---------------+-------+ 
セット内の 1 行 (0.00 秒) 
 
#スレーブ データベースのマスター データベースを指す関連構成情報を追加します。このコマンドは、スタンバイ データベースの master.info ファイルと relay-log.info ファイルを生成して変更します。slave@localhost[(none)]> CHANGE MASTER TO MASTER_HOST='192.168.1.177', 
  -> MASTER_USER='repl'、 
  -> MASTER_PASSWORD='repl', 
  -> マスターポート=3406、 
  -> MASTER_LOG_FILE='inst3406bin.000001'、 
  -> MASTER_LOG_POS=0; 
クエリは正常、影響を受けた行は 0 行、警告は 2 個 (0.04 秒) 
 
#2つの警告が表示されました。slave@localhost[(none)]> show warnings を確認してください \G 
************************** 1. 行 **************************** 
 レベル: メモ 
  コード: 1759 
メッセージ: SSL/TLS を使用せずにプレーンテキストでパスワードを送信することは、非常に安全ではありません。 
************************** 2. 行 **************************** 
 レベル: メモ 
  コード: 1760 
メッセージ: MySQL ユーザー名またはパスワード情報を master.info リポジトリに保存することは安全ではないため、推奨されません。  
この問題と可能な代替案の詳細については、MySQL マニュアルを参照してください。 
セット内の 2 行 (0.00 秒) 
 
#この時点でスレーブのステータス情報を確認します。slave@localhost[(none)]> show slave status \G 
************************** 1. 行 **************************** 
        スレーブ_IO_状態:  
         マスターホスト: 192.168.1.177 
         マスターユーザー: repl 
         マスターポート: 3406 
        接続再試行: 60 
       マスターログファイル: inst3406bin.000001 
     読み取りマスターログ位置: 4 
        リレーログファイル: リレーbin.000001 
        リレーログ位置: 4 
    リレーマスターログファイル: inst3406bin.000001 
       Slave_IO_Running: いいえ #IO スレッドは実行されていません Slave_SQL_Running: いいえ #SQL スレッドは実行されていません...................... 
       マスター情報ファイル: /data/inst3506/data3506/master.info 
 
slave@localhost[(none)]> start slave; #スレーブを起動 
クエリは正常、影響を受けた行は 0 行 (0.01 秒) 
 
#意味は以下のとおりです。thread_typeオプションなしのSTART SLAVEは両方のスレーブスレッドを開始します。I/Oスレッドは読み取ります。 
マスターサーバーからイベントを読み取り、リレーログに保存します。SQLスレッドは、 
リレーログを出力して実行します。 
 
# スレーブのステータスを再度確認します robin@localhost[(none)]> show slave status\G 
************************** 1. 行 **************************** 
        Slave_IO_State: マスターがイベントを送信するのを待機中 
         マスターホスト: 192.168.1.177 
         マスターユーザー: repl 
         マスターポート: 3406 
        接続再試行: 60 
       マスターログファイル: inst3406bin.000001 
     読み取りマスターログ位置: 120 
        リレーログファイル: リレーbin.000002 
        リレーログ位置: 285 
    リレーマスターログファイル: inst3406bin.000001 
       Slave_IO_Running: はい #IO スレッドは実行状態です Slave_SQL_Running: はい #SQL スレッドは実行状態です............. 
     実行マスターログ位置: 120 
       リレーログスペース: 452 
           ............ 
       マスターサーバー ID: 3406 
         マスター_UUID: 32f53a0a-63ef-11e4-93d9-8c89a5d108ae 
       マスター情報ファイル: /data/inst3506/data3506/master.info 
          SQL_遅延: 0 
     SQL_残り遅延: NULL   
   Slave_SQL_Running_State: スレーブはすべてのリレー ログを読み取りました。スレーブ I/O スレッドがそれを更新するのを待機しています。#重要なプロンプト情報#スレーブ ライブラリには 2 つのスレッドがあります。1 つは I/O スレッド用で、マスター ライブラリに接続してマスター ライブラリに binlog の送信を要求するために使用されます。もう 1 つは SQL を実行するための SQL スレッドです。 
スレーブ@localhost[(なし)]> プロセスリストを表示\G 
************************** 1. 行 **************************** 
   識別子: 4 
  ユーザー: システムユーザー 
  ホスト:  
   デシベル: NULL 
コマンド: 接続 
  時間: 510993 
 状態: マスターがイベントを送信するのを待機中 
  情報: NULL 
************************** 2. 行 **************************** 
   識別子: 5 
  ユーザー: システムユーザー 
  ホスト:  
   デシベル: NULL 
コマンド: 接続 
  時間: 333943 
 状態: スレーブはすべてのリレーログを読み取りました。スレーブ I/O スレッドがそれを更新するのを待機しています。 
  情報: NULL 

5. 同期を確認する

#次に、マスター データベースでいくつかの操作を実行して、スレーブ データベースの同期ステータスを確認します。master@localhost[(none)]> show variables like 'server_id'; 
+---------------+-------+ 
| 変数名 | 値 | 
+---------------+-------+ 
| サーバーID | 3406 | 
+---------------+-------+ 
セット内の 1 行 (0.00 秒) 
 
#マスターデータベースの Binlog Dump スレッドは、binlog ログファイルをスレーブデータベースに送信するために使用されます。次のクエリは、master@localhost[(none)]> show processlist\G です。 
************************** 1. 行 **************************** 
   識別子: 12 
  ユーザー: repl 
  ホスト: 192.168.1.177:57440 
   デシベル: NULL 
コマンド: Binlog ダンプ 
  時間: 511342 
 状態: マスターはすべてのバイナリログをスレーブに送信しました。バイナリログが更新されるのを待機しています。 
  情報: NULL 
   
# メインライブラリにデータベースとテーブルを作成します。master@localhost[(none)]> create database tempdb; 
クエリは正常、1 行が影響を受けました (0.01 秒) 
 
master@localhost[(なし)]> tempdbを使用する 
データベースが変更されました 
master@localhost[tempdb]> information_schema.enginesからselect *としてテーブルtb_enginesを作成します。 
クエリは正常、9 行が影響を受けました (0.02 秒) 
記録: 9 重複: 0 警告: 0 
 
#以下はスレーブライブラリから確認した結果です。slave@localhost[(none)]> select count(*) from tempdb.tb_engines; 
+----------+ 
| カウント(*) | 
+----------+ 
| 9 | 
+----------+ 

読んでいただきありがとうございます。お役に立てれば幸いです。このサイトをサポートしていただきありがとうございます。

以下もご興味があるかもしれません:
  • MySQL マスタースレーブレプリケーションの原理と設定方法(詳細)
  • あるテーブルのフィールドの内容を別のテーブルのフィールドにコピーする MySQL の SQL 文の書き方
  • MySQLデータテーブルフィールドの内容に対するバッチ変更、クリア、コピー、その他の更新コマンド
  • MySQLでテーブル構造をコピーする方法の概要
  • テーブル構造と内容を別のテーブルにコピーする MySQL SQL ステートメント
  • MySQL でのテーブルレプリケーション: create table like および create table as select
  • Windows での MySQL 自動バックアップのバッチ処理の実装 (ディレクトリのコピーまたは mysqldump バックアップ)
  • MySQL マスタースレーブレプリケーション(マスタースレーブ)の実際の動作例

<<:  vue3.0 でカルーセル コンポーネントをカプセル化する手順

>>:  Linuxでブーストライブラリをインストールするための完全な手順

推薦する

体験したい17 404ページ

404 を避けるべきだとどうして言えるのでしょうか? その理由は、ほとんどの 404 ページが粗雑す...

MySQL binlog_ignore_dbパラメータの具体的な使用法

序文:前の記事を読んだ後、binlog はデータベースで実行されたすべての DDL および DML ...

MySQLのデッドロックチェック処理の通常の方法

通常、デッドロックが発生すると、重みが最も小さい接続が強制終了され、ロールバックされます。ただし、最...

Ubuntu 20.04 ダブルピンイン入力方式のインストール手順

1. 中国語入力方法を設定する 2. ダブルスペルモードを設定する 3. 注意事項20.04 で S...

MySQLがOracleのnvlと同様の機能を持つことができるかどうかについての簡単な議論

isnullの代わりにifnullを使用するisnull は、null かどうかを判断するために使用...

MySQLクエリキャッシュに関するヒント

目次序文QueryCache の概要クエリキャッシュ構成QueryCache の使用queryCac...

独自のサーバーを素早く構築する方法の詳細なチュートリアル(Java 環境)

1. サーバーの購入1. 私はAlibaba Cloudのサーバーを選択しました。学生向けで月額9...

Linux で JDK 環境を構成する方法

1. 公式ウェブサイトにアクセスして、jdk-8u162-linux-x64.tar.gzなどのLi...

CSS で平均レイアウトを実現するために負のマージンを使用する例

均等に分散されたレイアウトの場合、通常はネガティブ マージン方式を使用します。次の図は平均的なレイア...

$remote_addr に基づく nginx フロントエンド配布方法の詳細な説明

要件は次のとおりです。ドメイン名の下に複数のサーバーがあります。現在、特定の地域をテストしています。...

CentOSにPHP+Apache+MySQLのサーバー環境をインストールして構築する

Yum (フルネームは Yellow dog Updater, Modified) は、Fedora...

MySQLのクラスタモードでのgalera-clusterのデプロイメントの詳細説明

目次1: galera-clusterの紹介2. galera-clusterの仕組み3: Mari...

JS ES6 非同期ソリューション

目次最初にコールバック関数を使用するes6 非同期処理モデルこの非同期モデルに合わせたAPI: pr...

垂直グリッドと漸進的な行間隔の例

新しい質問急いで来て、急いで行ってください。 「垂直グリッドとプログレッシブ行間隔 (パート 1)」...

あなたが知らない Linux KDE アプリケーション 11 選

翻訳Kool Desktop Environment の略称。 Linux、Unix、FreeBSD...