Hallo,
ich habe für meinen Server ein kleines Backup-Shellscript geschrieben. Das Script kann in die Crontab eingebunden werden und erstellt dann in dem gewählten Abstand Backups von beliebig vielen Verzeichnissen. Den Zeitpunkt für das Backup sollte man so wählen, dass möglichst wenig Anwender gerade schreibend zugreifen. Ich mache das bei mir z.B. immer um 1:12, aber das muss jeder selber wissen. Auf jeden Fall sollte man das Backup zeitlich nahe an dem Backup der Datenbanken durchführen (siehe:
Automatisches Backup der Datenbanken). Das Script löscht nach einer einstellbaren Zeit in Tagen alte Backups, somit wird der benötigte Platz auch nicht zu groß.
Die Dateien bzw. die Verzeichnisse werden zuerst in einem tar-archiv gespeichert und dann gzipped. Das Gute an der Methode ist, das die Dateien dabei die Einstellungen bzgl. Zugriffsrechte und Owner behalten. Die Dateien werden nicht mit absolutem Pfad gespeichert, somit könnte man das Script auch für den Transport von Test- zu Produtiv-System nutzen. Dabei muss es natürlich auf dem Testsystem den gleichen Nutzer wie auf dem Produktivsystem geben.
Ihr müsst natürlich einige der Parameter an Eure Umgebung anpassen, ich hoffe das die Erläuterungen im Script ausreichend sind. Bei mir läuft das Script schon seit längerer Zeit ohne Probleme.
Code:
#!/bin/bash
#
# File Backup Script
#
#
# lukewill at mambogtt (.) de
#
####################################################
# please check the parameters below !!!
# logfile is saved here
LOG=/var/log/sitebackup.log
echo "------------------------------------------------------------------------">>$LOG
echo "`date`">>$LOG
echo "------------------------------------------------------------------------">>$LOG
# the backup are saved in this directory
DUMPDIR=/home/sitebackup
# the maxium backup per day
MAXARCHIVDIRS=24
# older files where deleted
MAXHOLDDAYS=3
# we look for the compressing programm in this location
ZIPPROC=/usr/bin/gzip
# parameters for ZIPPROC
ZIPPP="--best"
# dir's to backup
DIR='/srv/www/htdocs/web99/sites/myMambosite
/srv/www/htdocs/web99/sites/Testseite
/srv/www/htdocs/web66/sites/demo.mambo.net
'
#
# STOP ! It is done.
####################################################
tarit () {
while [ -n "$1" ]
do
d=$1
shift;
d=`echo $d|sed 's/\/$//'`
cddir=`echo $d|sed 's/\/[^\/]*$//'`
tardir=`echo $d|sed 's/^.*\///'`
if [ -d $d ]
then
echo "Backup DIR #$d#">>$LOG
if [ -n "$cddir" ]
then
cd $cddir
else
cd /
fi
tar cf - "$tardir" > $DUMPDIR/$ARCHIVDIR/$tardir.tar
else
echo "Fail $d">>$LOG
fi
done
}
#################################
clean () {
cd $DUMPDIR
echo "delete: `find . -type d -mtime +$MAXHOLDDAYS -print`">>$LOG
find . -type d -mtime +$MAXHOLDDAYS -print0|xargs -0 rm -rf
}
#################################
zip () {
cd $ARCHIVDIR
if test -x $ZIPPROC
then
for n in *
do
$ZIPPROC $ZIPPP $n
done
fi
}
#################################
ARCHIVDIR=`date +%Y%m%d`
cd $DUMPDIR
i=1
if [ -d $ARCHIVDIR ]
then
b="$ARCHIVDIR#$i"
while [ -d $b ]
do
let i=i+1
b="$ARCHIVDIR#$i"
if [ $i -gt $MAXARCHIVDIRS ]
then
echo "MAXARCHIVDIRS limit reached -> exit">>$LOG
exit 0
fi
done
echo "ARCHIVDIR: $b">>$LOG
ARCHIVDIR=$b
fi
mkdir $ARCHIVDIR
cd $ARCHIVDIR
# main
tarit $DIR
clean
zip
echo "THE END">>$LOG
echo "------------------------------------------------------------------------">>$LOG Wie packt man nun ein gesichertes Verzeichniss wieder aus?
Hat man z.B. /srv/www/htdocs/web99/sites/myMamboSite eingepackt. bekommt man ein file myMamboSite.tar.gz. Befindet man sich gerade in Verzeichnis /tmp und macht dann
cat /home/sitebackup/20041006/myMamboSite.tar.gz |gzip -d|tar xf -
bekommt man in dem Verzeichnis /tmp ein neues Verzeichnis myMamboSite und darin sind alle Dateien enthalten.