WordPress用のデータベースのバックアップと世代管理を行うBashスクリプトの作成例です。cronに登録し、自動で定時実行させています。個人用途なのでエラー処理については厳密に考慮していません。
※目次をクリックすると目次の下部にコンテンツが表示されます。
②バックアップが成功した場合、バックアップファイルの世代管理を行う。7世代分のバックアップファイルを保持。
③ログファイルにログ記録、エラー時にはメール送信。
④上記①~③を関数として定義し、データベース単位に実行。
set -o pipefail mysqldump --add-drop-table -h localhost -u $dbuser -p$dbpswd $dbname 2>> $tmp_log | bzip2 -c > $bk_path if [ $? -eq 0 ] ; then : 世代管理処理 :
・mysqldumpコマンドでデータベースをバックアップ。
・エラー出力をログファイルに記録。
・pipefailオプションを使ってエラー判定。
●パイプのexitステータスコードとpipefailオプション
通常は、パイプで指定した複数のコマンドの最後のコマンドのexitステータスコードが表示されます。
mysqldumpによるバックアップと圧縮の処理ではパイプを使っているので、バックアップがエラー終了しても圧縮コマンドが成功するとexitステータスが0となってしまいます。
すべてのコマンドが0の場合のみ0が返るように挙動を変更する場合には、pipefailオプションを設定します。
●mysqldumpコマンドのエラーをログに記録
mysqldumpのエラーは標準エラー出力に出力されるので、2>> $tmp_logで標準エラー出力をログファイルに出力し、標準出力はパイプでbzip2コマンドに渡します。
2)ログ出力
●タイムスタンプをログに出力
・dateコマンドのフォーマットを指定
date +”%Y/%m/%d %k:%M:%S”
出力例)
2014/11/05 16:08:52
・タイムスタンプと開始、終了のコメントをログに記録
“でdateコマンドを挟んで、コマンド実行結果をechoの出力に埋め込みます。
echo “`date +”%Y/%m/%d %k:%M:%S”` MySQLダンプバックアップスクリプト開始” >> $log
3)バックアップファイルの世代管理
if [ $? -eq 0 ] ; then for i in 7 6 5 4 3 2 1 ; do let j=i+1 new_name="${base}${j}_${bk_name}" old_name="${base}${i}_${bk_name}" mv $old_name $new_name done new_name="${base}1_${bk_name}" mv $bk_path $new_name del_name="${base}8_${bk_name}" rm $del_name
・mysqldumpコマンドによるバックアップが成功した場合のみ世代管理処理を行います。
・既存のバックアップファイル(添え字が1~7)をリネーム(添え字を2~8)します。
・新規バックアップファイル(添え字が0)を添え字1にリネームし、一番古いバックアップファイル(添え字8)を削除。
4)エラー時にメール通知
echo “From: root@mail.sample.com” > $msg
echo “To: admin@mail.myhome.com” >> $msg
echo “Subject: MySQL Dump BackUp($dbname) Error!” >> $msg
echo “” >> $msg
cat $tmp_log >> $msg
/usr/sbin/sendmail -t < $msg
5)関数を定義して、データベース単位に実行
bkup () { dbuser=$1 dbpswd=$2 dbname=$3 bk_name="wp_db_${dbname}.bz2" bk_path="${base}0_${bk_name}" : mysqldump --add-drop-table -h localhost -u $dbuser -p$dbpswd $dbname 2>> $tmp_log | bzip2 -c > $bk_path if [ $? -eq 0 ] ; then 世代管理処理 else エラー時のメール通知処理 fi } bkup ユーザー名1 パスワード1 データベース名1 bkup ユーザー名2 パスワード2 データベース名2 bkup ユーザー名3 パスワード3 データベース名3
6)cronに登録して定期実行
$ crontab -e
01 4 * * * /home/user/bkup/wpbackup.sh
#!/bin/bash base="/home/user/bkup/" log="${base}wpbkup.log" tmp_log="${base}tmp_wpbkup.log" msg="${base}mailmsg" set -o pipefail echo "`date +"%Y/%m/%d %k:%M:%S"` MySQLダンプバックアップスクリプト開始" >> $log bkup () { dbuser=$1 dbpswd=$2 dbname=$3 bk_name="wp_db_${dbname}.bz2" bk_path="${base}0_${bk_name}" echo "`date +"%Y/%m/%d %k:%M:%S"` $dbnameのバックアップ開始" > $tmp_log mysqldump --add-drop-table -h localhost -u $dbuser -p$dbpswd $dbname 2>> $tmp_log | bzip2 -c > $bk_path if [ $? -eq 0 ] ; then for i in 7 6 5 4 3 2 1 ; do let j=i+1 new_name="${base}${j}_${bk_name}" old_name="${base}${i}_${bk_name}" mv $old_name $new_name done new_name="${base}1_${bk_name}" mv $bk_path $new_name del_name="${base}8_${bk_name}" rm $del_name echo "`date +"%Y/%m/%d %k:%M:%S"` $dbnameのバックアップ正常終了" >> $log else cat $tmp_log >> $log echo "From: root@mail.sample.com" > $msg echo "To: admin@mail.myhome.com" >> $msg echo "Subject: MySQL Dump BackUp($dbname) Error!" >> $msg echo "" >> $msg cat $tmp_log >> $msg /usr/sbin/sendmail -t < $msg echo "`date +"%Y/%m/%d %k:%M:%S"` $dbnameのバックアップエラー終了" >> $log fi } bkup ユーザー名1 パスワード1 データベース名1 bkup ユーザー名2 パスワード2 データベース名2 bkup ユーザー名3 パスワード3 データベース名3