MySQLのレプリケーションを用いてマスターサーバーを無停止でバックアップする
目的
MySQLのレプリケーションを用いてマスターサーバーを無停止でバックアップする🐤
環境
$ mysql --version
mysql Ver 14.14 Distrib 5.6.27, for debian-linux-gnu (x86_64) using EditLine wrapper
$ cat /etc/issue
Ubuntu 14.04.3 LTS \n \l
手順
複製したMySQLが接続できるか確認
バックアップサーバーでMySQLを起動
$ mysqld_safe --defaults-file=/var/lib/mysql-3307/my.cnf \
--datadir=/var/lib/mysql-3307 --port=3307 &
バックアップサーバーでMySQL接続できるか確認
$ mysql -u root -S /var/lib/mysql-3307/mysqld.sock
マスターサーバー疎通確認
バックアップサーバーでMySQLがつながるか確認
$ mysql -hMASTERSERVERIP -urepluser -p
つながらない場合、マスターサーバーでファイアウォールを開けるように設定
$ sudo ufw allow proto tcp from MASTERSERVERIP/24 to any port 3306
マスターサーバーでファイアウォールの設定が追加されていることを確認
$ sudo ufw status
マスターサーバーでレプリケーション用のユーザーを作成
$ mysql -u root -p
mysql > grant replication slave on *.* to 'repluser'@'MASTERSERVERIP'
identified by 'REPLUSERPASS';
マスターサーバーでmy.cnfを編集
$ sudo vim /etc/mysql/my.cnf
マスターサーバーでserver-idを設定、bind-addressをコメントアウト
# /etc/mysql/my.cnf
[mysqld]
server-id = 3306
log-bin = mysql-bin
#bind-address = 127.0.0.1
設定を反映
$ sudo service mysql restart
マスターサーバーサーバーでmysqldumpする
$ mysqldump -u root -p --all-databases --routines \
--master-data=2 --single-transaction | gzip > /home/technuma/mysql-3307.sql.gz
マスターサーバーサーバーでバックアップサーバーにscpする
$ scp -P 19868 mysql-3307.sql.gz technuma@PASSWORD:/home/technuma/
バックアップサーバーでdumpファイルを解凍
$ gunzip /home/technuma/mysql-3307.sql.gz
バックアップサーバーで"CHANGE MASTER"をgrepしてMASTER_LOG_FILE,MASTER_LOG_POSを記録しておく
$ head -n 50 /home/technuma/mysql-3307.sql | grep "CHANGE MASTER"
バックアップサーバーでMySQL再起動
$ sudo mysqladmin -u root -S /var/lib/mysql-3307/mysqld.sock shutdown
$ sudo mysqld_safe --defaults-file=/var/lib/mysql-3307/my.cnf --skip-slave-start &
バックアップサーバーでインポートする
$ sudo mysql -u root -S /var/lib/mysql-3307/mysqld.sock -p < /home/technuma/mysql-3307.sql
バックアップサーバーでMySQL再起動
$ sudo mysqladmin -u root -S /var/lib/mysql-3307/mysqld.sock shutdown
$ sudo mysqld_safe --defaults-file=/var/lib/mysql-3307/my.cnf --skip-slave-start &
バックアップサーバーでMySQL接続
$ sudo mysql -u root -S /var/lib/mysql-3307/mysqld.sock -p
バックアップサーバーでslaveできているか確認 Slave has read all relay log; が表示され、Exec_Master_Log_Posが増加するのを確認
mysql > show slave status\G
mysql > change master to
master_host='MASTERSERVERIP',
master_user='repluser',
master_password='REPLUSERPASS',
master_port=3306,
master_log_file='MASTER_LOG_FILE',
master_log_pos=MASTER_LOG_POS;
slaveができているか確認
mysql > show slave status\G