rsyncでバックアップ

ログファイルや設定ファイルなどをバックアップする際に、rsyncを使うと便利です。実際に、ローカルサーバ内でのコピーにもrsyncを使用して、さらにリモートのバックアップサーバにもrsyncで同期をとっています。
ここでは、そのバックアップのシェルスクリプトを紹介します。

なお、rsyncコマンドのエラーハンドリングは記述していません。ログ監視でいいのであれば、ここで紹介する例のままでいいかと思います。

またここでは、リモート側でもここで紹介するローカルバックアップを実行していることを前提としています。

1.ローカルバックアップのシェルスクリプト rsync_backup_local.sh

このシェルスクリプトでは、rsyncのオプションinclude-fromとexclude-fromに指定しているファイルが重要な役割を担っています。これら2つのファイルの内容を1つのファイルにまとめて記述して、それをinclude-fromあるいはexclude-fromオプションで指定しても、同じ動作をします。

rsync_backup_local.sh

#!/bin/sh

rc_NG=1

backupfrom=/
backupto=/backup/local/
includelist=$(dirname $0)/../conf/rsync_include.list
excludelist=$(dirname $0)/../conf/rsync_exclude.list
ownname=$(basename $0)
logfile=$(dirname $0)/../log/${ownname%.*}.log

echo `date +'%Y/%m/%d %H:%M:%S.%3N'` "Start of rsync backup [" $ownname "]" >>$logfile

if [ ! -e $includelist ]; then
    echo "[ERROR] includeリストファイル" $includelist "が見つかりません。" >>$logfile
    echo `date +'%Y/%m/%d %H:%M:%S.%3N'` "End of rsync backup [" $ownname "]" >>$logfile
    exit $rc_NG
fi
if [ ! -e $excludelist ]; then
    echo "[ERROR] excludeリストファイル" $excludelist "が見つかりません。" >>$logfile
    echo `date +'%Y/%m/%d %H:%M:%S.%3N'` "End of rsync backup [" $ownname "]" >>$logfile
    exit $rc_NG
fi

rsync -av --include-from=$includelist --exclude-from=$excludelist $backupfrom $backupto >> $logfile 2>&1

echo `date +'%Y/%m/%d %H:%M:%S.%3N'` "End of rsync backup [" $ownname "]" >>$logfile

rsync_include.list
バックアップ対象ファイルをここに記述します。

# include
+ /var/
+ /var/log/
+ /var/log/btmp-*
+ /var/log/cron-*
+ /var/log/dracut.log-*
+ /var/log/maillog-*
+ /var/log/messages-*
+ /var/log/redmine.log-*
+ /var/log/secure-*
+ /var/log/spooler-*
+ /var/log/wtmp-*
+ /var/log/yum.log-*
+ /var/log/httpd/
+ /var/log/httpd/access_log-*
+ /var/log/httpd/error_log-*
+ /var/log/httpd/ssl_access_log-*
+ /var/log/httpd/ssl_error_log-*
+ /var/log/httpd/ssl_request_log-*
+ /var/log/mysql/
+ /var/log/mysql/mysqld.log-*
+ /var/log/redmine/
+ /var/log/redmine/production.log-*
+ /var/named/
+ /var/named/data/
+ /var/named/data/named.run-*

rsync_exclude.list
バックアップからすべて(*)を除外する記述をします。これにより、上記include-listに記述したファイルだけがバックアップアップされるようになるのです。

# exclude (all)
- *
2.リモートバックアップのシェルスクリプト rsync_backup_remote.sh

このシェルスクリプトはバックアップサーバ側で実行する設計になっていて、バックアップ対象ファイルをバックアップサーバにプルする格好になっています。
ここでは、rsyncで単純にディレクトリ同期をとっているだけです。だたし、同期先がバックアップサーバなので、同期元で削除されたファイルを同期先から削除することはしていません。つまり、rsyncのdeleteオプションをつけていません。
なお、リモート接続のrsyncはsshを使用します。sshは秘密鍵を使用して接続しています(パスワードなし)が、ポートをWell-knownの22を変更している場合には、rsyんcコマンドのオプションで指定する必要があります。

#!/bin/sh

rc_NG=1

username=root
server=192.168.0.2
backupfrom=/backup/  ←最後のスラッシュをつけないと、/backupディレクトリ自体もコピーされてしまいますので、要注意
backupto=/backup/remote/
ownname=$(basename "$0")
logfile=$(dirname $0)/../log/${ownname%.*}.log

echo `date +'%Y/%m/%d %H:%M:%S.%3N'` "Start of rsync backup [" $ownname "]" >>$logfile

rsync -av -e "ssh -p 2222" $username@$server:$backupfrom $backupto 1>>$logfile 2>&1

echo `date +'%Y/%m/%d %H:%M:%S.%3N'` "End of rsync backup [" $ownname "]" >>$logfile

こんな感じなのですが、わかってしまえば簡単です。これをローカルバックアップ、リモートバックアップの順になるようにcronで叩くだけです。
ぜひ、このようにして使ってみてください。

Comments are closed.