[サーバ管理]さくらインターネットでDBとMLの自動バックアップ

作成:2012年7月15日

先日、ファーストサーバで事故が起き、被害にあった利用者はサーバー上のデータが消失していました。また、バックアップ(特にデータベース)が問題となりました。

[6/20に発生した大規模障害に関するお詫びとお知らせ:障害発生からの経緯] ファーストサーバ株式会社
http://support.fsv.jp/urgent/details.html

ところで、さくらインターネットのスタンダードでも、自動でバックアップはされません。今までは手動で時折保存していたのですが、先日の事故を見て改めて確実なバックアップが必要と感じました。人間は面倒がるものですし、なるだけ追加ソフトなしでバックアップできれば、それにこしたことはありません。

幸い、さくらはシェル(SSH)も使えますし、cronで定期処理も可能です。そこで手間をかけない方法として「バックアップデータをgzipで圧縮した上で、同じサーバのメールアドレスに送る」ことを考えました。これなら、使い慣れたメールソフトでバックアップデータを受信できます。CD-Rなどの他メディアにコピーするのも簡単です。

そういうわけで、以下のページを参考にして、スクリプトを準備してみました。

さくらインターネットでmysqlの自動バックアップ | Lancers(ランサーズ)社長日記
http://www.web-20.net/2007/07/mysql.html

水晶堂 ≫ Blog Archive ≫ さくらインターネットでのmySQLデータ自動バックアップ
http://suishodo.net/archives/2007/09/mysql.html

kindle3 で無料ニュース配信をする(さくらインターネット編)その1 | moiblog
http://blog.moooi.jp/archives/462

シェルスクリプトで添付ファイルつきのメールを送信 - pipi_oneの日記
http://d.hatena.ne.jp/pipi_one/20100513/1273756227

データベース(MySQL)のバックアップ

  1. 以下の2つのスクリプト(dbbu.shとmail.sh)をコピーし、「★~★」の部分を自分の環境に応じて書き換えます。また、メール本文が簡潔すぎると思う人は、mail.shの「backup file of your website.」の部分を書き換えてください。日本語を入れるなら、ISO-2022-JPエンコードしておく必要があると思います。
  2. 書き換えたスクリプトを、さくらのサーバの適当なディレクトリにアップします。バックアップ専用ディレクトリを確保するのがおすすめです。ただし、www以下には置かないようお願いします。
  3. 2つのファイルのパーミッションを705にします。
  4. dbbu.shを、さくらのコントロールパネルに登録します。実行周期は毎日とか週に1回とか、各自で判断してください。

なお、複数のデータベースのバックアップをとる場合は、「★データベース名★」のところに、スペースで区切って並べてください。

dbbu.sh(データベースのバックアップ用スクリプト)


ACCOUNT_NAME=★さくらのアカウント名★
HOME_DIR=/home/${ACCOUNT_NAME}
BACKUP_DIR=${HOME_DIR}/★スクリプトやデーターの配置先★
BACKUP_FILEPATH=${BACKUP_DIR}/★バックアップファイル名★.txt.gz
DB_ADDRESS=mysql★MySQLサーバー番号★.db.sakura.ne.jp

/usr/local/bin/mysqldump --opt -c --host=${DB_ADDRESS} \
 --user=★ユーザー名★ --password=★MySQLパスワード★ \
 ★データベース名★ | /usr/bin/gzip > ${BACKUP_FILEPATH}
${BACKUP_DIR}/mail.sh ${BACKUP_FILEPATH}

mail.sh(引数で示された名前のファイルを所定のアドレスに添付で送るスクリプト)


#!/bin/sh

FILE=$1
FILENAME=`echo ${FILE} | sed -e "s/.*\///g"`
NKF='/usr/local/bin/nkf'
B64ENCODE='/usr/bin/b64encode'
TAIL='/usr/bin/tail'
SED='/usr/bin/sed'
SENDMAIL='/usr/sbin/sendmail'
TO='★バックアップデータの送り先アドレス★'
FROM='★バックアップデータの送信元アドレス★'
BOUND=`date +"%Y%m%d%H%M%S"`
DATE4TITLE=`date +"%Y-%m-%d"`

#Err(){ echo "$1">&2; exit 1; }
Err(){ exit 1; }
Check_file(){ test -e $1 || return 1; return 0; }

Msg()
{
echo "To:${TO}
Subject: backup_${DATE4TITLE}
MIME-Version: 1.0
Content-Type: multipart/mixed;
 boundary=\"---------${BOUND}\"

-----------${BOUND}
Content-Type: Text/Plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit

backup file of your website.

-----------${BOUND}
Content-Type: application/octet-stream;
 name=\"${DATE4TITLE}_${FILENAME}\"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename=\"${DATE4TITLE}_${FILENAME}\"

" | ${NKF} -j -m0

cat ${DIR}/${FILE} | ${B64ENCODE} ${FILE} | ${TAIL} -n +2 | ${SED} '$d'

echo ""
echo "-----------${BOUND}--"
}

## main
#Check_file ${DIR}/${FILE} || Err "Warning : Cannot open ${FILE}"
Check_file ${FILE} || Err "Warning : Cannot open ${FILE}"
Msg | ${SENDMAIL} -f${FROM} ${TO}

exit 0

メーリングリスト(ML)のメンバーのバックアップ

私は要約筆記の関係で多数のMLを動かしています。メール本体は自分で受信しているのでいいのですが、MLのメンバー一覧は別問題ですので、こちらも定期的なバックアップの対象にしてしまいます。

なお、以下の記述は、上のDBバックアップをしていることが前提です。もしMLのメンバー一覧だけバックアップするなら、上記から「mail.sh」に関する部分も実行してください。

  1. 以下の2つのスクリプト(mlbu.shとgetall.sh)をコピーし、mlbu.shの「★~★」の部分を自分の環境に応じて書き換えます。
  2. 書き換えたスクリプトを、先のdbbu.shやmail.shをおいたディレクトリにアップします。繰り返しますが、www以下には置かないようお願いします。
  3. 2つのファイルのパーミッションを705にします。
  4. mlbu.shを、さくらのコントロールパネルに登録します。実行周期は毎日とか週に1回とか、各自で判断してください。

mlbu.sh(メーリングリストのメンバー一覧をバックアップするスクリプト)


ACCOUNT_NAME=★さくらのアカウント名★
HOME_DIR=/home/${ACCOUNT_NAME}
BACKUP_DIR=${HOME_DIR}/★スクリプトやバックアップデーターの配置先★
BACKUP_FILEPATH=${BACKUP_DIR}/★バックアップファイル名★.txt

/usr/bin/find ${HOME_DIR}/fml/spool/ml/ \
 -maxdepth 4 -name members -exec sh \
 -c "${BACKUP_DIR}/getall.sh {} >> ${BACKUP_FILEPATH}" \;
/usr/bin/gzip -f ${BACKUP_FILEPATH}
${BACKUP_DIR}/mail.sh ${BACKUP_FILEPATH}.gz

getall.sh(ファイルの名前と内容を続けて出力するだけのスクリプト)

MLのメンバー一覧が、どのMLのものか識別するために作成しました。書き換える部分はありません。


#/bin/sh

echo $1
cat $1
echo ''

これで厄介なデータベースやMLメンバー一覧はバックアップできます。HTMLなど表にある部分は、別途保存しておきましょう。


◀(前記事)[Windows] 操作していないPCの画面が勝手に消えてしまう件への対応3
▶(次記事)[音声認識] Webブラウザの音声認識APIを使う

(一覧)[2.技術情報 (tech)]