Rsync & backups

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen

Kun je met rsync een volwaardige backup-procedure bouwen? We gaan het meemaken...

Simpele incrementele backup

Zoiets:

rsync -av /home/strompf /media/strompf/bu03/month02

Waarbij:

  • -a - Recursief (all)
  • -v - Verbatim

Dit script vormt een eenvoudige incrementele backup. Wat het echter niet doet: Historie bewaren. Op elk moment heb maar één versie van je data gedurende deze maand. Volgens mij is het gebruikelijker dat bij een incrementele backup elke dag de bestanden worden opgeslagen die verschillen sinds de dag ervoor zonder die bestanden te vervangen. Dan kun je terug naar eerdere versies van gewijzigde bestanden. Dat kan hier niet. Je kunt alleen terug naar de vorige maand. Sois, het is een aardig beginnetje.

Met --delete

Ik kwam de suggestie tegen om te synchroniseren met zoiets als

rsync -av --delete /home/strompf /media/strompf/bu03/month02

waarbij --delete ervoor zorgt dat bestanden die wél op de doellocatie aanwezig zijn, maar niét op de bronlocatie, verwijderd worden. Daardoor zijn de twee mappen steeds gesynchroniseerd. Dat is echter niet wat ik wil rondom backups!

Exclude paths - Inline

Je kunt op twee manieren paden specificeren die niet meegenomen moeten worden:

  • Inline, als onderdeel van het rsync-commando - Gebruik dan de optie --exclude
  • In een apart bestand - Gebruik dan de optie --exclude-from.

In beide gevallen zijn paden relatief tov. de bron-locatie. Ook al voeg je een / in, aan het begin van een pad, het wordt nog altijd relatief geïnterpreteerd.

Voorbeeld:

rsync -av --exclude "Dropbox" $source_folder_home $dest_folder_root

Exclude paths - Apart bestand

Bestanden en paden die je niet wilt dat ze gebackupped worden, kun je specificeren in een apart bestand. Voorbeeld:

Bestand backup-exclude-paths.txt bevat:

Dropbox
.cache
.config

Dit bestand staat in dezelfde map als het backup-script (toevallig op de doellocatie).

Commando:

rsync -av --exclude-from "backup-exclude-paths.txt" $source_folder_home $dest_folder_root

En dit werkt vlekkenloos. Merk op dat voor dit bestand het pad relatief is tov. de CWD (Current Working Directory), en dat is de plek waar dit backupscript staat, dat op zijn beurt rsync aanroept.

No links

Ik vind het maar onhandig als links ook worden gekopiëerd, want als ik in een backup zo'n link aanklik, beland ik de boom van de brondata en niet in die van het kopie - Erg verwarrend.

Zo dus:

rsync --no-links

Script

Versie 25 feb. 2020 - bijgewerkt juli 2020:

#!/bin/bash
#
# Script for backing up Dell2016 to this external harddisk
##########################################################
#
# Jeroen Strompf, Feb. 2020
#
# Backup-policy
############################
#
# * Use a different folder for every day of the month. This way, you can
#   go back at least a month (e.g., when you discovered that you accidentiall
#   removed a file. When using this script e.g., on 4 rotating disks, you 
#   have daily bacups that go back approximately 4 months
# * On Feb. 19 (before cleaning up some stuff), a backup seemed to take about 250GB
#   Since I use two disks alternating, each disk should contains half the backups, 
#   which is 15, or about 3.5TB - This should work :)
# * rsync uses an external textfile with paths that are not being backupped
#   (e.g., I don't need 40 backups of my MP3 collection). These files should be
#   separately stored in the "Offline" folders on *all* backup disks.
#
#
######################################################################################
# Start
######################################################################################
#
echo ""
echo ""
echo ""
echo "###############################################################"
echo "# "$0" - Start"
echo "###############################################################"
echo ""
echo "PWD: $PWD"
#
#
######################################################################################
# Set vars
######################################################################################
#
echo "Set vars..."

month_number=$(date +%m)
day_number=$(date +%d)
source_folder_home="/home/strompf"

folder_mysql_local="/home/strompf/Dropbox/Backups-mysql"

source_folder_www="/var/www"
dest_folder_root="/media/strompf/bu03/day"$day_number


# Echo
################################
#
echo "source_folder_home: "$source_folder_home
echo "source_folder_www: "$source_folder_www
echo "dest_folder_root: "$dest_folder_root
echo "folder_mysql_local: "$folder_mysql_local
#
echo "Set vars... Done"


######################################################################################
# Backup MySQL-databases locally
######################################################################################
#
# * First make backups of MySQL locally, so they can
#   subsequently be copied to the backup-harddisk using
#   rsync, and *not* using mysqldump!
# * Don't forget "--routines"!
# * mysqldump overwrites existing files - Very good!
#
#
echo "Backup MySQL-databases locally..."

# Most import databases first
############################

mysqldump --routines example_com_01 > $folder_mysql_local'/example_com_01.sql'
mysqldump --routines example_com_02 > $folder_mysql_local'/example_com_02.sql'


# Other databases
#############################
#
mysqldump --routines example_com_03 > $folder_mysql_local'/example_com_03.sql'
mysqldump --routines example_com_04 > $folder_mysql_local'/example_com_04.sql'
mysqldump --routines example_com_05 > $folder_mysql_local'/example_com_05.sql'
mysqldump --routines example_com_06 > $folder_mysql_local'/example_com_06.sql'
mysqldump --routines example_com_07 > $folder_mysql_local'/example_com_07.sql'
mysqldump --routines example_com_08 > $folder_mysql_local'/example_com_08.sql'
mysqldump --routines example_com_09 > $folder_mysql_local'/example_com_09.sql'
mysqldump --routines example_com_10 > $folder_mysql_local'/example_com_10.sql'

echo "Backup MySQL-databases locally... Done"


######################################################################################
# Backup MySQL-databases
######################################################################################
#
echo "Backup MySQL-databases externally..."

rsync -av $folder_mysql_local $dest_folder_root

echo "Backup MySQL-databases externally... Done"


######################################################################################
# Backup webserver
######################################################################################
#
echo "Backup webserver..."

rsync -av $source_folder_www $dest_folder_root 

echo "Backup webserver... Done"


######################################################################################
# Backup my home folder
######################################################################################
#
# * Don't use "--delete" - This is exactly why I make backups!
# * File "backup-exlude-paths.txt" is located in the same directory as the backup-script

echo "Backup home-dir..."

rsync -av --no-links --exclude-from "backup-exclude-paths.txt" $source_folder_home $dest_folder_root

echo "Backup home-dir... Done"

######################################################################################
# Finished
######################################################################################
#
echo ""
echo ""
echo ""
echo "###############################################################"
echo "# "$0" - Finished"
echo "###############################################################"
echo ""

Zie ook