稼働中の MySQLサーバ から slaveサーバ を構築する備忘録

こんにちは。
MySQLサーバ の slaveサーバを構築する機会があったので備忘録を残しておきます。

確認事項

バイナリログが出力されていて、尚且つ server-id が設定されている必要があります。

vi /etc/my.cnf
=======================================
server-id=1001
log-bin = /var/lib/mysql/mysql-bin
=======================================

systemctl restart mysqld

レプリケーション用ユーザの作成

レプリケーション用のユーザを事前に作成しておきます。

create user 'repl'@'%' identified by 'xxxxxxxxxx';
grant replication slave on *.* to 'repl'@'%';

dumpファイルの取得

mysqldump で dumpデータを取得します。
ストレージエンジンが innodb であれば、–single-transaction オプションで DBをロックせずに取得が可能です。
また、–master-data=2 オプションでバイナリログの読み出し開始位置を出力しておきます。

mysqldump -u root -p --skip-lock-tables --quote-names --single-transaction --master-data=2 -A > /var/tmp/mysqldump.sql

dumpファイルのインポート

slaveサーバ に dumpファイルを転送して流し込みます。
単純に mysql コマンドとリダイレクトを組み合わせるだけで大丈夫です。

scp user@xxx.xxx.xxx.xxx:/var/tmp/mysqldump.sql /var/tmp/.
mysql -u root -p < /var/tmp/mysqldump.sql

テーブルチェック

mysql_upgrade コマンドを使ってテーブルのチェックを行います。

mysql_upgrade -u root -p
systemctl restart mysqld

バイナリログの開始位置を確認

–master-data=2 オプションでバイナリログの読み出し開始位置が出力されているので確認します。

grep "CHANGE MASTER" /var/tmp/mysqldump.sql

レプリケーション設定

mysql> change master to
    -> master_host='xxx.xxx.xxx.xxx',
    -> master_user='repl',
    -> master_password='xxxxxxxxxx',
    -> master_log_file='[バイナリログ]',
    -> master_log_pos=[ポジション];

mysql> start slave;
mysql> show slave status\G