by ryou

rsyncによるWordPress関連データのバックアップ

仕事で、Wordpress案件の実運用を初めてしたのですが、それに伴い定期自動バックアップをする必要が出てきました。

プラグインを使用してもいいのですが、定期自動バックアップは色々な所で必要となる処理なので、一度自分で0からスクリプトを組もうということで調べたこと等を記事にしておきます。

ディレクトリ構成

  • backup.sh
    バックアップ用シェルスクリプト
  • backup.log
    ログ
  • data/
    バックアップしたファイルを保管するディレクトリ

スクリプトのフロー

  1. タイムスタンプをディレクトリ名としたバックアップ用のディレクトリを作成
  2. バックアップ対象のWordpressサイトをgzip圧縮し、バックアップディレクトリへ
  3. DBからdumpし、バックアップディレクトリへ
  4. バックアップディレクトリをgzip圧縮し、dataディレクトリ内へ
  5. dataディレクトリ内に存在するバックアップファイルの数をカウントし、一定数以上なら最も古いファイルを削除
  6. rsyncにより、リモートのバックアップサーバーと同期

間違ってWordpressの特定ファイルを弄ってしまった、削除してしまったといったミスはもちろん、サーバー自体がぶっ飛んでしまってもリモートのバックアップファイルから復旧出来るようになっています。

スクリプト例

シェルスクリプトはほとんど書く機会がなく、今回も色々なサイトを巡ってやっと書いたものなので参考程度にお願いします。

#!/bin/bash

MAXNUM=5 # バックアップファイルを何個残すか
SOURCEDIR=/home/example/backup/data
DESTDIR=admin@remote:/home/example/backup
WPDIR=/home/example/www/wp_dir
TARGETWPDIR=www

# バックアップディレクトリ作成
targetdirname=`date +%Y%m%d%H%M%S`
targetdir=$SOURCEDIR/$targetdirname
mkdir $targetdir

# バックアップファイル作成
# WordPressファイル群のバックアップ
cd $WPDIR
tar czf $TARGETWPDIR.tar.gz $TARGETWPDIR
mv $TARGETWPDIR.tar.gz $targetdir

# DBのバックアップ
cd ~/tmp
/usr/local/bin/mysqldump -Q -h db.host.name -uusername  -ppassword db_name > dump.sql
mv dump.sql $targetdir

# バックアップディレクトリの圧縮
cd $SOURCEDIR
tar czf $targetdirname.tar.gz $targetdirname
rm -rf $targetdirname

# ファイル数を数える
filenum=`ls $SOURCEDIR | wc -l`

# ファイルが多い場合、一番古いファイルを削除する
if [ $filenum -gt $MAXNUM ]; then
  # 一番古いファイルの取得
  oldestfile=`ls -tr $SOURCEDIR | head -1`
  rm -rf $SOURCEDIR/$oldestfile
  echo "$oldestfile was deleted."
fi

# リモートと同期
rsync -avz --delete $SOURCEDIR/ $DESTDIR # srcdirの中身を同期させたいので、$SOURCEDIRの後ろに/をつける

使用したコマンド

スクリプトを作成するにあたり、使用したコマンドを逆引き的に書いていきます。

ディレクトリ名が現在時刻のディレクトリを作成する

dateコマンドを使用すれば可能です。

mkdir `date +%Y%m%d%H%M%S`

ディレクトリをgzip圧縮する

tarコマンドで可能です。

tar czf filename.tar.gz dirname/

※今回はスクリプトで使用するのでvオプションは入れませんでした。

mysqlのバックアップを出力

mysqldumpコマンドで可能です。

mysqldump -Q -h [DBのホスト名] -u[ユーザー名]  -p[パスワード] [DB名]

特定のディレクトリ内のファイルの数を数える

lsコマンドとwcコマンドの組み合わせで可能です。

ls dirname | wc -l

特定のディレクトリ内で最もタイムスタンプが古いファイル名を取得

lsコマンドとheadコマンドの組み合わせで可能です。

ls -tr dirname | head -1

実際のバックアップファイル適用方法

順序

  1. バックアップサーバーより、適用したいバックアップファイルを取得
  2. phpmyadminより、DBにdump.sqlをインポート
  3. サイトURLに変更があるならDBを一部修正
  4. バックアップしたWordpressファイル群を、サーバーへ配置し解凍
  5. DB名が変更されているならwp-config.phpの修正
  6. 管理画面へログインし、パーマリンク設定を一度表示させる

phpmyadminより、DBにdump.sqlをインポート

  1. phpmyadminにログイン
  2. インポート対象のDBへ移動
  3. インポートタブをクリック
  4. バックアップした「dump.sql」を選択し、部分チェックのチェックボックスを「外し」て実行

サイトURLに変更があるならDBを一部修正

サイトURLに変更がある場合は「~_options」テーブルの

  • siteurl
  • home

の2項目を修正してください。

DB名が変更されているならwp-config.phpの修正

DB名が変更されているなら、wp-config.phpの

define('DB_NAME', '~');

の部分を修正してください。

管理画面へログインし、パーマリンク設定を一度表示させる

パーマリンク設定を表示した際に、なんらかのファイルやDBが更新されるのか、この作業をしないと正常に動作しませんでした。

参考サイト

さくらのレンタルサーバでデータベースを自動的にバックアップして、いざというときに復元する

rsyncとシェルスクリプトを使った自動バックアップ環境の構築手順

if 文と test コマンド