Skip to content

Instantly share code, notes, and snippets.

@javasboy
Created October 18, 2018 01:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save javasboy/1878251ba39d9dee17ddb61ff80a2c8f to your computer and use it in GitHub Desktop.
Save javasboy/1878251ba39d9dee17ddb61ff80a2c8f to your computer and use it in GitHub Desktop.
MySQL5.6 Replicationの設定

Replication

  • mysql 5.6
  • Mater IP Address = 192.168.1.1
  • Slave IP Address = 192.168.1.2

Master に repl ユーザーを作成する

以下の例では、repl ユーザーが192.168.1.2 からレプリケーション用の接続をできるようにしている。 レプリケーションなので、ON *.* で全データベース、全テーブルに対して許可している。

GRANT REPLICATION SLAVE 
  ON *.* 
  TO 'repl'@'192.168.1.2/255.255.255.255' 
IDENTIFIED BY 'repl_password'

2. MySQL サーバの設定を変更する

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

3. Slave で CHANGE MASTER TO 〜 する

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';

4. Master で dump をとる

--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 をコピーする

5.Slave に dump を入れ、SLAVE START する

mysql -uroot -p db_name < replication.mysqldump
START SLAVE

6. 確認する

  1. Master で何か変更してみる update members set name = 'hoge' where id = 1
  2. Slave で変更を確認する select name from members where id = 1
  3. 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の確認
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment