バイナリログのマージ

何かしらの事情でバイナリログが作成されるディレクトリを変更したときに,そのログをマージする手順について検証したのでまとめ.

準備

通常のバイナリログ設定は以下の通り.

$ less /etc/my.cnf
---
  :
# binary logging - not required for slaves, but recommended
log-bin=/log/mysql-binlog/binlog
  :

一時的なバイナリログ(=テンポラリーログ)設定は以下の通り.

$ less /etc/my.cnf
---
  :
# binary logging - not required for slaves, but recommended
log-bin=/log/mysql-binlog2/binlog
  :

データベース名は hoge とし,作成済みとする.

手順

1.テーブルの作成,データ'a'の登録

# mysql -uUSER -pPASSWORD -Dhoge
mysql> create table t (id char(1)) type=innodb;
mysql> insert into t values('a');
mysql> select * from t;
mysql> \q

2.テンポラリーログを参照するように設定を変更する

# /etc/init.d/mysql.server stop
# vi /etc/my.cnf #log-bin=/log/mysql-binlog2/binlog
# /etc/init.d/mysql.server start

3.データ'B'の登録

# mysql -uUSER -pPASSWORD -Dhoge
mysql> insert into t values('B');
mysql> select * from t;
mysql> \q

4.通常のログを参照するように設定を変更する

# /etc/init.d/mysql.server stop
# vi /etc/my.cnf #log-bin=/log/mysql-binlog/binlog
# /etc/init.d/mysql.server start
→ このとき /log/mysql-binlog/binlog.000002 が作成されることを確認

5.MySQL を停止する

# /etc/init.d/mysql.server stop

6.テンポラリーログのコピー

# cp /log/mysql-binlog2/binlog.000001 /log/mysql-binlog/binlog.000002

7.MySQL を起動して登録データの確認

# /etc/init.d/mysql.server start
→ このとき /log/mysql-binlog/binlog.000003 が作成されることを確認
# mysql -uUSER -pPASSWORD -Dhoge
mysql> select * from t;
→ 登録データが a, B のみであることを確認
mysql> \q

8.バイナリログからのリカバリを行う

# /etc/init.d/mysql.server stop
# vi /etc/my.cnf #バイナリログを無効にする
# /etc/init.d/mysql.server start
# mysql -uUSER -pPASSWORD -Dhoge
mysql> drop table t;
mysql> \q
# mysqlbinlog /log/mysql-binlog/binlog.000001 | mysql -uUSER -pPASSWORD
# mysql -uUSER -pPASSWORD -Dhoge
mysql> select * from t;
→ 登録データが a のみであることを確認
mysql> \q
# mysqlbinlog /log/mysql-binlog/binlog.000002 | mysql -uUSER -pPASSWORD
# mysql -uUSER -pPASSWORD -Dhoge
mysql> select * from t;
→ 登録データが a, B のみであることを確認
mysql> \q
# mysqlbinlog /log/mysql-binlog/binlog.000003 | mysql -uUSER -pPASSWORD
# mysql -uUSER -pPASSWORD -Dhoge
mysql> select * from t;
→ 登録データが a, B のみであることを確認
mysql> \q