業務DBが大きくなるほど、mysqldump だけでは運用が回らなくなります。
この記事では、Percona XtraBackup を使って MySQL の差分バックアップ(incremental backup)を実装する手順を解説します。フルバックアップとの組み合わせ設計・世代ローテーション・リストア手順まで、実際のコマンド出力例を交えて一通り説明します。
この記事のポイント
・xtrabackup --incremental でフル取得後の差分だけを効率よく取得できる
・差分は LSN(ログシーケンス番号)を基点に取得するので整合性が保証される
・リストアは「フル適用 → 差分順に適用 → prepare → コピーバック」の4ステップ
・週1フル+日次差分の組み合わせがバックアップ時間と復元容易性のバランスが取れる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜ mysqldump の代わりに xtrabackup を使うのか
mysqldump はテーブルロックが発生するため、運用中の大容量 DB に対して毎晩フルバックアップを取ると業務影響が出ます。Percona XtraBackup はストレージエンジン(InnoDB)のデータファイルを物理コピーするホットバックアップツールです。ロックなしでバックアップできる上、「差分バックアップ(incremental)」機能を持っており、前回取得以降に変更されたページだけをバックアップできます。
・フルバックアップ:全データファイルをコピー。取得時間・容量が大きいが復元が単純
・差分バックアップ(incremental):前回フル or 差分との差分だけをコピー。取得が速く容量が小さい
・binlog による論理差分:ポイントインタイムリカバリ用。xtrabackup と組み合わせると任意時点への復元が可能
環境と前提条件
本記事の手順は以下の環境で動作確認しています。・OS:Rocky Linux 9.4 / Ubuntu 24.04 LTS
・MySQL:8.0.36(MariaDB 10.11 でも同様の手順で動作)
・Percona XtraBackup:8.0.35-31
・バックアップ先:/backup/mysql/(マウント済みの別ボリューム)
注意:XtraBackup のメジャーバージョンは MySQL のメジャーバージョンと一致させる必要があります。MySQL 8.0 には xtrabackup 8.0 を使用してください。
Percona XtraBackup のインストール
1. Rocky Linux / RHEL 9 の場合
# Percona リポジトリを追加 sudo yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm # XtraBackup 8.0 を有効化してインストール sudo percona-release setup pxb80 sudo yum install -y percona-xtrabackup-80 # バージョン確認 xtrabackup --version
xtrabackup version 8.0.35-31 based on MySQL 8.0.35 Linux (x86_64)
2. Ubuntu 24.04 の場合
# Percona リポジトリを追加 wget https://repo.percona.com/apt/percona-release_latest.noble_all.deb sudo dpkg -i percona-release_latest.noble_all.deb sudo percona-release setup pxb80 # インストール sudo apt-get update sudo apt-get install -y percona-xtrabackup-80
バックアップ用 MySQL ユーザーの作成
バックアップには専用の MySQL ユーザーを使います。root を使い回すのは避けてください。# MySQL に root でログイン mysql -u root -p -- バックアップ専用ユーザーを作成(ローカル接続のみ許可) CREATE USER 'xtrabackup'@'localhost' IDENTIFIED BY 'your_strong_password'; -- 必要な権限を付与 GRANT BACKUP_ADMIN, PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'xtrabackup'@'localhost'; FLUSH PRIVILEGES;
フルバックアップの取得(差分の基点)
差分バックアップは「直前のフルバックアップの LSN」を基点にするため、まずフルバックアップを取得します。1. バックアップディレクトリを準備する
sudo mkdir -p /backup/mysql/full sudo mkdir -p /backup/mysql/incremental sudo chown -R mysql:mysql /backup/mysql
2. フルバックアップを実行する
sudo xtrabackup --user=xtrabackup --password=your_strong_password --backup --target-dir=/backup/mysql/full/20261001
[00] 2026-10-01 02:00:01 Executing UNLOCK INSTANCE [00] 2026-10-01 02:00:01 All tables unlocked [00] 2026-10-01 02:00:02 completed OK!
cat /backup/mysql/full/20261001/xtrabackup_checkpoints
backup_type = full-backuped from_lsn = 0 to_lsn = 4259675842 last_lsn = 4259675843 compact = 0 recover_binlog_info = 0
差分バックアップ(incremental)の取得手順
1. 差分バックアップを実行する
にフルバックアップのディレクトリを指定します。# 初回差分(フルを基点に) sudo xtrabackup --user=xtrabackup --password=your_strong_password --backup --incremental-basedir=/backup/mysql/full/20261001 --target-dir=/backup/mysql/incremental/20261002
# 2回目の差分(前日差分を基点に) sudo xtrabackup --user=xtrabackup --password=your_strong_password --backup --incremental-basedir=/backup/mysql/incremental/20261002 --target-dir=/backup/mysql/incremental/20261003
2. 差分チェックポイントを確認する
cat /backup/mysql/incremental/20261002/xtrabackup_checkpoints
backup_type = incremental from_lsn = 4259675842 to_lsn = 4261093714 last_lsn = 4261093715 compact = 0 recover_binlog_info = 0
週1フル+日次差分の運用設計
実務で使いやすいのは「週1フル+平日6日分の日次差分」の組み合わせです。・日曜深夜:フルバックアップ(basedir を weekly-full に固定)
・月曜~土曜深夜:差分バックアップ(basedir を直前差分に更新)
・保持世代:フル2世代+差分14日分
以下のシェルスクリプトで自動化できます。
#!/bin/bash # /usr/local/sbin/mysql-incremental-backup.sh set -euo pipefail BACKUP_BASE=/backup/mysql FULL_DIR=/full INC_DIR=/incremental XB_USER=xtrabackup XB_PASS=your_strong_password TODAY=20261001 DOW=4 # 1=月曜 ... 7=日曜 if [ "" -eq 7 ]; then # 日曜:フルバックアップ TARGET=/ xtrabackup --user= --password= --backup --target-dir= echo "" > /latest_full.txt else # 平日:差分バックアップ # 基点は「直前の差分」または「最新フル」 PREV= if [ -z "" ]; then # まだ差分がなければフルを基点にする BASEDIR=/ else BASEDIR= fi TARGET=/ xtrabackup --user= --password= --backup --incremental-basedir= --target-dir= fi # 14日以上古い差分を削除 find -maxdepth 1 -type d -mtime +14 -exec rm -rf {} +
0 2 * * * root /usr/local/sbin/mysql-incremental-backup.sh >> /var/log/mysql-backup.log 2>&1
差分バックアップからのリストア手順
リストアは「フル準備(--prepare)→ 差分順に適用(--apply-log-only)→ 最終 prepare → コピーバック」の手順で行います。1. フルバックアップを prepare する(--apply-log-only)
差分を後で適用できるよう を付けます(ロールフォワードを止める)。sudo xtrabackup --prepare --apply-log-only --target-dir=/backup/mysql/full/20261001
2. 差分を順番に適用する
差分が複数ある場合、取得した順番(古い順)で適用します。最後の差分だけは を付けません。# 1枚目の差分(まだ後続があるので --apply-log-only) sudo xtrabackup --prepare --apply-log-only --target-dir=/backup/mysql/full/20261001 --incremental-dir=/backup/mysql/incremental/20261002 # 2枚目の差分(最後なので --apply-log-only を外す) sudo xtrabackup --prepare --target-dir=/backup/mysql/full/20261001 --incremental-dir=/backup/mysql/incremental/20261003
3. MySQL を停止してデータディレクトリをコピーバックする
# MySQL を停止 sudo systemctl stop mysqld # 既存のデータディレクトリを退避(念のため) sudo mv /var/lib/mysql /var/lib/mysql.old # コピーバック sudo xtrabackup --copy-back --target-dir=/backup/mysql/full/20261001 # 所有者を修正して起動 sudo chown -R mysql:mysql /var/lib/mysql sudo systemctl start mysqld
トラブルシュート・よくあるエラー
「The --incremental-basedir ... is not consistent」が出る場合
basedir の の と、取得しようとしている差分の が一致しないと発生します。差分の連鎖が切れている(途中で別のフルや差分が割り込んだ)ときに起きます。対処: や差分ディレクトリの日付を確認し、LSN の連鎖が正しいかチェックしてください。
「xtrabackup: Error: ... access denied」が出る場合
バックアップ用ユーザーへの権限付与が不足しています。MySQL 8.0.20 以降では 権限が必要です。GRANT BACKUP_ADMIN ON *.* TO 'xtrabackup'@'localhost'; FLUSH PRIVILEGES;
バックアップサイズが想定より大きい場合
差分が正しく機能しているかチェックします。 の が 0 になっていたらフルが取れています(差分のつもりが basedir の指定ミスでフル取得になっている)。本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| フルバックアップを取得する | xtrabackup --backup --target-dir=/backup/mysql/full/日付 |
| 差分バックアップを取得する | xtrabackup --backup --incremental-basedir=基点DIR --target-dir=保存先 |
| フルを prepare する(差分適用前) | xtrabackup --prepare --apply-log-only --target-dir=フルDIR |
| 差分を適用する(最後以外) | xtrabackup --prepare --apply-log-only --target-dir=フルDIR --incremental-dir=差分DIR |
| 差分を適用する(最後の1枚) | xtrabackup --prepare --target-dir=フルDIR --incremental-dir=最終差分DIR |
| データをコピーバックする | xtrabackup --copy-back --target-dir=フルDIR |
| LSN の連鎖を確認する | cat バックアップDIR/xtrabackup_checkpoints |
差分バックアップの肝は「LSN の連鎖を切らさないこと」です。スクリプトが自動的に basedir を更新する仕組みを作り、復元訓練を定期的に実施することで、いざというときにも安全に復旧できる運用体制が整います。
>> Linux Master Pro Seminar(少人数ハンズオン)の詳細を見る
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:MariaDB dumpで確実にバックアップする方法|mysqldumpとmariadb-dumpコマンド比較
- この記事の属するカテゴリ:データーベース管理へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます