Cronを使って、データベースとwwwディレクトリの自動バックアップを作る [さくらインターネットのレンタルサーバー]
さくらインターネットでのcronを使った、データベースとWWW(ウェブ公開エリア)のバックアップを自動で作る方法です。
現在、この 9ineBB はさくらインターネットのスタンダードプランで運用中なのですが、他にもWordpressのサイトが幾つかあり、それぞれバックアップは Google Drive に保存されるプラグインを使ってバックアップを作っていました
でも、サイトの容量が大きくなってくると全体をそのプラグインでバックアップしようとすると、サーバーの使えるメモリの制限に引っかかって、メモリが足りなく ZIP化出来なくて、結局のところデータベースだけ Google Drive に送って保存という形にしていました。なので、ディレクトリの方は毎日手動で、WinSCPから ZIP化させて保存しています。
これだと、面倒ですね
それに、それぞれのWordpressにバックアップのプラグインを入れるのも面倒ですし、Wordpressからできるだけプラグインを減らして、軽量化したいというのが 常にあるので、Cronを使って データベースとWWWディレクトリを自動でバックアップにチャレンジしてみました
Cron を使って データベースと公開ディレクトリをバックアップする
まずCronって何か?
時限タイマーみたいなものです、携帯のアラームみたいな
一定の時間、一定の間隔で プログラムを実行するようにするものです
Cron を設定すれば終わりなのかと言うと実行するプログラムが必要です。
主に、.sh シェルコマンドのファイルか .php のPHPがかかれたファイルのどちらかで行います。
今回の目的
- MySQLから必要な データベースのバックアップを毎日作成
- データベースのバックアップはメールで受け取る
- WWWディレクトリ を毎日バックアップを作成
まずは データベースのバックアップのプログラムの作成
こちらの、サイトにかかれているものを ほぼそのまんま利用させていただきました
http://mekiku.com/view.php?a=8
STEP 1
作業用のディレクトリを作成
まずは、作業用のディレクトリを作ります。このディレクトリには、データベースのバックアップが作成されます、そのバックアップされたデータベースをメールで送信する事になります。またこのディレクトリに、バックアップを実行するファイルを格納します
ディレクトリは /home/User/バックアップ作業用のディレクトリ
wwwディレクトリ以下には作らないようにします、セキュリティ上このましくありません
今回は dbdb という名のディレクトリを作りました(これは適当でOK)
STEP 2
作業用のディレクトリに データベースのバックアップ作成用 .sh ファイルを作成
作業用のディレクトリ(dbdb)にデータベースのバックアップ作成用の .sh ファイルを作ります
参考にしたサイトのままコピペでは、複数データベースの保存が出来なかったので一部変わっています。
ファイル名は dbbu.sh
ACCOUNT_NAME=■さくらのユーザーID■ HOME_DIR=/home/${ACCOUNT_NAME} BACKUP_DIR=${HOME_DIR}/■作業のディレクトリ 例ではdbdb■ BACKUP_FILEPATH=${BACKUP_DIR}/db-backup.sql.gz DB_ADDRESS=■データベースのアドレス■
/usr/local/bin/mysqldump --opt -c --host=${DB_ADDRESS} \ --user=■phpmyadminのログインのID■ --password=■phpmyadminのログインパスワード■ \ --database ■データベース名1■ ■データベース名2■ ■データベース名3■ | /usr/bin/gzip > ${BACKUP_FILEPATH} ${BACKUP_DIR}/mail.sh ${BACKUP_FILEPATH}
必要な情報は
- さくらインターネットのサーバーのID
- 作業用ディレクトリの名称 (今回の例ではdbdb)
- データベースのアドレス
- phpMyAdmin のログイン ID
- phpMyAdmin のログイン PASS
- バックアップの対象の データベース名
データベースのアドレス、phpMyAdmin、バックアップの対象のデータベース名の情報は さくらインターネットの管理画面のデータベースのところで必要な情報は全部確認出来ます
バックアップするデータベースは スペースを開けて続けて書いていけばOKです。
ファイルのパーミッションは 705 にしておきます
STEP 3
作業用のディレクトリにメールで送信するための .sh ファイルを作成
次につくるファイルは、 dbbu.sh が実行されたら一緒に実行されるファイルです
こちらでは、メールの送信の設定を行います。
mail.sh という名前でファイルを作ります。
受信するメールと、送信するメールの部分だけを書き換えるだけでOKです
さくらのユーザーを想定しているので 送信のメールアドレスは postmaster@デフォルトのサブドメイン が初期値としてありますので それを利用してユーザー名のところだけ変更すればOKです
#!/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='postmaster@■さくらのユーザーID■.sakura.ne.jp' 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
これで、ファイルの作成が完了です。
ファイルのパーミッションは 705 にしておきます。
STEP 4
作成したファイルが正しく動くか、動作確認をする
必要なファイルの作成が完了しましたので、次はそのファイルが実際に正しく動作するかのチェックです
今回は WinSCP を使ってコマンドを実行します。
作業用ディレクトリに移動します(dbdb)
次にコンソールを開きます、現在のディレクトリが作業用ディレクトリ(dbdb)になっていることを確認します。
コマンドの入力の所に
sh dbbu.sh
と入力して、実行します
これで作業用ディレクトリにバックアップファイルが作成され、そして受信メールアドレスにメールファイルが添付されて届けば 成功です。
STEP 5
Cronに登録する
作成したファイルの実行が成功したら、次に これを Cron に登録します
さくらの管理画面の Cronの設定 から新規登録します
Cronの新規登録の画面で、コマンドを入れます
この画面で使うコマンドは、現在地のディレクトリが判断出来ないので ディレクトリの位置を含めたコマンドを入れます
実行コマンド
/home/■ユーザーID■/dbdb/dbbu.sh
実行日時の設定で毎日指定時間で設定する場合は
月 *
日 *
時 2
分 15
これで、 毎日2時15分に実行することになります
でも、まずは cronが正しく実行できるか確認するために 今から5分後とかに設定して実行してみましょう。それで成功すれば 毎日実行したい時間に再設定すれば OKです
公開ディレクトリ wwwのバックアップを作成する
次に行うのは、WEBの公開エリアである wwwディレクトリのバックアップを自動的に作成するようにします。こちらは、毎回メールで送るのには容量が大きすぎるので wwwディレクトリのバックアップをzipファイルで保存する形にし、指定したディレクトリに毎日、wwwのバックアップが作成されるようにします。何日分の保存とか設定はなく、保存だけが目的で バックアップの数が増えてきたらたまにFTPから整理すればOK
STEP 1
バックアップの保存用のディレクトリを作る
バックアップを保存するディレクトリの作成を行います
今回は www-backup というディレクトリを作成しました
場所は wwwディレクトリよりも上の 非公開エリアで
/home/user/www-backup/ にしました
STEP 2
プログラムの作成
www-backup.php というファイルを作成します
場所は wwwディレクトリよりも上の 非公開エリアに作ります
今回は /home/user/www-backup.php としました
Userの箇所をさくらのユーザー名に置き換えてください。
<?php
$today = date('Ymd');
// zipファイル名 $fileName = $today; // 圧縮対象フォルダ $compressDir = "/home/■user■/www/"; // zipファイル保存先 $zipFileSavePath = "/home/■User■/www-backup/";
// コマンド // cd:ディレクトリの移動 // zip:zipファイルの作成 $command = "cd ". $compressDir .";". "/usr/local/bin/zip -r -9 ". $zipFileSavePath . $fileName .".zip .";
// Linuxコマンドの実行 exec($command);
バックアップで作成されるファイル名は、シンプルなもので年、月、日で構成されていますので1日に何度かバックアップするケースは $today = data(‘YmdH’) 等にすれば時間までのファイル名になりますので、適時変更してください。
ファイルのパーミッションは 705 にしておきます。
コードはこちらを参考にさせていただきました
http://buzzword111.hatenablog.com/entry/2014/02/19/174104
STEP 3
プログラムが正しく動くか確認する
作成した www-backup.php が正しく動くか確認します
こちらも WinSCP のコマンドで確認します
/home/user/ でコンソールを開いて
コマンドの入力のところに
php www-backup.php
を入れて実行します
これで、 /home/user/www-backup/ のディレクトリにバックアップしたファイルができていればOKです、wwwの大きさによって時間がかかります。また ディレクトリがキャッシュされている場合があるのでリロードもして確認します
完成していれば プログラムは正しく実行されました。
STEP 4
Cronに登録する
こちらも、データベースのバックアップと同様に登録します。
こちらは PHPを使って、動作させるので PHPのプログラムがある場所のパスも入れないと上手く動きません。
Cron に登録するコマンド
cd /home/■user■; /usr/local/bin/php www-backup.php
データベースのバックアップの STEP 5 と同様に実行をCronでの実行を確認して正しく動作したら、バックアップの時間の設定を行いましょう。
データベースの復元の TIPS
バックアップを作ったがいいが、上手く復元出来なければ意味がありません!
ディレクトリは、そのまま設置すれば使えます
データベースの場合は phpmyadmin からデータベースが選択されていない状況でインポートすると、バックアップに指定してあったデータベースが復元されます。
複数バックアップした データベースの中から 特定のデータベースだけをバックアップしたい場合は、sqlファイルに少し手を加えます
sqlファイルをテキストエディタで開き USEという箇所を探します
CREATE DATABASE という文字のすぐしたにありますので、CREATE DATABASE で検索するとすぐ見つかります
以下のようになっているので 復元したくないものは この行を消せば OKです
USE `データベース名`;
必要なデータベース名のものだけを残して、phpmyadminからインポートすれば 必要なデータベースだけ復元出来ます。
COMMENT