■ 1. イベント概要と背景
- 2025年11月14-15日に福岡工業大学でYAPC::Fukuoka 2025が開催された。
- 田中翼(yoku)さんが「今、MySQLのバックアップを作り直すとしたら何がどう良いのかを考える旅」というトークを実施した。
- yokuさんは日本MySQLユーザ会副代表で、2025年5月にさくらインターネットに入社したデータベース専門エンジニアである。
- さくらインターネットはガバメントクラウドの正式認定を受けるため、さくらのクラウドに機能追加を進めている。
■ 2. ガバメントクラウドのデータベースバックアップ要件
- ガバメントクラウドの調達仕様書には約300項目の技術要件が記載されている。
- データベースバックアップに関する要件は以下の4点である:
- DBのバックアップを差分で取得でき、取得したバックアップはいつでもDBの復元に使用できること。復元時は別のサイズを選択できること。
- DBのバックアップは一定期間(例:5分)以前のどの時点にでも戻せる形(Point In Time Restore: PITR)で取得できること。
- DBのバックアップは予め設定したタイミング、周期、世代で自動的に定期実行できること。
- DBのバックアップイメージはCSPの中であれば別のシステム、別のネットワーク、別の環境からも利用できること。
- 特に「DBのバックアップを差分で取得できること」と「どの時点にでも戻せる形(PITR)で取得できること」の2点が重要な検討事項となった。
■ 3. データベースバックアップ手法の分類
- フルバックアップ:
- データベース全体のバックアップを取得する手法である。
- 差分バックアップ:
- 前回のフルバックアップと現在のデータベースの差分を取得する手法である。
- 増分バックアップ:
- 前回のバックアップと現在のデータベースの差分を取得する手法である。
- 前回のバックアップがフルバックアップとは限らない点が差分バックアップと異なる。
- 1月1日から1月8日にかけて3種類のバックアップを混在して実施する例が図で示された。
■ 4. PITR機能の実装方法
- PITR機能は3種類のバックアップ手法を組み合わせて要件を満たすバックアップを取得する。
- MySQLにおけるPITRはバイナリログを使用して実現される:
- バイナリログはデータベースの変更操作を記録したものである。
- フルバックアップを取った時点のバイナリログ情報を記録し、それ以降のバイナリログを継続的にコピーし続けることで実現できる。
- バイナリログは増分バックアップに相当する。
- ガバメントクラウドの要件「バックアップを差分で取得」とは厳密には異なるが、PITRを実現するにはフルバックアップとバイナリログだけで実装する方がシンプルである。
- 要件「一定時間(例:5分)以前のどの時点にも戻せる形で取得できること」は「少なくとも5分に1回バイナリログをバックアップすればよい」と解釈できる。
- mysqlbinlogコマンドでバイナリログをストリーミング出力させ、バイナリログが出力され次第すぐにバックアップとして保管される仕組みを実装した。
- バックアップコマンド例:
- target_binlogを特定し、mysqlbinlogコマンドで継続的に出力する。
- リストアコマンド例:
- xtrabackup_binlog_infoからtarget_binlogを取得し、該当するバイナリログファイルを順次取得してmysqlbinlogコマンドで適用する。
- リストアの流れ:
- 戻したい時刻を指定する。
- それよりも一番近いフルバックアップを入手する。
- フルバックアップよりも後、かつ戻したい時刻よりも前で最新の差分バックアップを入手し適用する。
- 戻したい時刻と差分バックアップの間のバイナリログを入手し適用する。
■ 5. MySQLのフルバックアップツール
- MySQLのフルバックアップを取得するツールは以下の通りである:
- コールドバックアップ
- MySQL Enterprise Backup
- Percona XtraBackup
- CLONE INSTANCE
- mysqldump
- MySQL Shell Dump/Load Utility
- MyDumper
- mysqldumpは有名だが遅いため推奨されない。
- 差分が取れるフルバックアップツールはMySQL Enterprise Backup(MEB)とPercona XtraBackup(xb)の2つである。
- これらのツールの動作原理:
- ibdファイル(InnoDBのデータファイル)をコピーしている間、継続的にInnoDBログをコピーし続けることでバックアップを取得する。
- リストアはバックアップ時にコピーしたibdファイルとInnoDBログを使用して実行する。
■ 6. バックアップとリストアの実装例
- xtrabackupを使用したフルバックアップと差分バックアップの実行例:
- フルバックアップ: xtrabackupコマンドで--backupオプションと--target-dirオプションを指定する。
- 差分バックアップ: 最新のフルバックアップを特定し、--incremental-basedirオプションで指定する。
- 増分バックアップは常に取り続ける(リストア時に必要となるため)。
- xtrabackupを使用したリストアの実行例:
- フルバックアップからのリストア: 指定時刻より前の最新のフルバックアップを特定し、xtrabackup --prepareコマンドで--apply-log-onlyオプションを指定して実行する。差分バックアップがない場合は--apply-log-onlyをつけてはいけない。
- 差分のリストア: 指定時刻より前の最新の差分バックアップを特定し、xtrabackup --prepareコマンドで--incremental-dirオプションを指定して実行する。
- mysqlshを使用したバックアップとリストアの実行例:
- フルバックアップ: mysqlshコマンドでutil dumpInstanceを実行する。
- リストア対象の識別: 指定時刻より前の最新のフルバックアップを@.jsonファイルから特定する。
- @.jsonファイルからバイナリログの情報(binlogFile、binlogPosition、gtidExecuted)も取り出せる。
■ 7. まとめと成果
- MySQLのバックアップはxtrabackupとバイナリログを使用することで実現できる。
- mysqlshを使用する方法もあり、フルバックアップも増分バックアップもmysqlshコマンドで取得可能である。
- 今回の成果はさくらのクラウドのデータベースアプライアンスにおけるPITR機能としてリリースされた。
- PITR機能が使用できるのはMariaDBのみである。
- MariaDBはMySQLから派生したソフトウェアだが、現在は互換性がなくなっているため、検討した内容がそのまま実装されているわけではない。
- 検討した成果によってガバメントクラウドの要件をいくつかクリアできた。
- さくらのクラウドはガバメントクラウドの正式認定を目指して前進を続けている。