rsyncの差分バックアップで!!

rsync差分バックアップするスクリプトなど
SSH
rsync

はじめに

レンタルサーバVPSを借りていると不意にデータが飛ぶことがたまにありますよね。 そんなときに備えて自宅サーバにリモートサーバのデータを差分でバックアップしておけると安心です。 有償/無償/商用も含めて様々なソリューションがあると思いますが、自分はお手軽にrsyncだけで実施しています。

方針

リモートのサーバAから、手元のサーバBにバックアップします。

リモートサーバA(IPアドレスaaa.bbb.ccc.ddd) [cron]リモートサーバA内のバックアップ対象データを /for_backup/ に集める 手元のサーバB [cron]rsyncで A:/for_backup/ を /remote_a_backup/latest に転送する [cron]rsyncで /remote_a_backup/latest を /remote_a_backup/YYYYMMDD に差分バックアップする スクリプト リモートサーバA内のバックアップ対象データを /for_backup/ に集める まあ適当に。

gather_for_backup.sh

!/bin/sh

rsync --progress -av --delete /etc /for_backup/ rsync --progress -av --delete /data /for_backup rsync --progress -av --delete /root/bin /for_backup/root rsync --progress -av --delete /var/lib/mysql /for_backup/var/lib ...

chown for rsync

chown -R takeuchi.rsync /for_backup rsyncで A:/for_backup/ を /remote_a_backup/latest に転送する rsync_from_remote_server.sh

!/bin/sh

rsync --progress -avz -e ssh --delete --bwlimit=150 takeuchi@aaa.bbb.ccc.ddd:/for_backup/ /remote_a_backup/latest rsyncで /remote_a_backup/latest を /remote_a_backup/YYYYMMDD に差分バックアップする rotation.sh

!/bin/sh

世代バックアップ

ROTATE_DAYS : LATEST_DIR を含めて何世代バックアップするか

ROTATE_DAYS=30 # BASEDIR=/remote_a_backup LATEST_DIR=${BASEDIR}/latest/ NEW_DIR=${BASEDIR}/date -d '-1 day' +%Y%m%d/ LINK_DIR=${BASEDIR}/date -d '-2 day' +%Y%m%d/ OLDEST_DIR=${BASEDIR}/date -d "-$ROTATE_DAYS day" +%Y%m%d/

rm -rf $OLDEST_DIR rsync -avz --progress --delete --link-dest=$LINK_DIR $LATEST_DIR $NEW_DIR crontab(ローカルサーバ) crontab 0 7 * * * /remote_a_backup/rsync_from_remote_server.sh > /tmp/a-backup-rsync.log; /remote_a_backup/rotation.sh > /tmp/a-backup-rotation.log 本当はもう少し異常系の処理が必要とは思いますけど 30 日以内に気づくという前提で。。