以下、バージョン 4.1 の MySQL サーバに対する完全なレプリケーションのセットアップ方法について簡単に説明します。 すべてのデータベースのレプリケーションを希望し、過去にレプリケーションの設定をまったく行っていない場合を前提としています。 以下の手順を実行するには、マスタサーバをいったんシャットダウンする必要があります。
以下手順では、1 つのスレーブをセットアップしているだけですが、同様に複数のスレーブをセットアップできます。
この方法が最も簡単でわかりやすいですが、唯一の方法ではありません。たとえば、マスタのデータのスナップショットがすでにあり、マスタにサーバ ID が設定されてバイナリログが有効になっていれば、マスタをシャットダウンしたり更新をブロックしなくてもスレーブをセットアップできます。詳細については、項4.11.9. 「レプリケーション FAQ」 を参照してください。
MySQL
レプリケーションのセットアップを管理する場合は、この章全体をよく読み、項4.11.7. 「マスタサーバを制御する SQL ステートメント」
および 項4.11.8. 「スレーブサーバを制御する SQL ステートメント」
で説明されているすべてのコマンドを試してみてください。また、項4.11.6. 「レプリケーションスタートアップオプション」
で説明されている my.cnf
のレプリケーションスタートアップオプションにも精通してください。
注意:
ここでの手順および後続セクションで説明するレプリケーション
SQL
ステートメントの実行には、SUPER
権限が必要です。MySQL 4.0.2
より前では、代わりに PROCESS
権限を使用します。
マスタとスレーブに MySQL の最近のバージョンがインストールされていることを確認する。また、項4.11.2. 「レプリケーション実装の概要」 の表で、それらのバージョンに互換性があることを確認する。
バグについては、その問題が最新のリリースで存在することを確認してから報告すること。
スレーブサーバが接続に使用する MySQL
ユーザーをマスタサーバに設定する。このユーザーには、REPLICATION
SLAVE
権限を与える必要がある(MySQL
バージョンが 4.0.2
より古い場合は、代わりに FILE
権限を与える)。MySQL
ユーザーがレプリケーション目的のみのものであれば(推奨)、他に権限を設定する必要はない。
スレーブのホスト名を、各スレーブサーバがそのユーザーを使用してマスタに接続できるように設定する。たとえば、どのホストからでもマスタにアクセスできる
repl
という名前のユーザを作成するには、以下のコマンドを使用する。
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%' IDENTIFIED BY '<password>';
MySQL バージョンが 4.0.2 より古い場合は、代わりに以下のコマンドを使用する。
mysql> GRANT FILE ON *.* TO repl@'%' IDENTIFIED BY '<password>';
LOAD TABLE FROM MASTER
ステートメントまたは LOAD DATA FROM
MASTER
ステートメントをスレーブホストから使用する予定であれば、この
MySQL
ユーザーにさらに権限を設定する必要がある。
MySQL ユーザーに SUPER
および
RELOAD
の各グローバル権限を設定する。
ロード対象のすべてのテーブルに対する
SELECT
権限を設定する。MySQL
ユーザーが SELECT
を実行できないマスタテーブルは、LOAD
DATA FROM MASTER
で無視される。
MyISAM テーブルを使用する場合、FLUSH
TABLES WITH READ LOCK
コマンドを実行してすべてのテーブルをフラッシュし、クエリ書き込みをブロックする。
mysql> FLUSH TABLES WITH READ LOCK;
そして、マスタサーバのデータのスナップショットを撮る。
スナップショットを作成する最も簡単な方法は、アーカイブプログラム(Unix
では tar
、Windows では
PowerArchiver
、WinRAR
、WinZip
など)を使用して、マスタのデータディレクトリにデータベースのアーカイブを作成することである。
たとえば、tar
を使用してすべてのデータベースを含むアーカイブを作成するには、カレントディレクトリをマスタサーバのデータディレクトリに変更して、以下のコマンドを実行する。
shell> tar -cvf /tmp/mysql-snapshot.tar .
this_db
という名前のデータベースだけをアーカイブに含める場合は、以下のコマンドを使用する。
shell> tar -cvf /tmp/mysql-snapshot.tar ./this_db
そしてアーカイブファイルを、スレーブサーバホストの
/tmp
ディレクトリにコピーする。そのマシンで、カレントディレクトリをスレーブのデータディレクトリに変更し、以下のコマンドを使用してアーカイブファイルをアンパックする。
shell> tar -xvf /tmp/mysql-snapshot.tar
場合によっては、mysql
データベースのレプリケーションが必要でないこともある。その場合は、アーカイブからこのデータベースを除外できる。また、アーカイブに、ログファイル、つまり
master.info
ファイルまたは
relay-log.info
ファイルを含める必要はない。
FLUSH TABLES WITH READ LOCK
によって掛けられた読み取りロックが有効な間に、マスタ上の現在のバイナリログ名とオフセット値を読み取る。
mysql > SHOW MASTER STATUS; +---------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +---------------+----------+--------------+------------------+ | mysql-bin.003 | 73 | test,bar | foo,manual,mysql | +---------------+----------+--------------+------------------+ 1 row in set (0.06 sec)
File
カラムはログの名前を、Position
はオフセットを示す。上記の例では、バイナリログ値は
mysql-bin.003
でオフセットは 73
である。値を記録しておく。後でスレーブをセットアップするときに、これらの値が必要となる。
スナップショットを作成してログ名とオフセットを記録したら、マスタの書き込みを再度有効にできる。
mysql> UNLOCK TABLES;
InnoDB テーブルを使用している場合、InnoDB Hot Backup ツールを使用するのが理想的である。このツールは、MySQL コマーシャルライセンス、サポート、またはバックアップツールそのものを購入することによって使用できる。このツールは、マスタサーバを一切ロックせずに整合したスナップショットを作成し、後でスレーブで使用できるように、スナップショットに対応するログ名とオフセットを記録する。このツールの詳細については、http://www.innodb.com/order.php を参照のこと。
Hot Backup ツールを使用しないで、InnoDB
テーブルのスナップショットを作成する最も速い方法は、マスタサーバをシャットダウンし、InnoDB
のデータファイルとログ、およびテーブル定義ファイル(.frm
)をコピーすることである。現在のログファイルとオフセットを記録するには、サーバをシャットダウンする前に以下を実行する。
mysql>FLUSH TABLES WITH READ LOCK;
mysql>SHOW MASTER STATUS;
次に、SHOW MASTER STATUS
の出力からログ名とオフセットを控えておく。ログ名とオフセットを控えたら、テーブルのロックを解除せずにサーバをシャットダウンする。ロックを解除しないのは、スナップショットが現在のログファイルとオフセットに対応している状態を維持するためである。
shell> mysqladmin -uroot shutdown
MyISAM テーブルと InnoDB
テーブルの両方に適用できる代替手段として、上記のバイナリコピーの代わりに、マスタの
SQL
ダンプを使用できる。これを行うには、マスタで
mysqldump --master-data
を実行し、後でその SQL
ダンプをスレーブに実行する。ただし、これはバイナリコピーよりも時間がかかる。
マスタが、--log-bin
を有効にせずに稼動していた場合、SHOW
MASTER STATUS
または
mysqldump
で表示されるログ名と位置の値は空白となる。この場合は、ログ名として空白文字列('')を、オフセット値として
4 を記録しておく。
マスタホストの my.cnf
ファイルの [mysqld]
セクションに log-bin
オプションが含まれていることを確認する。このセクションには、server-id=master_id
オプションも含まれている必要がある。ここで、master_id
は、1 から 2^32 - 1
までの整数値である。次に例を示す。
[mysqld] log-bin server-id=1
これらのオプションがなければ、追加してから、サーバを再起動する。
スレーブサーバとして使用するサーバを停止し、その
my.cnf
ファイルに以下を追加する。
[mysqld] server-id=slave_id
slave_id
値は
master_id
値と同様、1 から 2^32 -
1 までの整数値である。さらに、スレーブの
ID はマスタの ID
と異なっていることが非常に重要である。次に例を示す。
[mysqld] server-id=2
複数のスレーブをセットアップする場合、それぞれの
server-id
がマスタのものと異なり、またスレーブ同士でも異なるようにする。server-id
の値は IP
アドレスのようなものと考えてよい。これらの
ID
は、レプリケーションパートナのコミュニティ内で、各サーバインスタンスを一意に識別する。
server-id
値を指定しない場合、master-host
を指定していなければ 1
に設定される。それ以外は 2
に設定される。注意: server-id
がなければ、マスタはすべてのスレーブからの接続を拒否し、スレーブはマスタへの接続を拒否する。したがって、server-id
の省略はバイナリログによるバックアップでのみ正当化される。
マスタサーバのデータのバイナリバックアップを作成した場合、スレーブを開始する前に、このバックアップをスレーブサーバのデータディレクトリにコピーする。ファイルおよびディレクトリの権限が正しいことを確認する。MySQL を実行しているユーザには、マスタと同様、それらのファイルおよびディレクトリに対する読み取りおよび書き込み権限が必要である。
mysqldump
を使用してバックアップを作成した場合、最初にスレーブを開始する(次のステップを参照)。
スレーブサーバを起動する。レプリケーションを実行していた場合には、--skip-slave-start
オプションでスレーブサーバを起動する。また、--log-warnings
オプションを使用してスレーブサーバを起動するのもよい。そうすると、問題(ネットワークや接続関連などの問題)に関するメッセージが多く出力される。
mysqldump
を使用してマスタサーバのデータのバックアップを作成した場合、ダンプファイルをスレーブサーバにロードする。
shell> mysql -u root -p < dump_file.sql
<>
内の値を実際のシステムの値に置き換えて、スレーブで以下のコマンドを実行する。
mysql>CHANGE MASTER TO
->MASTER_HOST='<master host name>',
->MASTER_USER='<replication user name>',
->MASTER_PASSWORD='<replication password>',
->MASTER_LOG_FILE='<recorded log file name>',
->MASTER_LOG_POS=<recorded log offset>;
以下の表は、これらの変数の最大文字列長である。
MASTER_HOST |
60 |
MASTER_USER |
16 |
MASTER_PASSWORD |
32 |
MASTER_LOG_FILE |
255 |
スレーブスレッドを開始する。
mysql> START SLAVE;
この手順を完了すると、スレーブはマスタに接続し、スナップショット以後の更新を実行します。
マスタに server-id
を設定し忘れた場合、スレーブはマスタに接続できません。
スレーブに server-id
を設定し忘れた場合、エラーログに以下のエラーが出力されます。
Warning: one should set server_id to a non-0 value if master_host is set. The server will not act as a slave.
他の理由でスレーブがレプリケーションを実行できない場合も、スレーブのエラーファイルにエラーメッセージが表示されます。
スレーブがレプリケーションを開始すると、そのデータディレクトリに
master.info
ファイルと
relay-log.info
ファイルが作成されます。スレーブはこれら 2
つのファイルを使用して、マスタのバイナリログの処理進捗を記録します。完全に理解していない限り、これらのファイルを削除したり編集しないでください。十分に理解して行う場合には、CHANGE
MASTER TO
コマンドの使用を推奨します。
注意:
master.info
の内容には、コマンドラインまたは
my.cnf
で指定されるオプションより優先されるものがあります。
詳細については、項4.11.6. 「レプリケーションスタートアップオプション」
を参照してください。
スナップショットを一度作成すれば、それを使用して上記手順のスレーブの部分を繰り返して、別のスレーブを設定できます。マスタのスナップショットを新たに作成する必要はありません。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.