レプリケーションとは2つのMySQLサーバでデータを同期する仕組み。マスターサーバのデータをスレーブサーバにコピーする。スレーブサーバは常に起動している必要はなく、起動時に一括でマスターからコピーできる。スレーブでの更新はマスターには影響しないので、通常は更新作業はすべてマスターで行うものと思われる。当然スレーブは複数あっていい。
レプリケーションはバイナリーログを利用する。マスターはデータの追加や更新を「イベント」としてバイナリーログに書き込む。スレーブはこのログを読んで自身のデータを更新する。このときスレーブはバイナリーログのどこから実行するかの情報をちゃんと自分で持っている。設定によってスレーブは特定のデータベースだけをレプリケーションしたりできる。
マスターとスレーブにはユニークなID(server-id)を割り付けなければならない。ここではすでにマスターにはデータがあり、マスターのserver-idとバイナリーログ有効の設定は有効にしてあり、レプリケーション用ユーザreplも存在するのもとする。ただしこのマスターは最初からバイナリーログがとられているわけではないものとする。そのときの新しくスレーブを立ち上げたときのことを考える。スレーブがレプリケーションするデータベースはdddだけとする。
マスターのバイナリログの現在の状況を確認してバックアップをとる
スレーブのデータベースは空なので、マスターのデータをまず持ってこなくてはならないが、マスターのバイナリーログとの整合性が狂うとまずいので、テーブルの更新を止めてからバイナリーログの状況を確認し、その後バックアップを取る。
マスターにコマンドラインからログインして、更新を止め、バイナリーログの状態を確認する。
1 2 3 4 5 6 7 8 9 10 11 12 |
mysql> FLUSH TABLES WITH READ LOCK; Query OK, 0 rows affected (0.01 sec) mysql> SHOW MASTER STATUS; +-------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +-------------------+----------+--------------+------------------+ | mysqld-bin.000222 | 602199 | | | +-------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) mysql> |
このコマンドラインはこのままにして(抜けるとロック外れる)、他のコマンドラインからデータベースdddをファイルにコピーする。すでにロックしてるので–skip-lock-tables を追加する。
$ mysqldump --database ddd -u root -p --skip-lock-tables > ddd.sql
終わったら、mysqlのコマンドラインも抜ける。これでバイナリーログの状態とバックアップファイルができた。
スレーブに今作ったバックアップファイルからコピーする
スレーブにddd.sqlを持ってくる。が、最初にデータベースdddを作る。
1 |
mysql> CREATE DATABASE ddd; |
次にddd.sqlを流し込む。
$ mysql -u root -p < ddd.sql
スレーブにserver-idを割り付ける
まずスレーブにserver-idを割り当てる。my.cnfの[mysqld]セクションに設定を行う。server-idは適当な数字でいい。(1~4294967295)。
[mysqld]
server-id=432423
スレーブを起動し、コマンドラインに入って、レプリケーションの設定をする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
mysql> start slave; ERROR 1200 (HY000): The server is not configured as slave; fix in config file or with CHANGE MASTER TO mysql> CHANGE MASTER TO -> MASTER_LOG_FILE='mysqld-bin.000222', -> MASTER_LOG_POS=602199, -> MASTER_HOST='192.168.0.100', -> MASTER_USER='repl', -> MASTER_PASSWORD='pass'; Query OK, 0 rows affected (0.05 sec) mysql> start slave; Query OK, 0 rows affected (0.03 sec) mysql> |
MASTER_LOG_FILEとMASTER_LOG_POSの値は上で確認したマスターのバイナリーログの状態を入力する。他のホストとかユーザとかは自分のものに合わせる。
これでmaster.infoができ、ここにバイナリーログの状態が保存されているはず。
スレーブを終了しmy.cnfにちゃんとしたレプリケーション情報を書く。
[mysqld]
server-id=432423
master-host=192.168.0.100
master-user=repl
master-password=pass
replicate-do-db=ddd
スレーブを起動し、マスターで変更した情報がスレーブに反映されるかを確認する。