MySQLで差分バックアップをとる

リストア処理においてフルバックアップと合わせて必要になるのが差分バックアップです。ということで備忘録。

1. バイナリログを記録する

まずはこれをしないと始まりません。設定ファイルのlog-binの項目をコメントインし、サーバーを再起動しておきましょう。

2. フルバックアップをとる

--flush-logsオプションをつけてログをローテートしておきます。こうしておくとリストア時にファイルの先頭から復元すればよいため手順がシンプルになります。

$ sudo mysqldump --flush-logs --lock-all-tables --all-databases > backup/full-$(date +%Y%m%d).sql

3. バイナリログを保存しておく

$ sudo mysqlbinlog /var/log/mysql/mysql-bin.000005 > binlog/diff-$(date +%H%M%S).sql

これで保存した分まで復元できるので常に最新のものを安全な場所に保管できるようにしておきましょう。

バックアップの処理はここまでで以降リストアの処理です。緊張感が欲しい方はDROP DATABASEしましょう。

4. フルバックアップを復元する

$ sudo mysql < backup/full-20181030.sql

フルバックアップ取得時まで復元しました。次にバイナリログ分を適用します。

5. バイナリログの適用

フルバックアップと同じようにmysqlコマンドに流すだけです。

$ sudo mysql < binlog/diff-193632.sql

これで完了です。

ログをローテートしたくないとき

バックアップ時に--master-data=2オプションをつけましょう。こうすることでダンプデータにどのバイナリログのどの位置からリストアすればいいかがわかります。

sudo mysqldump --lock-all-tables --all-databases --master-data=2 > backup/full-$(date +%Y%m%d).sql
$ head -n30 backup/full-20181030.sql | grep 'CHANGE MASTER'
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000005', MASTER_LOG_POS=831724;

位置を指定してリストアする

mysqlbinlog時に--start-positionを指定して展開します。

$ sudo mysqlbinlog --start-position=831724 /var/log/mysql/mysql-bin.000005 > binlog/diff-$(date +%H%M%S).sql

あとは同じリストア手順。(ということはバイナリログはmysqlbinlogを通さずそのまま保管したほうがいいのか......。)

参考