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

  • 18
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

はじめに

レンタルサーバや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 日以内に気づくという前提で。。