Percona XtraBackupガイド:システム停止の心配なしに100GB超のMySQLをバックアップする方法

MySQL tutorial - IT technology blog
MySQL tutorial - IT technology blog

課題:mysqldumpが本番環境の「悪夢」になる時

DevOpsを始めたばかりの頃、150GBほどのMySQLデータベースで苦い経験をしました。毎朝2時にmysqldumpのジョブが走るたびに、システムがスロークエリの警告を連発し始めました。ひどい時には、テーブルロックが長すぎてウェブサイトが完全にフリーズしてしまうこともありました。

問題の核心は、mysqldumpが「ロジカルバックアップ」である点にあります。これはデータを1行ずつ読み込み、SQLのINSERT文に変換する仕組みです。小規模なDBなら問題ありませんが、ユーザーテーブルが5,000万行を超えると、mysqldumpはカメのように遅くなり、I/O負荷も凄まじいものになります。たとえ--single-transactionオプションを使用しても、特定のタイミングでテーブルロックが発生し、サービス中断を招くリスクは依然として残ります。

そこで私が導入したのがPercona XtraBackupです。このツールは、データベースが稼働したままバックアップを行う「ホットバックアップ(Hot Backup)」を実行でき、テーブルロックを発生させません(ノンブロッキング)。以下に、私が実際に導入している手法を共有します。

なぜPercona XtraBackupは高速で安全なのか?

mysqldumpの「1行ずつ読み込む」方式とは異なり、Percona XtraBackupは物理バックアップツールです。ハードディスクから.ibd.frmといったファイルを直接別の場所にコピーするイメージです。

その仕組みは非常に合理的です。データコピー中に新しいトランザクションが発生すると、XtraBackupはそれをredoログに記録します。その後、自動的にこれらの変更を適用することで、バックアップの整合性を確保します。

注目のパフォーマンス指標:

  • スピード: 100GBのDBでの実測値では、mysqldumpが約3時間かかったのに対し、XtraBackupはわずか25〜30分で完了しました。
  • ゼロダウンタイム: バックアップ中もユーザーは通常通り読み書きが可能で、テーブルロック率は0%です。
  • リストア: MySQLのデータディレクトリにファイルをコピーし戻すだけので、数百万行のSQLを再実行するのを待つよりも遥かに高速です。

Ubuntuでのホットバックアップの実装

コマンドを入力する前に、MySQLのバージョンを確認してください。MySQL 8.0を使用している場合はXtraBackup 8.0を、MySQL 5.7以下の場合はバージョン2.4が最適です。

1. Percona XtraBackupのインストール

最新のバグ修正を適用するため、Perconaの公式リポジトリを使用することをお勧めします。

# リポジトリパッケージのダウンロードとインストール
wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb
sudo dpkg -i percona-release_latest.generic_all.deb

# アップデートとMySQL 8.0用パッケージのインストール
sudo apt update
sudo apt install percona-xtrabackup-80

2. 専用ユーザーの設定

セキュリティリスクが高いため、バックアップにroot権限をそのまま使うのは避けましょう。必要最小限の権限を持つユーザーを作成します。

CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'MatKhauBaoMat123';
GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'backup_user'@'localhost';
FLUSH PRIVILEGES;

3. フルバックアップの実行コマンド

バックアップを/data/backups/full_backupに保存する場合、以下のコマンドを実行します。

xtrabackup --backup --user=backup_user --password=MatKhauBaoMat123 --target-dir=/data/backups/full_backup

たとえ毎秒数千のリクエストを処理していても、XtraBackupはユーザー体験に影響を与えることなく、ディスクレイヤーで静かにデータをコピーします。

4. Prepareフェーズ — 成功の鍵を握るステップ

これは初心者が最も陥りやすいミスです。コピー直後のデータには未完了のトランザクションが含まれている可能性があるため、そのままでは使用できません。データを確定させるために「Prepare」というステップが必要です。

xtrabackup --prepare --target-dir=/data/backups/full_backup

画面にcompleted OK!と表示されれば、バックアップはクリーンで整合性が取れた状態になり、いつでも復元可能な準備が整いました。

トラブル発生時の復元手順

データベースに障害が発生した際は、落ち着いて以下の手順を実行してください。

  1. MySQLサービスの停止:sudo systemctl stop mysql
  2. 古いデータディレクトリの整理(削除ではなく移動を推奨):sudo mv /var/lib/mysql /var/lib/mysql_old
  3. バックアップデータの書き戻し:
xtrabackup --copy-back --target-dir=/data/backups/full_backup

重要な注意点: copy-backの後、ファイルはroot権限になっています。所有権をmysqlユーザーに戻さないと、サービスが起動しません。

sudo chown -R mysql:mysql /var/lib/mysql
sudo systemctl start mysql

大規模システム運用における実務的な視点

500GBから数TBに及ぶDBクラスターを5年間運用してきた経験から、いくつかのアドバイスがあります。

  • ディスク容量の監視: 常にストレージの空き容量を60〜70%以上確保しておきましょう。バックアップでディスクがいっぱいになり、ログの書き込みができずに本番サーバーがダウンしたケースを過去に見てきました。
  • ストリーミングによるデータ転送: サーバーに十分な空き容量がない場合は、SSHのパイプを使ってバックアップサーバーに直接転送しましょう。これは安全で、元サーバーのリソース節約にもなります。
  • 増分バックアップ(Incremental Backup): 500GBを超えるDBの場合、毎日フルバックアップを取るのは非効率です。増分バックアップを組み合わせてその日の変更分のみを保存することで、帯域負荷を大幅に削減できます。

おわりに

MySQLをプロフェッショナルに管理したいなら、Percona XtraBackupの採用は必須の選択です。テーブルロックの問題を根本的に解決するだけでなく、大規模なデータ復元シナリオに直面した際にも自信を持って対応できるようになります。システムの規模が拡大しているなら、今日からmysqldumpを卒業してXtraBackupに切り替えましょう。

Share: