レンタルサーバ上のデータを自宅PCに定期バックアップ

個人趣味レベルでWebサービスを一般公開する場合、自宅サーバの維持メンテを嫌って格安レンタルサーバーを借りることがよくあると思います。わずかな費用と引き替えに何となく24時間365日近く動き続けてくれるので楽なのですが、格安レンタルサーバーはデータの保証をしていないところが多いため、ユーザーが蓄積してくれたデータを守るためにはバックアップが必要不可欠です。

というわけで先ほど、次から述べるところの2番を作ってみました。ついでなので私のバックアップの一連の流れを紹介してみたりします。

1.レンタルサーバ上でDBダンプ取得(シェルスクリプトをcron実行)

下記スクリプトをcronで毎朝5時に実行し、MySQLのDBダンプをレンタルサーバ上の非公開ディレクトリに保存します。

#!/bin/sh
/usr/local/mysql/bin/mysqldump --default-character-set=eucjpms -uユーザー名 --opt データベース名 -pパスワード > /virtual/アカウント名/mysqlbackup/mysql_`date +%w`.sql

ちなみに借りているレンタルサーバーはCORESERVER.JPです。XREA.COMの上位版ですね。cronやSSH接続が許可されているので重宝しています。

2.自宅のWindows PCでレンタルサーバ上のDBダンプファイルを取得(バッチファイルでftp.exeをWindowsタスクスケジューラで実行)

ここが今日作った部分です。すなわち、昨日まではレンタルサーバー上でDBダンプをとるだけにとどまっており、バックアップとしては全く体をなしていなかったわけですから恐ろしい話です。

下記バッチファイルを自宅サーバ(Windows Home Server)のWindowsタスクスケジューラに登録して、1.で取得したDBダンプファイルを毎週月曜朝4時にFTP取得します。

Windowsタスク登録用
CALL backup.bat backup.ftpcmd D:\Backup\mysqlbackup
実処理(FTP)用
@ECHO OFF
REM 
REM DBダンプファイルをFTP取得
REM 

SET RETVAL=0

IF "%1" == "" GOTO invalidargs
IF "%2" == "" GOTO invalidargs

SET NEWDIRNAME=%DATE:/=%
MKDIR %2\%NEWDIRNAME% >> backup.log 2>&1
IF ERRORLEVEL 2 GOTO mkdirfailed

ftp -s:%1 >> backup.log 2>&1
IF ERRORLEVEL 1 GOTO ftpfailed

MOVE *.sql %2\%NEWDIRNAME% >> backup.log 2>&1
IF ERRORLEVEL 2 GOTO movefailed

MOVE *.log %2\%NEWDIRNAME% > NUL 2>&1
GOTO end

:invalidargs
SET RETVAL=1
ECHO 引数が不正です。 backup.bat FTPスクリプト バックアップ先
GOTO end

:ftpfailed
SET RETVAL=2
ECHO FTPに失敗しました。
GOTO end

:mkdirfailed
SET RETVAL=3
ECHO バックアップ先ディレクトリ作成に失敗しました。
GOTO end

:movefailed
SET RETVAL=4
ECHO ファイルの移動に失敗しました。
GOTO end

:end
EXIT /b %RETVAL%

今読み返してみると、FTPを先にやってからディレクトリ作った方がいい感じですね。面倒なのでこのまま放置ですが。

FTPスクリプト

ftp.exeの-sスイッチにFTPコマンドを羅列したテキストファイルを与えると、その通りにFTPを実行してくれます。

OPEN ホスト名
ユーザー名
パスワード
PROMPT
PASV
BINARY
CD mysqlbackup
MGET *.sql
CLOSE
QUIT

はじめにPROMPT OFFしておかないとMGETで入力待ちになってしまい、バッチが終わりません。また、自宅のネットワークはファイアウォールを兼ねるルーターによってほとんどのポートが閉じられているのでPASVモードにしています。

(2012/12/31追記)

WHS2011に変更したときに気づいたのだが、ftp.exeにPASVコマンドなかった。無印時代のftp.exeにあったかどうか定かではない。

3.自宅のWindows PCのバックアップ時にまとめてバックアップディスクへ待避(BunBackupをWindowsタスクで実行)

個人のデータは作業用のPCのローカルディスクではなく、自宅サーバー(Windows Home Server)の共有フォルダに入れています。先ほどFTPで取得したDBダンプファイルもこの共有フォルダに入れています。このステップでDBダンプファイルを含む共有フォルダのファイルを毎週月曜朝5時にバックアップ専用のハードディスクへミラーリングします。

Linuxサーバー時代はcronでrsyncしてましたが、WindowsならBunBackupを使うのが手軽でよいと思っています。

おわりに

以上です。たまたまうちはWindows Home ServerFTPとかしていましたが、別にWindows Home Serverの機能は何一つ使っていませんので、普通のWindows PCであれば何でもOKですよ。

ご参考になれば幸いです。