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 日以内に気づくという前提で。。