Rsync backup with X days retention
rsync is run on backup server, that login to remote servers and backup.
vi /usr/serverok/rsync-backup.sh
Add following code
#!/bin/sh date rsync --archive --verbose --exclude-from=/usr/serverok/.rsync-exclude root@SERVER-IP:/ /backup/HOSTNAME-HERE/sda1/ echo "RSYNC: HOSTNAME-HERE..........OK" | mail -s 'HOSTNAME-HERE RSYNC' [email protected] date
Repeat the rsync/echo lines for each server you need to backup.
We exclude some of the files from backup, this is specified in .rsync-exclude file.
# cat .rsync-exclude /boot /backup /mnt /tmp /cdrom /media /proc /sys #
Run it with cronjob
20 0 * * * /usr/serverok/rsync-backup.sh &> /var/log/serverok-rsync-backup.log
Backup Rotation
We rotate backup, so we have 20 days of backups. To do this, run cronjob
0 1 * * * /usr/serverok/rsync-backup-rotate.sh &> /var/log/serverok-rsync-backup-rotate.log
Create script
vi /usr/serverok/rsync-backup-rotate.sh
With following content
#!/bin/bash date BACKUP_IDS=(01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20) PATHES=(/backup/server10 /backup/server20 /backup/server22 /backup/server24 /backup/server32 /backup/server48) # Create backup directories for ((i=0; i < ${#BACKUP_IDS[*]}; i++)); do if [ ! -d /backup/${BACKUP_IDS[$i]} ]; then mkdir -p /backup/${BACKUP_IDS[$i]} fi done # Rotate backup directories mv /backup/${#BACKUP_IDS[*]} /backup/00 for ((i=${#BACKUP_IDS[*]}-2; i >= 0; i-- )); do j=$i+1 mv /backup/${BACKUP_IDS[$i]} /backup/${BACKUP_IDS[$j]} done mv /backup/00 /backup/01 # Backup into backup directory 01 touch -m /backup/01/ for ((i=0; i < ${#PATHES[*]}; i++)); do mkdir -p /backup/01${PATHES[$i]}/ rsync -avl --delete --exclude-from=/usr/serverok/excludes.txt --link-dest=/backup/02${PATHES[$i]}/ ${PATHES[$i]}/ /backup/01${PATHES[$i]}/ done date exit
Here you need to add a folder for each server on line PATHES.
Here is content of excludes.txt
# cat /usr/serverok/excludes.txt .svn .DS_Store ._* *.log *.log.gz *.log.*.gz access_log access_log.* access_ssl_log access_ssl_log.* error_log error_log.* xferlog_regular xferlog_regular.* #