WordPressのデータベースや、テーマやプラグインなどは、サーバーの故障や誤操作で消えてしまう事態に備えて、定期的にバックアップをしておくと安心です。自動的にバックアップを取るプラグインもありますが、WordPress以外のファイルもバックアップできるよ、汎用的なシェルスクリプトを作ってみました。

このスクリプトでは指定した回数分の履歴バックアップを保持します。仕組みは単純で、バックアップしたファイルを保存しているディレクトリを
・最新バックアップ bakuup.0/
・前回のバックアップ bakuup.1/
・前々回のバックアップ bakuup.2/
のようにローテートするだけです。バックアップ数が指定回数に達すると古いものから削除されていくので、バックアップが溜まってディスク容量を圧迫する心配もありません。

Shell Script

#!/bin/sh
archive=/home/backup
bkname=db
bkmax=30

bkdir=$archive/$bkname
ii=$bkmax
while [ $ii -ge 0 ] ; do
  jj=$(($ii-1))
  [ -d $bkdir.$ii ] && rm -rf $bkdir.$ii
  [ -d $bkdir.$jj ] && mv $bkdir.$jj $bkdir.$ii
  ii=$jj
done

mkdir $bkdir.0
chmod 700 $bkdir.0

## ここから
mysqldump --opt --all-databases --events --default-character-set=binary -u root --password=***** | gzip > $bkdir.0/mysql-all.sql.gz
## ここまで

chmod 600 $bkdir.0/*

説明

archive= は保存先のディレクトリです。
bkname= はバックアップ名で、これを変えれば異なる種類のバックアップを作成することができます。
bkmax= はバックアップの保存数。最新版1+保存数のバックアップが作られます。

##ここから〜##ここまで の間は任意のコマンドで、ここにデータベースから出力するコマンドを記述したり、ファイルをコピーするコマンドを記述しておきます。そしてファイルのコピー先を $bkdir.0/ にすることで、どんなファイルでも簡単にバックアップできるようにしました。

crontabで定期実行

あとはcrontabに登録して定期的に実行するだけです。

/etc/cron.d/backup 
52 5 * * * root /path/to/db_backup.sh
55 5 * * 7 root /path/to/file_backup.sh

余談

個人的にはシェルスクリプトに rm -rf $xxxx を入れるのってなんか気持ち悪いんですよね。このスクリプトの場合は$の変数に入る文字列が決まっているので大丈夫ですが、もし何らかの原因で / が入っていたら rm -rf / コマンドが実行されてしまいます。

私が実際に起こしたことがある悲劇はこんな感じのスクリプトでした。

#!/bin/sh
basedir=/home
user=$1

rm -rf $basedir/$user

なんて恐ろしい!引数に指定した特定のユーザーのホームディレクトリを削除するスクリプトですが、これを引数無しで実行すると、rm -rf /home/ が実行されてしまいます。怖いですね!これは引数がちゃんと指定されているかのチェックを怠っていたことが原因でした。

LINEで送る
Pocket