マスタ: 5.0.32-Debian_7etch8-log Debian etch distribution
スレーブ: 5.0.67-community-nt MySQL Community Edition (GPL)
- マスタのmy.cnfにserver-idとlog-binを設定し、マスタのmysqldを再起動する。
server-id = 1
log-bin = /var/log/mysql/mysql-bin.log
- マスタに接続してレプリケーション用のユーザを作成する。
GRANT REPLICATION SLAVE ON *.* TO repl@slave IDENTIFIED BY 'password';
- マスタの全てのテーブルをフラッシュし、更新をブロックし、マスタのバイナリログ名(File)とオフセット値(Position)を控えて、更新がブロックされた状態のまま、mysqldを停止させる。
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
+------------------+----------+-
| File | Position |
+------------------+----------+-
| mysql-bin.000546 | 508 |
+------------------+----------+-
ここで、mysqlクライアントを終了させずに別ターミナル等からmysqldを停止させる。
- スレーブのmysqldを停止させ、スレーブのdatadirの中身を全部削除して、そこにマスタのdatadirの中身を全部コピーしてから、マスタのmysqldを開始させる。ただし、innodbを使っている場合、ib_logfile~については、その大きさがinnodb_log_file_sizeで指定したのと異なっているとエラーになるようなのでコピーしない方がよい。
- スレーブのmy.cnfにserver-idとrelay-logを設定し、スレーブのmysqldを開始させる。マスタでinnodbを使っている場合には、スレーブのmy.cnfのskip-innodbをコメントアウトしておく。collation-serverやcharacter-set-serverがマスタと違う場合にはマスタと同じになるように修正しておく。
server-id = 2
relay-log = relay-bin
#skip-innodb
#character-set-server = latin1
#collation-server = latin1_general_ci
- スレーブに接続して、マスタの情報を設定し、レプリケーションを開始させ、動作状況を確認する。
CHANGE MASTER TO
MASTER_HOST='master',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000546',
MASTER_LOG_POS=508;
START SLAVE;
SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: master
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000547
Read_Master_Log_Pos: 4218
Relay_Log_File: relay-bin.000009
Relay_Log_Pos: 1452
Relay_Master_Log_File: mysql-bin.000547
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
「Slave_IO_State」がもっともらしい状態を示していて、「Slave_IO_Running」と「Slave_SQL_Running」が「Yes」になっていれば、多分、レプリケーションは動作している。ログのファイル名(…_Log_File)やオフセット値(…_Log_Pos)はデータベースの更新により、「SHOW SLAVE
STATUS」を実行するタイミングで違ってくる。エラーログも調べて、エラーや警告が出ていればそれに応じた処置をする。
一度、「CHANGE MASTER TO…」と「START SLAVE」を実行しておけば、mysqldを再起動しても次回から自動的にレプリケーションが開始されるみたいです。
XAMPPでMySqlの起動や停止の動作が怪しい時は、一旦、「mysqladmin -u root shutdown」としてmysqldを終わらせ、「mysqld --remove」でサービスの登録を削除し、「XAMPPコントロールパネルアプリケーション」を使って、MySqlサービスを登録するとうまく動作するようになるみたいです。その際、登録のはずが削除するかどうか聞いてきたりしてなんか変だけど、気にせず「OK」すれば登録されるみたいです。
スレーブを増やしたい時には、現在稼動中の適当なスレーブのmysqldを停止させ、そのdatadirとmy.confを新しいスレーブへコピーし、新しいスレーブのmy.confのserver-idを新しい番号に修正し、マスタに新しいスレーブのレプリケーション用のユーザを作成するとよいです。その時、新しいスレーブがリレーログのオープンに失敗する場合には、新しいスレーブのmysqldを停止させ、新しいスレーブのdatadir内のリレーログとrelay-log.infoを削除してから、新しいスレーブのmysqldを開始させるとよいみたいです。