Incremental server backup with rsync

Published 05 June 2012 under server, backup

We have a VPS on which we keep our web server and project code. This stuff is important for our business so we back it up daily onto a machine in our office. Here's a really simple and easy way to backup the /home partition from a remote server.

Using ideas from here the following script keeps incremental backups for the past 3 days. daily.2 contains the backup from 2 days ago, daily.3 from 3 days ago etc.



# Directory in which to store the backups

# step 1: delete oldest snapshot
if [ -d $ROOT_DIR/daily.3 ]; then
    rm -rf $ROOT_DIR/daily.3

# step 2: shift middle backups back by one if they exist
if [ -d $ROOT_DIR/daily.2 ]; then
    mv $ROOT_DIR/daily.2 $ROOT_DIR/daily.3
if [ -d $ROOT_DIR/daily.1 ]; then
    mv $ROOT_DIR/daily.1 $ROOT_DIR/daily.2
# step 3: make a hardlink copy of the latest backup
if [ -d $ROOT_DIR/daily.0 ]; then
    cp -al $ROOT_DIR/daily.0 $ROOT_DIR/daily.1

# step 4: rsync from the system into the latest snapshot (notice that
# rsync behaves like cp --remove-destination by default, so the destination
# is unlinked first.  If it were not so, this would copy over the other
# snapshot(s) too!
rsync -av --delete $REMOTE_USER@$REMOTE_SERVER:/home $ROOT_DIR/daily.0

# step 5: update the mtime of daily.0 to reflect the snapshot time
touch $ROOT_DIR/daily.0

We run the script in a cronjob every day:

@daily /path/to/backup/dir/ > /path/to/backup/dir/do-backup.log


blog comments powered by Disqus