2015年3月27日金曜日

絶対にロックしたくないMySQLマスターからレプリケーション構築 innobackupex編

brett jordan Follow Slave or Free?  BLAZE 'Slave or Free?' Houseparty, 1993
mysqldumpのダンプデータを使って、レプリケーション用のダンプファイルを作るとします。このとき、mysqldump に --master-data を付与すると "FLUSH TABLES WITH READ LOCK" が発行され、一瞬のあいだ、全テーブルがロックします。
mysqldump -uroot -pxxxxxxxx --single-transaction --master-data=2 --all-databases | gzip >  20150327.sql.gz

2095627 Query FLUSH TABLES WITH READ LOCK
2095627 Query SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
2095627 Query START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
2095627 Query SHOW MASTER STATUS
2095627 Query UNLOCK TABLES
上記のような状況を回避して、MySQLマスターをロックせずレプリケーションを構築するためにXtraBackupを利用します。 
通常、innobackupexを使ってバックアップをするとロックを発行するのですが、 --no-lockで回避します。
 --no-lock オプションを付与すると、binlogのポジションが記述されるはずの xtrabackup_binlog_info ファイルが作成されません。
しかし、--apply-logコマンドでリカバリ用のファイルを作成すると、ログにbinlogのポジションが出力されます。これを利用してレプリケーションを構築できます。 

以下、作業ログです。

MySQLマスターサーバ

XtraBackupをインストール
# rpm -Uhv http://www.percona.com/redir/downloads/percona-release/percona-release-0.0-1.x86_64.rpm
# yum -y install xtrabackup
バックアップディレクトリ作成
# mkdir -p /tmp/xtrabackup/
バックアップ実行 --no-lockオプションを付与する
# time innobackupex --user root --password xxxxxxxx /tmp/xtrabackup/ --no-lock
フォルダをスレーブサーバへscp(転送制限を5MB/sに設定)
# scp -r -l 40000 /tmp/xtrabackup/2015-03-25_09-31-50 username@100.100.100.100:/tmp/


MySQLスレーブサーバ

XtraBackupをインストール
# rpm -Uhv http://www.percona.com/redir/downloads/percona-release/percona-release-0.0-1.x86_64.rpm
# yum -y install xtrabackup
MySQLリストア用にデータディレクトリを空にしておく
# /etc/init.d/mysqld stop
# mv /var/lib/mysql /var/lib/mysql.old
# mkdir /var/lib/mysql
バックアップの準備とポジションの確認
$ innobackupex --apply-log /tmp/2015-03-25_09-31-50
[notice (again)]
  If you use binary log and don't use any hack of group commit,
  the binary log position seems to be:
InnoDB: Last MySQL binlog file position 0 431897511, file name mysql-bin.000009
binlogのポジションは、431897511
binlogファイルは、mysql-bin.000009

リストア実行
$ innobackupex --copy-back /tmp/2015-03-25_09-31-50
$ chown -R mysql:mysql /var/lib/mysql
# /etc/init.d/mysqld start 

あとは、 先ほど確認したbinlogのポジションを利用して "CHANGE MASTER TO" コマンドでレプリケーションをスタートさせればOKです。
ちゃんと、レプリケーションされているか確認してみてください。

参考資料)
Percona xtrabackup - MySQL Meetup @ Mumbai
http://www.slideshare.net/nilnandan/percona-xtrabackup-mysql-meetup-mumbai/48
Working with Binary Logs — Percona XtraBackup Documentation
http://www.percona.com/doc/percona-xtrabackup/2.1/xtrabackup_bin/working_with_binary_logs.html
漢(オトコ)のコンピュータ道: MySQLバックアップ頂上決戦!! LVMスナップショット vs InnoDB Hot Backup
http://nippondanji.blogspot.jp/2009/12/mysql-lvm-vs-innodb-hot-backup.html