2026年5月20日
2026年5月20日
WordPressのデータベースをバックアップする方法(mysqldump・WP-CLI・UpdraftPlus)
WordPress の記事・固定ページ・コメント・設定・ユーザー情報は、すべてデータベース(MySQL または MariaDB)に入っています。画像やテーマ、プラグインは wp-content 以下のファイルなので、データベースのバックアップとは別に取る必要があります。
この記事では、データベースのバックアップを次の3つの方法で取る手順と、自動化・保管・復元テストの方法を説明します。
| 方法 | 向いている環境 | 必要なもの |
|---|---|---|
| mysqldump | SSH が使える VPS・専用サーバー | データベースのユーザー名とパスワード |
WP-CLI(wp db export) |
SSH と WP-CLI が使える環境 | WP-CLI(接続情報は wp-config.php から読む) |
| UpdraftPlus | SSH が使えないレンタルサーバー | 管理画面へのログイン |
バックアップを取る前に確認すること
接続情報を確認する
データベース名・ユーザー名・ホストは wp-config.php に書かれています。
grep -E "DB_NAME|DB_USER|DB_HOST|table_prefix" /var/www/html/wp-config.php
/var/www/html は WordPress を置いたディレクトリに読み替えてください。パスワード(DB_PASSWORD)は画面やログに残さないよう、必要なときだけファイルを開いて確認します。
保存先のディレクトリを用意する
バックアップは公開ディレクトリ(ドキュメントルート)の外に置きます。公開ディレクトリに置くと、URL を推測されてダウンロードされるおそれがあります。
この記事の VPS 向けのコマンドは、root のシェル(sudo -i で切り替えたもの)で実行する前提です。保存先を root だけが読めるディレクトリにするためで、WP-CLI だけはファイルの所有者のユーザーで動かします。
mkdir -p /var/backups/wordpress
chmod 700 /var/backups/wordpress
方法1:mysqldump でバックアップする
パスワードをオプションファイルに書く
--password=... のようにコマンドラインへパスワードを書くと、シェルの履歴やプロセス一覧に残ります。MySQL のクライアントは、オプションファイルの [mysqldump] グループから接続情報を読めます。
# /root/.wp-backup.cnf
[mysqldump]
user=wp_user
password=ここにDB_PASSWORDの値
host=localhost
chmod 600 /root/.wp-backup.cnf
ダンプを取る
mysqldump --defaults-extra-file=/root/.wp-backup.cnf \
--single-transaction \
--no-tablespaces \
wp_database | gzip > /var/backups/wordpress/db_$(date +%Y%m%d_%H%M%S).sql.gz
--defaults-extra-fileは最初のオプションとして書く必要があります。--single-transactionは、InnoDB のテーブルをロックせずに、開始時点で整合したデータを書き出します。現在の WordPress のテーブルは通常 InnoDB です。--no-tablespacesは、MySQL 8.0.21 以降で PROCESS 権限のないユーザーが実行したときに出る「you need (at least one of) the PROCESS privilege(s)」というエラーを避けます。WordPress の復元には表領域の情報は不要です。- MariaDB では
mariadb-dumpという名前のコマンドが正式名で、環境によってはmysqldumpが無い場合があります。その場合はmysqldumpをmariadb-dumpに置き換えてください(オプションは同じです)。
中身を確認する
ls -lh /var/backups/wordpress/
zcat /var/backups/wordpress/db_20261110_020000.sql.gz | head -20
ファイル名は実際に作られたものに置き換えます。先頭に -- MySQL dump や -- MariaDB dump の行があり、CREATE TABLE 文が続いていれば書き出せています。
方法2:WP-CLI の wp db export でバックアップする
WP-CLI の wp db export は、wp-config.php の接続情報を使って mysqldump を実行します。パスワードを別に用意しなくて済むのが利点です。
ファイル名に - を指定すると標準出力に書き出すので、圧縮しながら保存できます。WP-CLI は WordPress のファイルの所有者(Ubuntu の Apache なら www-data)として実行し、出力の保存は root のシェルが行います。
sudo -u www-data wp --path=/var/www/html db export - | gzip > /var/backups/wordpress/db_$(date +%Y%m%d_%H%M%S).sql.gz
ファイル名を指定した場合(例:wp db export backup.sql)は、実行したユーザーが書き込める場所に書き出されます。ファイル名を省略すると、カレントディレクトリに「データベース名-日付-ランダムな文字列.sql」の名前で作られます。
wp db exportは既定で--no-tablespacesを付けて mysqldump を呼びます(付けたくない場合は--include-tablespaces)。--single-transactionなど mysqldump のオプションは、そのまま付け足せます(例:wp db export - --single-transaction)。- 特定のテーブルだけなら
--tables=wp_posts,wp_postmeta、除外するなら--exclude_tables=...を使います。 - root で実行する場合は
--allow-rootが必要ですが、ファイルの所有者を変えてしまうことがあるため、上のように所有者のユーザーで実行するのが安全です。
WP-CLI の基本は WP-CLIでデータベースをエクスポートする方法 にもまとめています。
方法3:UpdraftPlus でバックアップする(SSH が使えない場合)
SSH が使えないレンタルサーバーでは、バックアッププラグインを使います。UpdraftPlus は無料版でデータベースとファイルのバックアップ、スケジュール実行、復元、外部ストレージへの保存ができます(2026年11月時点、バージョン 1.26.14)。
- 管理画面の「プラグイン」→「新規追加」で UpdraftPlus を検索してインストールし、有効化します。
- 「設定」→「UpdraftPlus バックアップ」を開き、「設定」タブを表示します。
- 「ファイルのバックアップスケジュール」と「データベースバックアップのスケジュール」で間隔(例:毎日)と、「予約からのバックアップを保存しておく数」を指定します。無料版では 2・4・8・12 時間ごと、毎日、毎週、2週間ごと、毎月から選べます。
- 保存先(リモートストレージ)を選びます。無料版では Dropbox、Google Drive、Amazon S3(互換ストレージを含む)、FTP、メールなどが使えます。選んだサービスの画面の指示に従って連携します。
- 「変更を保存」を押し、「バックアップ / 復元」タブの「今すぐバックアップ」で一度手動実行して、「既存のバックアップ」に表示されることを確認します。
差分バックアップやデータベースの暗号化は有料版の機能です。
バックアップを自動化する(cron)
mysqldump や WP-CLI を使う場合は、シェルスクリプトを cron から毎日実行します。
#!/bin/bash
# /usr/local/bin/wp-db-backup.sh
set -euo pipefail
WP_PATH="/var/www/html"
BACKUP_DIR="/var/backups/wordpress"
KEEP_DAYS=7
FILE="${BACKUP_DIR}/db_$(date +%Y%m%d_%H%M%S).sql.gz"
mkdir -p "$BACKUP_DIR"
# DB をエクスポートして圧縮(失敗したら set -e と pipefail で止まる)
sudo -u www-data wp --path="$WP_PATH" db export - --single-transaction | gzip > "$FILE"
# 圧縮ファイルが壊れていないか確認
gzip -t "$FILE"
# 保存日数を過ぎたファイルを削除
find "$BACKUP_DIR" -name 'db_*.sql.gz' -mtime +"$KEEP_DAYS" -delete
echo "$(date '+%F %T') backup ok: $FILE"
chmod 700 /usr/local/bin/wp-db-backup.sh
crontab -e
root の crontab に次の1行を追加します(毎日 2:00 に実行し、結果をログに追記)。
0 2 * * * /usr/local/bin/wp-db-backup.sh >> /var/log/wp-db-backup.log 2>&1
set -o pipefail を付けないと、wp db export が失敗しても gzip が成功すれば成功扱いになり、空のバックアップが残ります。
バックアップをサーバーの外に保存する
同じサーバーに置いたバックアップは、ディスク障害やサーバーの乗っ取りで一緒に失われます。少なくとも1つはサーバーの外に置きます。Amazon S3 を使う例です(AWS CLI をインストールし、書き込み権限だけを持つ IAM ユーザーの認証情報を設定済みとします)。
# 上のスクリプトの最後に追加する
aws s3 cp "$FILE" "s3://your-backup-bucket/wordpress/db/" --storage-class STANDARD_IA
S3 に置いた古いファイルは、スクリプトで消すよりも、バケットのライフサイクルルールで「作成から○日後に削除」と指定するほうが、スクリプトの誤りで消し過ぎる心配がありません。
あわせて wp-content(アップロード画像・テーマ・プラグイン)もアーカイブして保存しておくと、サーバーごと失ったときにも復元できます。
tar -czf /var/backups/wordpress/files_$(date +%Y%m%d).tar.gz \
-C /var/www/html wp-content --exclude=wp-content/cache
復元できるか確認する
バックアップは、実際に戻せることを確かめて初めて役に立ちます。本番とは別のテスト環境(別のデータベース)で復元してみます。
# 圧縮ファイルが壊れていないか
gzip -t /var/backups/wordpress/db_20261110_020000.sql.gz && echo OK
# テーブル数を数える(WordPress 本体だけなら 12 個前後、プラグインで増える)
zcat /var/backups/wordpress/db_20261110_020000.sql.gz | grep -c '^CREATE TABLE'
# テスト環境の WordPress に取り込む(wp db import は「-」で標準入力から読む)
zcat /var/backups/wordpress/db_20261110_020000.sql.gz | sudo -u www-data wp --path=/var/www/test db import -
# 記事が読めるか確認
sudo -u www-data wp --path=/var/www/test post list --posts_per_page=5
テスト環境のドメインが本番と違う場合は、復元後に wp search-replace で URL を置き換えないと、管理画面へのアクセスが本番に飛ばされます。
注意点
wp db importやmysqlでの復元は、取り込み先のデータベースの内容を上書きします。本番に戻すときは、戻す前にその時点のバックアップを別に取ってください。- オプションファイルやスクリプトには DB のパスワードが入ります。権限を
600/700にし、Git などに含めないようにします。 - レンタルサーバーでは、サーバー会社の自動バックアップ機能がある場合があります。保存期間と復元方法(無料か有料か)を事前に確認しておくと、プラグインと組み合わせて使えます。