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を通さずそのまま保管したほうがいいのか......。)
参考
- 4.6.8.3 Using mysqlbinlog to Back Up Binary Log Files
- 1.3.1 Establishing a Backup Policy
- 7.5 Point-in-Time (Incremental) Recovery Using the Binary Log
- Incremental MySQL Backup with Binary Log
- MySQLのバイナリログを活用しリストア&リカバリで障害時でもDB完全復旧可能な体制を整える。
- MySQLのバイナリログを使った復旧手順 - Denet Tech Lib.
- MySQLバックアップの基礎 - 日常メモ