という事で、約40分で理解する定期的自動バックアップ方法のメモです。
参考url:
http://www.hyperdyne.co.jp/~oohashi/work/redhat/etc/remotebackup.shtml
今回はpostgresqlを例にしてみます。
なにをやるかですが、
- 遠く離れたLinuxマシン上で、自動的にデータを定期的に圧縮・保管する
- 圧縮は、週1回はフルで行ない、差分(追加・修正されたファイルのみ。削除されたファイルは反映されない)だけを毎日とる
- 手元にあるLinuxマシンが自動的にFTPでログインし、圧縮・保管されているファイルを毎日ゲットする
です。
1.の定期的にバックアップする
まず遠く離れたところにあるLinuxマシンで、データを定期的に圧縮・保管するようにします。ここでは、システム全体のバックアップは行なわず、データ のバックアップだけを行なうようにとどめ、バックアップにあたっては、ユーザのディレクトリごとに行ない、週1回そのフルバックアップを行ない、そのうち変 更・追加されたファイルのバックアップを毎日行なうようにします。
バックアップはシェルスクリプトを使い、cronによって自動的に行ないます。まずシェルスクリプト「dailybackup.sh」を、次の内容で記述します。
#!/bin/sh
set `date +%y%m%d`
cd /var/www
find html/ -mtime 1 ! -type d -print > /var/backup/html$1.txt
if test -s /var/backup/html$1.txt
then
tar zcvf /var/backup/html$1.tar.gz -T /var/backup/html$1.txt
fi
cd /home
find webmaster/ -mtime 1 ! -type d -print > /var/backup/webmaster$1.txt
if test -s /var/backup/webmaster$1.txt
then
tar zcvf /var/backup/webmaster$1.tar.gz -T /var/backup/webmaster$1.txt
fi
su -l postgres -c '/usr/bin/pg_dump database_1 > database_1.dump'
mv /var/lib/pgsql/database_1.dump /var/backup/database_1$1.dump
set `date --date '1 days ago' '+%y%m%d'`
rm -f /var/backup/*$1.txt
rm -f /var/backup/*$1.tar.gz
rm -f /var/backup/*$1.dump
ここでは、バックアップしたデータを格納するディレクトリを「/var/backup」としています。「/var/backup」のオーナーは「root」ですが、バックアップファイルをあとでFTPでゲットできるよう「webmaster」を例えば「webmaster」というようなグループに所属させ、そのグループにも読み書き・削除できる権限を与えておく必要があります。「chmod 770」です。
# ls -la
合計 74
drwxr-xr-x 27 root root 4096 May 8 12:17 .
drwxr-xr-x 17 root root 1024 Feb 17 04:15 ..
drwxrwx--- 2 root webmaster 8192 Jun 19 15:41 backup
シェルスクリプトなので先頭に「#!/bin/sh」が必要です。2行目の「set `date +%y%m%d`」は、dateコマンドから「010621」(2001年6月21日)というパラメータを作るためのもので、「$1」がこのパラメータに置き換わります。
「cd /var/www」でバックアップしたいディレクトリのひとつ上に移動します。「find html/ -mtime 1 ! -type d -print > /var/backup/html$1.txt」は、findコマンドで1日(24時間)以内に修正・追加されたファイルをリストアップします。リス トアップされたファイルリストは「html010618.txt」のように日付「010608」が付いたファイル名で保存されます。
findコマンドでは、「find <検索を開始するディレクトリ> <検索の条件> <コマンド>」という書式になります。
if test -s /var/backup/html$1.txt
then
tar zcvf /var/backup/html$1.tar.gz -T /var/backup/html$1.txt
fi
「if」文で分岐処理しています。先に実行するfindコマンドでは、変更・追加がなくてもファイルが作られるため、testコマンドを使ってそのファイルが空かどうかをチェックします。空でない場合、そのファイルリストをもとにtarコマンドで、リストにあるファイルを圧縮します。
su -l postgres -c '/usr/bin/pg_dump database_1 > database_1.dump'
mv /var/lib/pgsql/database_1.dump /var/backup/database_1$1.dump
は、PostgreSQLのデータベースをバックアップしています。
set `date --date '1 days ago' '+%y%m%d'`
rm -f /var/backup/*$1.txt
rm -f /var/backup/*$1.tar.gz
rm -f /var/backup/*$1.dump
は、前日の不要なファイルを削除するステップです。「set `date –date ’1 days ago’ ‘+%y%m%d’`」で1日前を「010617」のようなパラメータとし、rmコマンドで不要なファイルを削除しています(daysはdayという単数形でもいいようです)。
以上のような内容のシェルスクリプトを作ったら、オーナーrootで「chmod 700」として実行権を与えておきます。スクリプトに誤りがないか確認したら、実行して動作を確認します。
実行して動作に問題が無ければ最後に、「/etc/crontab」に登録します。
30 4 * * * root /var/backup/dailybackup.sh > /dev/null 2 >&1
毎日明け方4時30分にスクリプト「dailybackup.sh」が実行されます。
同様にして「weeklybackup.sh」という名前のシェルスクリプトを次の内容で作ります。
#!/bin/sh
set `date +%y%m%d`
cd /var/www
tar zcvf /var/backup/html$1.full.tar.gz ./html/*
cd /home
tar zcvf /var/backup/webmaster$1.full.tar.gz ./webmaster/*
set `date --date '1 weeks ago' '+%y%m%d'`
rm -f /var/backup/*$1.full.tar.gz
dailybackup.shとほとんど同じ内容ですが、「なんとか+日付.full.tar.gz」という日付付きの名前で圧縮ファイルを作るようになります。rmコマンド行は、1週間前の不要なファイルを削除するステップです。「set `date –date ’1 weeks ago’ ‘+%y%m%d’`」で1週間を「010617」のようなパラメータとし、rmコマンドで不要なファイルを削除しています(weeksはweekという単数形でもいいようです)。
dailybackup.shと同じように「/etc/crontab」に登録します。
50 4 * * 0 root /var/backup/weeklybackup.sh > /dev/null 2>&1
3.のリモートマシンからFTPでバックアップファイルをゲットする
次に近くにあるLinuxマシンから自動的にリモートサーバにFTPでファイルをゲットする仕組みを作ります。まず次のような内容のシェルスクリプト(たとえば、「remote.sh」というような名前で)を作ります。
#!/bin/sh
cd /usr/bin
ftp -n > /home/xxxxxxx/login.www
「/usr/bin」ディレクトリにあるftpコマンドを使っています。続いて「/home/xxxxxxx」ディレクトリに「login.www」というような名前のファイルを作り、次のようなftpコマンドを記述しておきます。
open www.hyperdyne.co.jp
user webmaster xxxxxxxxxxxx
idle 600
prompt
hash
lcd /home/xxxxxxxx/www/
cd /var/backup
bin
mget *.tar.gz
ascii
mget *.dump
openコマンドでサーバを指定し、そのあとでuserコマンドでユーザ名とパスワードを渡しています。「xxxxxxxxxxxx」となっているところにパスワードが入ります。FTPではテキストでパスワードが流れてしまいます。lcdはlocal側のcd(Change Directory)です。ローカル側とリモート側でディレクトリを移動してからmgetコマンドで複数のファイルをgetします。
getするときには、バイナリファイルに対しては「bin」を、テキストファイルには「ascii」をあらかじめ実行しておきます。「hash」は進行状況を表示するコマンドです。実際に運用するときは不要です。
作ったシェルスクリプトを実行させてみてうまく動作するようでしたら、cronに登録しておきます。
以上です。お疲れ様でした。