MySQL差分バックアップをxtrabackupで実装する手順|フル取得との組み合わせ設計

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > Linuxtips > データーベース管理 > MySQL差分バックアップをxtrabackupで実装する手順|フル取得との組み合わせ設計
MySQL のバックアップ設計で「フルバックアップだけでは毎回時間がかかりすぎる」「差分だけでは復元手順が複雑になる」と悩んだことはないでしょうか。
業務DBが大きくなるほど、mysqldump だけでは運用が回らなくなります。

この記事では、Percona XtraBackup を使って MySQL の差分バックアップ(incremental backup)を実装する手順を解説します。フルバックアップとの組み合わせ設計・世代ローテーション・リストア手順まで、実際のコマンド出力例を交えて一通り説明します。

この記事のポイント

・xtrabackup --incremental でフル取得後の差分だけを効率よく取得できる
・差分は LSN(ログシーケンス番号)を基点に取得するので整合性が保証される
・リストアは「フル適用 → 差分順に適用 → prepare → コピーバック」の4ステップ
・週1フル+日次差分の組み合わせがバックアップ時間と復元容易性のバランスが取れる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

なぜ 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!

フルバックアップ完了後、 ファイルに LSN が記録されます。

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回目以降の差分は、直前の差分ディレクトリを basedir に指定します。

# 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 {} +

crontab への登録例(毎日午前2時に実行):

0 2 * * * root /usr/local/sbin/mysql-incremental-backup.sh >> /var/log/mysql-backup.log 2>&1

Linux セミナーでは、バックアップ設計を含むMySQL 運用の「型」を体系的にハンズオンで学べます。

差分バックアップからのリストア手順

リストアは「フル準備(--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サーバー構築の「型」を体系的に身につけたい方へ、MySQL バックアップ設計を含むサーバー運用の実践スキルをまとめて習得できます。
>> Linux Master Pro Seminar(少人数ハンズオン)の詳細を見る

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。