2026年5月25日
2026年5月25日
WordPressマルチサイトのバックアップ方法|データベースとファイル・自動化・1サイトだけの書き出し
WordPress のマルチサイトは、1つの WordPress で複数のサイトを運用する仕組みです。バックアップの基本は通常のサイトと同じで、「データベース」と「ファイル」の両方を取りますが、全サイトのデータが1つのデータベースと1つの wp-content に入っている点が異なります。この記事では、2026年10月時点の WordPress 7.1 と WP-CLI で確認した手順で、マルチサイトをまとめてバックアップする方法と、1サイトだけを書き出す方法を説明します。
マルチサイトのデータはどこにあるか
データベース
マルチサイトでは、全サイトのテーブルが1つのデータベースに入っています。接頭辞が wp_ の場合、次のようになります。
| テーブル | 内容 |
|---|---|
wp_posts・wp_options など(番号なし) |
メインサイト(ID 1)のデータ |
wp_2_posts・wp_2_options など |
サイト ID 2 のデータ(ID ごとに同じ構成のテーブルがある) |
wp_users・wp_usermeta |
全サイト共通のユーザー |
wp_blogs・wp_blogmeta・wp_site・wp_sitemeta・wp_signups・wp_registration_log |
ネットワークの設定とサイトの一覧 |
データベース全体を書き出せば、全サイトのデータがまとめてバックアップされます。
ファイル
- WordPress 本体、プラグイン、テーマは全サイトで共通です
- メディア(アップロードしたファイル)は、メインサイトが
wp-content/uploads/、それ以外のサイトがwp-content/uploads/sites/<サイトID>/に保存されます(WordPress 3.5 より前に作られたネットワークではwp-content/blogs.dir/の場合があります) wp-config.phpにはマルチサイトの設定が書かれています。Apache の場合は.htaccess、Nginx の場合はサーバーの設定ファイルにも、マルチサイト用の書き換え設定があります。これらもバックアップに含めます
マルチサイトかどうかを確認する
WordPress のディレクトリで次を実行します。終了コードが 0 ならマルチサイトです。
wp core is-installed --network && echo "マルチサイトです"
wp-config.php を直接確認する場合は、次のようにします。
grep -nE "define\(\s*'(MULTISITE|WP_ALLOW_MULTISITE)'" wp-config.php
2つの定数は意味が違います。
WP_ALLOW_MULTISITE:管理画面の「ツール」に「サイトネットワークの設置」を表示するための設定です。これだけではマルチサイトになっていませんMULTISITE:trueになっていれば、ネットワークが作成済みで、マルチサイトとして動いています
サイトの一覧と ID は次で確認できます。
wp site list --fields=blog_id,url
手動でバックアップする
WP-CLIを使う場合
WP-CLI は wp-config.php の接続情報を使うので、パスワードを入力せずにデータベースを書き出せます。
cd /var/www/example.com/public
# データベース全体(全サイト分)を書き出す
wp db export ~/backup/db-$(date +%Y%m%d).sql --single-transaction
# WordPress のディレクトリ全体を固める
tar -czf ~/backup/files-$(date +%Y%m%d).tar.gz -C /var/www/example.com public
--single-transactionはmysqldumpに渡されるオプションで、InnoDB のテーブルを、サイトを止めずに同じ時点の状態で書き出しますwp-config.phpを WordPress のディレクトリの1つ上に置いている場合は、そのファイルも別にコピーします- 保存先(ここでは
~/backup)は、Web から見えない場所にします
mysqldumpを直接使う場合
WP-CLI がない場合は mysqldump を使います。パスワードをコマンドに書くと、ほかのユーザーからプロセス一覧で見えることがあるため、権限を絞ったファイルに書きます。
# 接続情報のファイルを作る(値は wp-config.php の DB_USER・DB_PASSWORD・DB_HOST)
cat > ~/.wp-backup.cnf <<'EOF'
[client]
user=wpuser
password=ここにパスワード
host=localhost
EOF
chmod 600 ~/.wp-backup.cnf
# データベース全体を書き出す(--defaults-extra-file は最初に書く)
mysqldump --defaults-extra-file=$HOME/.wp-backup.cnf --single-transaction --default-character-set=utf8mb4 --no-tablespaces wpdb | gzip > ~/backup/db-$(date +%Y%m%d).sql.gz
wpdb は wp-config.php の DB_NAME に置き換えます。--no-tablespaces は、MySQL 8.0 の新しい版などで、権限不足(PROCESS 権限)のエラーを避けるために付けます。MariaDB では mysqldump の代わりに mariadb-dump という名前のコマンドが推奨されています。
cronで自動化する
毎日決まった時刻にバックアップを取るスクリプトの例です。/usr/local/bin/wp-multisite-backup.sh として保存し、先頭の3つの値を自分の環境に合わせます。
#!/bin/bash
# WordPress マルチサイトのバックアップ(データベース+ファイル)
set -euo pipefail
WP_PATH=/var/www/example.com/public # WordPress のディレクトリ(wp-config.php がある場所)
DEST=/var/backups/wp-multisite # 保存先(公開ディレクトリの外)
KEEP_DAYS=14 # 残す日数
PATH=/usr/local/bin:/usr/bin:/bin # cron から実行したときに wp コマンドを見つけるため
STAMP=$(date +%Y%m%d-%H%M)
umask 077
mkdir -p "$DEST"
# 1. データベース:ネットワーク全体(全サイトのテーブルと共通テーブル)を1ファイルに
wp --path="$WP_PATH" db export - --single-transaction | gzip > "$DEST/db-$STAMP.sql.gz"
# 2. ファイル:WordPress のディレクトリ全体(wp-content/uploads/sites/ も含む)
# tar は読み取り中にファイルが変わると終了コード 1 を返すため、1 は許容する
tar -czf "$DEST/files-$STAMP.tar.gz" -C "$(dirname "$WP_PATH")" "$(basename "$WP_PATH")" || {
rc=$?
[ "$rc" -eq 1 ] || exit "$rc"
}
# 3. 壊れていないかを確認
gzip -t "$DEST/db-$STAMP.sql.gz"
tar -tzf "$DEST/files-$STAMP.tar.gz" > /dev/null
# 4. 古いバックアップを削除
find "$DEST" -name 'db-*.sql.gz' -mtime +"$KEEP_DAYS" -delete
find "$DEST" -name 'files-*.tar.gz' -mtime +"$KEEP_DAYS" -delete
echo "backup done: $STAMP"
実行権限を付けて、一度手で動かして確認します。
sudo chmod 755 /usr/local/bin/wp-multisite-backup.sh
/usr/local/bin/wp-multisite-backup.sh
ls -l /var/backups/wp-multisite
- WordPress のファイルを所有しているユーザーで実行します。保存先のディレクトリには、そのユーザーが書き込めるようにしておきます
- root で実行する場合、WP-CLI は
--allow-rootを付けないと動きません。ファイルの所有者のユーザーで実行するほうが安全です umask 077により、バックアップのファイルは実行したユーザーだけが読めるようになります。中身には全ユーザーの情報が入っているためです
動作を確認したら、そのユーザーの crontab(crontab -e)に登録します。毎日3時30分に実行する例です。
30 3 * * * /usr/local/bin/wp-multisite-backup.sh >> $HOME/wp-backup.log 2>&1
crontab の行の中では、% が改行の意味になります。date +%Y%m%d のように % を含むコマンドを crontab に直接書く場合は、date +\%Y\%m\%d のように \% と書く必要があります。上の例のように処理をスクリプトにまとめておけば、この問題は起きません。
cron が失敗していないかを知る方法は cronジョブの実行監視と失敗通知設定 を参照してください。
1つのサイトだけを書き出す
特定のサイトのテーブルだけを書き出すには、wp db tables でそのサイトのテーブルを選びます。--url にはサイトの URL(wp site list で表示されるもの)を指定します。
# サイト(例:https://example.com/shop/)のテーブルだけを書き出す
wp db export shop.sql --single-transaction --tables="$(wp db tables --scope=blog --url=https://example.com/shop/ --format=csv)"
--scope=blog を付けると、そのサイトの wp_<ID>_ で始まるテーブルだけが選ばれ、ユーザーなどの共通テーブルは含まれません。メディアは wp-content/uploads/sites/<サイトID>/ を別に固めます。
復元するときの注意
- ネットワーク全体を戻す:データベースのバックアップを丸ごと読み込み、ファイルを展開すれば元に戻ります。WP-CLI では
wp db import ファイル名.sqlで読み込めます - 1つのサイトだけを戻す:そのサイトの
wp_<ID>_テーブルとメディアだけを戻します。ユーザー(wp_users・wp_usermeta)やネットワークの設定(wp_blogs・wp_site・wp_sitemeta)は全サイト共通なので、1サイトを戻す目的で上書きすると、ほかのサイトにも影響します - ドメインや URL を変えて戻す:サイトの URL はサイトごとの
wp_<ID>_optionsだけでなくwp_blogsやwp_siteにも入っています。置換はwp search-replaceに--networkを付けて全サイトを対象にします。手順は WP-CLIのnetworkコマンドでマルチサイトのネットワーク設定を操作する方法 もあわせて確認してください
バックアップは、取れているだけでなく戻せることが大切です。本番とは別の環境に読み込んで、サイトが表示されるかを定期的に確かめます(WordPressのバックアップテストと復元確認の方法)。
保管場所
同じサーバーにだけバックアップを置いていると、サーバーの故障や不正アクセスで一緒に失われます。外部のストレージにも送っておきます(rcloneでクラウドストレージにバックアップする方法|S3設定・暗号化・cron自動化まで)。データベースのバックアップには全サイトのユーザー情報が入っているため、送り先でも閲覧できる人を限定します。
まとめ
- マルチサイトは全サイトのテーブルが1つのデータベースにあり、データベース全体を書き出せば全サイト分のバックアップになる
- ファイルは WordPress のディレクトリ全体(
wp-content/uploads/sites/を含む)とwp-config.php、Web サーバーの設定を取る - マルチサイトかどうかは
wp core is-installed --networkか、wp-config.phpのMULTISITEで判断する。WP_ALLOW_MULTISITEだけではマルチサイトではない - 自動化はスクリプトにまとめて cron から呼ぶ。crontab に直接書く場合は
%を\%にする - 1サイトだけ戻すときは、共通テーブルを上書きしない
関連記事: