
Windows上にセットアップしたVMのCentOS2台でMysqlのレプリケーションを行う。
Mysqlバージョンは2台とも5.0.45です。
・マスターとスレーブのIPはそれぞれこんな感じです
192.168.1.178←マスタ
192.168.1.179←スレーブ
では作業開始。
マスタ・スレーブ共通
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY '1234'; mysql> GRANT ALL ON *.* TO repl@localhost IDENTIFIED BY '1234';
・192.168.1.178(マスタ)
# vi /etc/my.cnf [mysqld] log-bin=mysql-bin server-id=1
・192.168.1.179(スレーブ)
# vi /etc/my.cnf [mysqld] server-id=2 (デフォルトでファイル内にserver-id = 1と書いてある場合に注意)
・マスタ側にテーブルロックをかけて、マスタからdumpしてスレーブへリストアしてロック解除する
マスターのテーブルロック(テーブルへの書込み禁止)
mysql> FLUSH TABLES WITH READ LOCK;
マスターでdump
# mysqldump --all-databases --lock-all-tables >dbdump.db
スレーブでリストア
# mysql --all-databases < dbdump.db
ロック中にマスターにて以下を実行
mysql> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000002 | 535 | | | +------------------+----------+--------------+------------------+ ※この結果はスレーブ側の設定に使用します。
・スレーブ
CHANGE MASTER TO
MASTER_HOST='192.168.1.178', //マスターのホスト
MASTER_USER='repl', //作成したユーザ名
MASTER_PASSWORD='1234', //ユーザーのパスワード
MASTER_PORT=3306, //マスターのポート番号
MASTER_LOG_FILE='mysql-bin.000002', //上で出力したマスターのFile名を代入
MASTER_LOG_POS=535; //上で出力したマスターのPositionの値を代入
この内容はこのファイルに記載されます
/var/lib/mysql/master.info
マスターロック解除
mysql> UNLOCK TABLES;
スレーブにて
mysql> start slave;
ここまでで作業は終了。で、レプリケーションがスタートします。
マスター側で試しに、insert文を打ってみてスレーブで確認してみる。
レプリケーションを落とすときは、スレーブ側で
STOP SLAVE;
(master側は特に何もしなくていいみたい)。
リセットするときは
RESET SLAVE;
RESET MASTER;
その他もろもろメモです。
スレーブで
mysql> SHOW SLAVE STATUS;
を叩いて
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.178
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 514
Relay_Log_File: mysqld-relay-bin.000005
Relay_Log_Pos: 235
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_sql_Running: Yes
こんな感じであればちゃんと動いてくれるはず。
なぜかユーザー名にtestって入ってることに気づかなくてハマりました。sql文でtestとは打ってないのにw
正常に動いているときの実行結果はこんな感じです。
マスター側で、
mysql> SHOW PROCESSLIST; +----+------+---------------------+-----------+-------------+------+----------------------------------------------------------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+---------------------+-----------+-------------+------+----------------------------------------------------------------+------------------+ | 21 | root | localhost | exampledb | Query | 0 | NULL | SHOW PROCESSLIST | | 48 | repl | 192.168.1.179:54314 | NULL | Binlog Dump | 476 | Has sent all binlog to slave; waiting for binlog to be updated | NULL | +----+------+---------------------+-----------+-------------+------+----------------------------------------------------------------+------------------+ 2 rows in set (0.00 sec)
スレーブ側で、
mysql> SHOW PROCESSLIST; +----+-------------+-----------+-----------+---------+------------+-----------------------------------------------------------------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+-------------+-----------+-----------+---------+------------+-----------------------------------------------------------------------+------------------+ | 1 | system user | | NULL | Connect | 318 | Waiting for master to send event | NULL | | 2 | system user | | NULL | Connect | 4294962714 | Has read all relay log; waiting for the slave I/O thread to update it | NULL | | 4 | root | localhost | exampledb | Query | 0 | NULL | SHOW PROCESSLIST | +----+-------------+-----------+-----------+---------+------------+-----------------------------------------------------------------------+------------------+ 3 rows in set (0.00 sec)
こまめにSHOW SLAVE STATUSの内容をチェックする必要があるみたいです。
終わり。
No related posts.