サーチ…


備考

レプリケーションは、1つのMySQLデータベースサーバーから1つ以上のMySQLデータベースサーバーに[バックアップ]データをコピーするために使用されます。

Master - コピーするデータを提供しているMySQLデータベースサーバ

スレーブ - MySQLデータベースサーバは、マスタによって提供されるデータをコピーします。

MySQLでは、レプリケーションはデフォルトでは非同期です。これは、マスターから更新を受け取るためにスレーブを永続的に接続する必要がないことを意味します。たとえば、スレーブがオフになっている、またはマスターに接続されておらず、後でスレーブをオンに切り替える、またはマスターに接続している場合は、自動的にマスターと同期します。

構成に応じて、すべてのデータベース、選択したデータベース、またはデータベース内の選択されたテーブルを複製することができます。

レプリケーションフォーマット

複製フォーマットには2つのコアタイプがあります

Statement Based Replication(SBR) - SQL文全体を複製します。この場合、マスターはSQL文をバイナリログに書き込みます。スレーブへのマスタのレプリケーションは、スレーブ上でそのSQL文を実行することによって動作します。

Row Based Replication(RBR) - 変更された行のみを複製します。この場合、マスターは、個々の表の行がどのように変更されるかを示すイベントをバイナリー・ログに書き込みます。スレーブへのマスタのレプリケーションは、テーブル行への変更を表すイベントをスレーブにコピーすることによって機能します。

3番目の種類、 Mixed Based Replication(MBR)を使用することもできます。この場合、ステートメントベースとロウベースの両方のログが使用されます。変更に最も適したログが作成されます。

5.7.7より古いバージョンのMySQLでは、ステートメントベースの形式がデフォルトでした。 MySQL 5.7.7以降では、行ベースの形式がデフォルトです。

マスタ - スレーブレプリケーションセットアップ

複製セットアップ用に2つのMySQLサーバを考えてみましょう.1つはマスタ、もう1つはスレーブです。

マスターは、実行されたすべてのアクションのログを保持する必要があることをマスターに設定します。マスター上のログを見るべきスレーブサーバを設定し、マスター上のログに変更があった場合でも同じことをする必要があります。

マスター構成

まず、マスターにユーザーを作成する必要があります。このユーザーは、スレーブがマスターとの接続を確立するために使用されます。

CREATE USER 'user_name'@'%' IDENTIFIED BY 'user_password';
GRANT REPLICATION SLAVE ON *.* TO 'user_name'@'%';
FLUSH PRIVILEGES;

UsernameとPasswordに従って、 user_nameuser_password変更しuser_name

今、 my.inf (Linuxのmy.cnf)ファイルを編集する必要があります。 [mysqld]セクションに次の行を含めます。

server-id = 1
log-bin = mysql-bin.log
binlog-do-db = your_database

最初の行は、このMySQLサーバにIDを割り当てるために使用されます。

2行目は、指定されたログファイルにログを書き込むようにMySQLに指示します。 Linuxでは、 log-bin = /home/mysql/logs/mysql-bin.logように設定できます。レプリケーションがすでに使用されているMySQLサーバでレプリケーションを開始する場合は、このディレクトリがすべてのレプリケーションログから空になっていることを確認してください。

3行目は、ログを書き込むデータベースの設定に使用されます。 your_databaseをデータベース名で置き換えるyour_databaseがあります。

skip-networkingが有効になっていないことを確認して、MySQLサーバを再起動してください(マスタ)

スレーブ設定

my.infファイルもスレーブで編集する必要があります。 [mysqld]セクションに次の行を含めます。

server-id = 2
master-host = master_ip_address
master-connect-retry = 60

master-user = user_name
master-password = user_password
replicate-do-db = your_database

relay-log = slave-relay.log
relay-log-index = slave-relay-log.index

最初の行は、このMySQLサーバにIDを割り当てるために使用されます。このIDは一意である必要があります。

2行目は、マスターサーバーのIPアドレスです。マスターシステムのIPに従ってこれを変更してください

3行目は再試行制限を秒単位で設定するために使用されます。

次の2行は、スレーブに接続するために使用するユーザ名とパスワードをスレーブに伝えます。

次の行は、複製する必要があるデータベースを設定します。

最後の2行は、 relay-logrelay-log-indexファイル名の割り当てに使用されます。

skip-networkingが有効になっていないことを確認し、MySQLサーバを再起動してください(スレーブ)

