- mysql 5.6
- Mater IP Address = 192.168.1.1
- Slave IP Address = 192.168.1.2
以下の例では、repl ユーザーが192.168.1.2 からレプリケーション用の接続をできるようにしている。
レプリケーションなので、ON *.*
で全データベース、全テーブルに対して許可している。
GRANT REPLICATION SLAVE
ON *.*
TO 'repl'@'192.168.1.2/255.255.255.255'
IDENTIFIED BY 'repl_password'
Master に server-id と、bin_log の設定をする
# Master
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
Slave には Master とは違う server-id を設定する。 # server-id はサーバ間で重複しないように設定する
# Slave
server-id = 2
# Slave log
relay-log = mysqld-relay-bin
relay-log-index = mysqld-relay-bin
log-slave-updates
slave-skip-errors=1062
- その後 Master、Slave 共に再起動する
service mysql restart
Slave に Master の場所を教える。 MASTER_LOG_FILE や MASTER_LOG_POS は、 mysqldump に含めるので、ここでは指定しない。
root などでログインして以下を実行する。
CHANGE MASTER TO
MASTER_HOST='192.168.1.1',
MASTER_USER='repl',
MASTER_PASSWORD='repl_password';
--master-data=1 で MASTER_LOG_FILE、MASTER_LOG_POS が dump に含まれる。 --flush-logs で その時点のログを吐き出しておく。 --single-transaction で、dump が一貫性を保つようにする。dump が開始された以降の変更はふくまれなくなる。また、ロックされなくなるので、Master は止まらない。
mysqldump -uroot -p --master-data=1 --single-transaction db_name --flush-logs > replication.mysqldump
そして、scp などで、Slave に dump をコピーする
mysql -uroot -p db_name < replication.mysqldump
START SLAVE
- Master で何か変更してみる
update members set name = 'hoge' where id = 1
- Slave で変更を確認する
select name from members where id = 1
- Positionの確認
- Mater
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.0000XX
Position: XXX
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
mysql> exit
- Slave
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.1
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.0000XX
Read_Master_Log_Pos: XXX
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 283
Relay_Master_Log_File: mysql-bin.0000XX
-
ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
-
Masterから再dumpいてimportする
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.0000XXX
Position: XXX
# mysqldump -uroot -p --master-data=1 --single-transaction --all-databases --flush-logs > replication.mysqldump
- Slave 再設定
mysql > STOP SLAVE;
# mysql -u root -p < replication.mysqldump
mysql > RESET SLAVE;
mysql > CHANGE MASTER TO
MASTER_HOST='192.168.1.1’,
MASTER_USER='repl',
MASTER_PASSWORD='repl_password',
MASTER_LOG_FILE='mysql-bin.0000XXX',// Master_Log_Fileのファイル名をセット
MASTER_LOG_POS=XXX;// Exec_Master_Log_Posの値をセット
mysql > START SLAVE;
- Positionの確認