[WordPress]サイトのバックアップとサイトURLの変更
WEBサイトのバックアップとレプリカサイトを構築するスクリプトです。
自分用に作成したもので凝った作りにはなっていませんが、前提さえ整えばそのまま使用できると思いますので紹介します。
スクリプトは以下の2本仕立てになっています。
1.VPS上のWordPressサイトを自宅PC上のLinux仮想マシンにバックアップする
2.そのバックアップを利用して仮想マシン上にレプリカサイトを構築する
レプリカサイト構築ではブラウザから双方のサイトにアクセスが出来るようにレプリカサイトのサイトURLを変更しています。
事前準備は
- 自宅PC上にLinux仮想マシン(以下、自宅Liunx)を立てる(レプリカサイトの実行マシンになる)
- 自宅LiunxからVPSのLinuxマシンにSSH公開鍵認証を設定する
- 自宅LiunxにVPSと同じディレクトリにWordPressをインストールし初期セットアップを済ます
- バックアップ用ディレクトリをVPS/自宅Liunxそれぞれで作成する ♯スクリプトの「バックアップ用ディレクトリ」変数を参照
- wp-toolを自宅Liunxにインストールする(サイトURL変更に必要)
くらいです。
どちらのスクリプトも自宅Liunxから実行します。
細かい仕様はスクリプトにコメントしています。
1.VPS上のWordPressサイトを自宅PC上のLinux仮想マシンにバックアップする
実行方法:
# sh wpbackup.sh
スクリプト:
※変数部分は環境に合わせて変更して下さい。
※2022/02/15 更新:wordpressのバージョンアップにより wp-config.phpの変数定義が define(‘DB_NAME’, → define(△ ‘DB_NAME’ のように空白を挟むように変更になっていたため変数取得の方法を修正しました。
#!/bin/sh
# スクリプト名
SCRIPT=${0##*/}
# 実行日
DATE=`date +"%Y%m%d"`
# WordPressインストールディレクトリ
WPROOT='/usr/share/nginx/www2/wordpress'
# カレントディレクトリ
CURRENT_DIR=`pwd`
# バックアップ用ディレクトリ
BK_DIR=/backup
# バックアップ識別子
BK_ID=${2:-$RANDOM}
# ロカールホスト名(レプリカサイト)
LOCAL_HOST=`hostname -s`
# リモートホスト名(VPS)
REMOTE_HOST="vpshosts"
# VPS(SSH秘密鍵)
PAB_KEY=/root/.ssh/xxxxx.pem
# VPS(ログインユーザ)
VPS_USER=xxxxx
# バックアップファイル接頭辞
BK_FILE_PREFIX="wp"
# バックアップファイル名
LOCAL_BK_FILE=${BK_FILE_PREFIX}_${LOCAL_HOST}_${DATE}_id${BK_ID}
REMOTE_BK_FILE=${BK_FILE_PREFIX}_${REMOTE_HOST}_${DATE}_id${BK_ID}
## メイン処理 ##
# バックアップ用ディレクトリに移動
cd ${BK_DIR}
if [ "x$1" = "xlocal" ];then
# ローカル環境のバックアップ(WordPressフォルダ)
tar -zcf ${BK_FILE_PREFIX}.gz -C ${WPROOT%/?*} ${WPROOT##*/}
# DB定義情報の読み込み : DB_USER,DB_PASSWORD,DB_HOST,DB_NAME
eval `cat ${WPROOT}/wp-config.php | egrep "^define\(( )*'DB_" | awk -F "'" '{print $2 "=" $4 }'`
TABLE_PREFIX=`cat ${WPROOT}/wp-config.php | grep "table_prefix" | cut -d "'" -f 2`
# ローカル環境のバックアップ(データベース)
LIST_TABLE_QUERY="SELECT table_name FROM tables WHERE table_schema='${DB_NAME}' AND table_name LIKE '${TABLE_PREFIX}%'"
mysql -u ${DB_USER} -p${DB_PASSWORD} -h ${DB_HOST} -N information_schema -e "${LIST_TABLE_QUERY}" > ${LOCAL_BK_FILE}.list
mysqldump -u ${DB_USER} -p${DB_PASSWORD} -h ${DB_HOST} ${DB_NAME} `cat ${LOCAL_BK_FILE}.list` > ${LOCAL_BK_FILE}.dump
else
# リモート環境のバックアップ
## このスクリプトをVPS上に送って
scp -i ${PAB_KEY} ${CURRENT_DIR}/${SCRIPT} ${VPS_USER}@${REMOTE_HOST}:${BK_DIR}
## ローカル実行オプションで実行する
ssh -i ${PAB_KEY} ${VPS_USER}@${REMOTE_HOST} sh ${BK_DIR}/${SCRIPT} local ${BK_ID}
## 出力されたバックアップファイルを取得して
scp -i ${PAB_KEY} ${VPS_USER}@${REMOTE_HOST}:${BK_DIR}/${REMOTE_BK_FILE}* ./
## VPS上からバックアップファイルを消す
ssh -i ${PAB_KEY} ${VPS_USER}@${REMOTE_HOST} rm -f ${BK_DIR}/${SCRIPT} ${BK_DIR}/${REMOTE_BK_FILE}*
fi
exit
2.そのバックアップを利用して仮想マシン上にレプリカサイトを構築する
実行方法:
# sh wpimport.sh バックアップファイル
スクリプト:
※変数部分は環境に合わせて変更して下さい。
#!/bin/sh
# WordPressインストールディレクトリ
WPROOT='/usr/share/nginx/www2/wordpress'
# バックアップ用ディレクトリ
BK_DIR=/backup
# バックアップファイル
BACKUP_FILE=${1%.*}
# サイトURL(変更前のURL)
URL1=www.fuku.tokyo
# レプリカサイトURL(変更後のURL)
URL2=wp02.fuku.local
## DB定義情報の読み込み : DB_USER,DB_PASSWORD,DB_HOST,DB_NAME
eval `cat ${WPROOT}/wp-config.php | egrep "^define\(( )*'DB_" | awk -F "'" '{print $2 "=" $4 }'`
TABLE_PREFIX=`cat ${WPROOT}/wp-config.php | grep "table_prefix" | cut -d "'" -f 2`
## メイン処理 ##
# バックアップディレクトリに移動
cd ${BK_DIR}
# wp-config.phpを退避してWordPressフォルダを削除する
mv ${WPROOT}/wp-config.php ${BK_DIR}/wp-config.php_bk
rm -rf ${WPROOT}
# サイト情報をデータベースから削除する
LIST_TABLE_QUERY="SELECT CONCAT(\"DROP TABLE \",table_name,\";\") FROM tables WHERE table_schema='${DB_NAME}' AND table_name LIKE '${TABLE_PREFIX}%'"
mysql -u ${DB_USER} -p${DB_PASSWORD} -h ${DB_HOST} -N information_schema -e "${LIST_TABLE_QUERY}" > wp_drop.sql
mysql -u ${DB_USER} -p${DB_PASSWORD} -h ${DB_HOST} ${DB_NAME} < wp_drop.sql
rm -f wp_drop.sql
# バックアップファイルからWordPressフォルダを展開して事前退避したwp-config.phpをリストアする
tar -zxf ${BACKUP_FILE}.gz -C ${WPROOT%/?*}
mv ${BK_DIR}/wp-config.php_bk ${WPROOT}/wp-config.php
# バックアップファイルからサイト情報をデータベースにリストアする
mysql -u ${DB_USER} -p${DB_PASSWORD} -h ${DB_HOST} ${DB_NAME} < ${BACKUP_FILE}.dump
# データベース内のサイト情報をアップデートする
# URLがシリアライズ(長さを格納)して保存されているため単純置換はNGとのこととのため、wpコマンドでデータ修正
# ダウンロード先:https://developer.wordpress.org/cli/commands/search-replace/
wp search-replace ${URL1} ${URL2} --allow-root --path=${WPROOT} --skip-columns=guid
# 履歴
echo ${BACKUP_FILE} > wp_import.log
exit
おまけ:
DB定義情報の読み込みをfor文で回す場合の方法。
IFS変数(区切り文字)を改行に設定して処理後のunsetする。ループ変数?も残ってしまうのでついでにクリアする。
IFS=$'\n';
for LINE in `cat ${WPROOT}/wp-config.php | egrep "^define\(( )*'DB_"`
do
eval `echo $LINE | cut -d "'" -f 2`=`echo $LINE | cut -d "'" -f4`
done
unset IFS
unset LINE