USBへのバックアップを自動化

November 2, 2010 – 5:40 pm

以前、「USBメモリー上にサーバーマシンのデータをバックアップ」を書いた。以降、ここで書いた方法でデータのバックアップをしてきたが、手作業を定期的に行う必要があることなどから、バックアップなしの状態が続くというような事態がままあった。こうした事態をさけるため、バックアップ用のシェルを作り、毎晩定期的にバックアップするよう自動化しておくことにした。自動化のために必要な手続きをメモしておく。


バックアップ自動化にするための手続き: USBへのバックアップ自動化に必要な手続きをまとめると以下のようになる:

  1. USBをマウントする
  2. バックアップ用のshell を作成する
  3. 定期的にバックアップ用shell を動作させる

以下、それぞれの手続きについて記述する。

USBのマウント: 以前書いた「USBメモリー上にサーバーマシンのデータをバックアップ」では、USBメモリをサーバーマシンに差し込むと、特別な手続きなく認識され、/media/diskをマウントポイントとしてマウントされるらしいということを書いた。今回は、USBメモリーのマウント方法を明確にしておいた。

以下、マウントに必要な一連のコマンドをまとめる:

mkdir /mnt/usb
mount  -rt vfat /dev/sda1 /mnt/usb

これで/mnt/usbをマウントポイントとしてUSBがマウントされ、データの読み書きが可能になる。

マシンをリブートなどにより立ち上げする場合に、USBがマウントした状態になるようにするには、/etc/fstabを編集し、以下を付け加えておけばよい:

/dev/sda1   /mnt/usb    vfat    defaults  0 0

これで、USBはマシン上に差し込んだままの状態で、マシンのリブート時においても、自動的にマウントされる。

バックアップ用shell の作成: 以下、/var/www以下の全ファイル、それとmysqlの全データベースをバックアップの対象とした。バックアップ用shellを以下に示す。

TARGET_DIR=/var/www

SAVE_NAME=www_backup`date +%Y%m%d_%H%M`
BACKUP_DIR=/mnt/usb
SAVE_DIR=$BACKUP_DIR/$SAVE_NAME

TMP_DIR=/tmp
TMP_SAVE_DIR=$TMP_DIR/$SAVE_NAME

mkdir $TMP_SAVE_DIR

# sources
cp -r $TARGET_DIR $TMP_SAVE_DIR

# database
/usr/bin/mysqldump -R --skip-lock-tables --all-databases -u user_account -p'password'  > $TMP_SAVE_DIR/dbdump.sql

# compress
cd $TMP_DIR
tar -cvf $SAVE_NAME.tar $SAVE_NAME > /dev/null

rm -rf $TMP_SAVE_DIR

gzip $SAVE_NAME.tar

mv $SAVE_NAME.tar.gz $SAVE_DIR.tar.gz

ここでは、/var/www 以下にあるファイルのコピーは cp -r を用い、mysql のデータベースについてはmysqldump を用いた。

以前の「USBメモリー上にサーバーマシンのデータをバックアップ」では、mysql のデータベースについてもcp -r をもちいたが、今回は、これに代えmysqldumpを用いている。

mysqldumpを使う利点は出力されるバックアップデータがsql文になっており、システムの変化にたいしても柔軟に取り扱うことができる。

バックアップファイルdbdump.sql からのデータベースをリストアするには、

mysql -u username -p'password' database < dbdump.sql

により行うことができる。なお、リストアの対象とするdatabase があらかじめ存在する必要があることに注意が必要である。存在しない場合は、データベースのリストアに先立って create コマンドで空のデータベースdatabaseを作成しておかねばならない。

定期的なバックアップシェルを動作させる: 前節に示したshell を/root/bin配下におき、これを毎日午前3時に定期的に動作させる。これには 「# crontab -e 」でcrontab を以下のように登録すればよい:

0 3 * * * /root/bin/backup.sh 1 > /dev/null

参考のため、crontabについて、動作、使用方法について記述しておく:

crontab はコマンドを指定した時間に定期的に実行するためのデーモン crond の設定を行うもので、その書式は以下である:

 min   hour  day   month   week   command  

 min:  		0  -  59   分を指定。 ワイルドカード (*)  指定可
 hour: 		0  -  23   時を指定。 ワイルドカード (*)  指定可
 day:  		1  -  31   日を指定。 ワイルドカード (*)  指定可
 month : 	         1  -  12   月を指定。 ワイルドカード (*)  指定可
 week :    	0  -  6     曜日を指定。日曜を0 とし以降 1, 2, ・・を与える

上述のcrotntab 登録により毎日午前3時に backup.sh が起動することができるのを理解できるであろう。リダイレクトの出力先として /dev/null としていることにより backup.sh の出力は捨てられる。

最後に、shellの内容等について は、「sanonosa システム管理コラム集」の例を参考にさせていただいた。


Post a Comment