データをスレーブにコピーする

データが常にマスタに追加される場合、追加することはできないように、マスタ上のすべてのデータベースアクセスを禁止する必要があります。これは、Masterで次のステートメントを実行することで実現できます。

FLUSH TABLES WITH READ LOCK;

サーバーにデータが追加されていない場合は、上記の手順をスキップできます。

私たちは、 mysqldumpを使ってマスターのデータバックアップを取るつもりです

mysqldump your_database -u root -p > D://Backup/backup.sql;

設定に従ってyour_databaseとバックアップディレクトリを変更します。 backup.sqlれた場所にbackup.sqlというファイルが作成されます。

スレーブにデータベースが存在しない場合は、次のコマンドを実行してデータベースを作成します

CREATE DATABASE `your_database`;

これで、スレーブMySQLサーバにバックアップをインポートする必要があります。

mysql -u root -p your_database  <D://Backup/backup.sql
--->Change `your_database` and backup directory according to your setup

レプリケーションを開始する

レプリケーションを開始するには、マスターのログファイル名とログの位置を確認する必要があります。だから、マスターで次のように実行する

SHOW MASTER STATUS;

これにより、以下のような出力が得られます

+---------------------+----------+-------------------------------+------------------+
| File                | Position | Binlog_Do_DB                  | Binlog_Ignore_DB |
+---------------------+----------+-------------------------------+------------------+
| mysql-bin.000001    | 130      | your_database                 |                  |
+---------------------+----------+-------------------------------+------------------+

次に、スレーブで次のコマンドを実行します。

SLAVE STOP;
CHANGE MASTER TO MASTER_HOST='master_ip_address', MASTER_USER='user_name', 
   MASTER_PASSWORD='user_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=130;
SLAVE START;

まずはスレーブを止める。次に、マスターログファイルをどこに表示するかを正確に伝えます。 MASTER_LOG_FILE名とMASTER_LOG_POSについては、マスター上でSHOW MASTER STATUSコマンドを実行して得た値を使用してください。

MASTER_HOSTでマスターのIPを変更し、それに応じてユーザーとパスワードを変更する必要があります。

スレーブは現在待機しています。スレーブの状態は、次のコマンドを実行すると表示されます

SHOW SLAVE STATUS;

以前にマスタでFLUSH TABLES WITH READ LOCKを実行した場合は、次のコマンドを実行してロックからテーブルを解放します

UNLOCK TABLES;

これでマスターは、実行されたすべてのアクションのログを保持し、スレーブサーバーはマスターのログを参照します。マスターのログに変更が発生するたびに、スレーブはそれを複製します。

レプリケーションエラー

スレーブでクエリを実行中にエラーが発生すると、MySQLは自動的にレプリケーションを停止して問題を特定し、修正します。これは、イベントが重複キーを引き起こしたか、行が見つからず、更新または削除できないことが主な原因です。これが推奨されない場合でも、このようなエラーはスキップできます

スレーブをハングしているクエリを1つだけスキップするには、次の構文を使用します

SET GLOBAL sql_slave_skip_counter = N;

このステートメントは、マスターから次のNイベントをスキップします。このステートメントは、スレーブスレッドが実行されていない場合にのみ有効です。それ以外の場合は、エラーが発生します。

STOP SLAVE;
SET GLOBAL sql_slave_skip_counter=1;
START SLAVE;

場合によってはこれは問題ありません。しかし、ステートメントが複数ステートメント・トランザクションの一部である場合、エラー生成ステートメントをスキップするとトランザクション全体がスキップされるため、ステートメントはより複雑になります。

同じエラーコードを生成するより多くのクエリをスキップしたい場合、それらのエラーをスキップしてスレーブが矛盾しないようにして、それらをすべてスキップしたい場合は、 my.cnfエラーコードをスキップする行を追加します。

たとえば、重複しているエラーをすべてスキップしたい場合があります

1062 | Error 'Duplicate entry 'xyz' for key 1' on query

次に、あなたのmy.cnf以下を追加します

slave-skip-errors = 1062

他のタイプのエラーまたはすべてのエラーコードもスキップできますが、それらのエラーをスキップしてもスレーブが矛盾しないようにしてください。構文と例は次のとおりです

slave-skip-errors=[err_code1,err_code2,...|all]

slave-skip-errors=1062,1053
slave-skip-errors=all
slave-skip-errors=ddl_exist_errors


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow