Hier noch ein anderer Vorschlag für ein Shell-Backup-Script, wobei dieses spontan mal herunter geschrieben wurde(!!).
Meine wenigen Tests zeigten jedoch, dass es so funktionieren sollte.
Funktionen:
* MySQL-Datenbanken werden bis zu 7 Tage in die Vergangenheit gespeichert (Speichername: <datenbank>.<datum>.<tag>.tar.gz)
* Systemdateien werden gespeichert und, sofern noch nicht im Backupverzeichnis vorhanden und Dateien verändert wurden, in dieses verschoben (Speichername: <sektionsname>.tar.gz). Sektion wird aus der Config-Datei gezogen...
Zitat von backup.sh
#!/bin/sh
###########################################################
### DE: Bitte Arbeitsverzeichnisse und Dateien anpassen ###
### EN: Please set working-directories and files ###
BACKUPDIR='.'
TMPDIR='/tmp'
INIFILE='./config.ini'
###########################################################
DATE=`date +%Y-%m-%d_%Hh%Mm`
DOW=`date +%A`
parse_ini_file() {
INI_FILE="$1"
INI_SECTION="$2"
if [ '$INI_SECTION' = 'mysql' ] 
[ '$INI_SECTION' = 'directories' ]; then
sed -e 's/[[:space:]]*\=[[:space:]]*/=/g' \
-e 's/;.*$//' \
-e 's/[[:space:]]*$//' \
-e 's/^[[:space:]]*//' \
-e "s/^\(.*\)=\([^\'']*\)$/\1=\"\2\"/" \
< $INI_FILE \
| sed -n -e "/^\[$INI_SECTION\]/,/^\s*\[/{/^[^;].*\=.*/p;}" \
| sed -e "s/^\(.*\)='\(.*\)'$/\2/g"
else
sed -e 's/[[:space:]]*\=[[:space:]]*/=/g' \
-e 's/;.*$//' \
-e 's/[[:space:]]*$//' \
-e 's/^[[:space:]]*//' \
-e "s/^\(.*\)=\([^\'']*\)$/\1=\"\2\"/" \
< $INI_FILE \
| sed -n -e "/^\[$INI_SECTION\]/,/^\s*\[/{/^[^;].*\=.*/p;}"
fi
}
### parse MYSQL-Block
for i in $(parse_ini_file $INIFILE mysql); do
for x in $(parse_ini_file $INIFILE $i); do
eval $x
done
eval rm -fv "$BACKUPDIR/*.*.$DOW.*" #.tar.gz
mysqldump --user=$username --password=$password --host=$hostname $database > $TMPDIR/sql.tmp
tar cvzf $BACKUPDIR/$database.$DATE.$DOW.tar.gz $TMPDIR/sql.tmp
rm $TMPDIR/sql.tmp
done
### parse DIRECTORIES-Block
for i in $(parse_ini_file config.ini directories); do
DIRS=""
for x in $(parse_ini_file config.ini $i); do
eval ${x//*=/pfad=}
DIRS="$DIRS $pfad"
done
tar cvzf $TMPDIR/$i.tar.gz $DIRS
TRANSFER=1 # 1=true
if [ -f $BACKUPDIR/$i.tar.gz ];
then
#md5sum -b $BACKUPDIR/$i.tar.gz | awk '{print $1}' > $TMPDIR/md51.tmp
#md5sum -b $TMPDIR/$i.tar.gz | awk '{print $1}' > $TMPDIR/md52.tmp
wc -c $BACKUPDIR/$i.tar.gz | awk '{print $1}' > $TMPDIR/md51.tmp
wc -c $TMPDIR/$i.tar.gz | awk '{print $1}' > $TMPDIR/md52.tmp
md5C=$(diff $TMPDIR/md51.tmp $TMPDIR/md52.tmp)
if [ '$md5C' = '' ];
then
TRANSFER=0
fi
rm -f $TMPDIR/md51.tmp $TMPDIR/md52.tmp
fi
if [ '$TRANSFER' = '1' ]; then
mv $TMPDIR/$i.tar.gz $BACKUPDIR/$i.tar.gz
else
rm $TMPDIR/$i.tar.gz
fi
done
Alles anzeigen
Und hier die Config-Datei:
Zitat von config.ini
; Dies ist ein Beispiel für eine Konfigurationsdatei
; Kommentare beginnen wie in der php.ini mit ';'
[code=sql]
part1 = 'mysql1'
;part2 = 'directories'
[directories]
dir1 = 'dir1'
[mysql1]
hostname = 'localhost'
username = 'username'
password = 'userpassword'
database = 'database'
[dir1]
server = '/home/user/directory1'
xyy = '/home/user/directory2'
Alles anzeigen
Zur Config-Datei ist zu sagen: Die Sektionen [code=sql] und [directories] dürfen nicht in ihrem Namen verändert werden und diese geben hinter dem Gleichheitszeichen an, welche anderen Sektionen als mySQL-Backup oder File-Directory geparst und gebackuped werden sollen.
In den MySQL-Serverdefinitionen (hier z.b. die Sektion [mysql1]) müssen die Schlüsselnamen erhalten bleiben! In den Directory-Sektionen spielen die Schlüsselnamen wiederrum keinerlei rolle. Die Pfadangaben sind interessant.
Ich hoffe das Script ist als Idee für den Wettbewerb als (3.?) Vorschlag auch genehmigt und zugelassen? 
// Edit:
Hab grad gesehen, dass der Backupspace gar nicht auf den eigenen Server geschaltet wird und man da via FTP rauf soll/muss/darf ?!?
Eine Unwissenheit zum Produkt steht bei mir etwas im Raum. Wenn dem so ist, dann müsste das Skript wie folgt angepasst werden:
* "Inkrimitätscheck": Entfernte Dateigröße muss via WGET geholt werden (bei großer Datengröße doof) oder man loggt sich via FTP auf dem System ein und holt sich via FTP-Kommando SIZE(file), sofern in FTP-Software auf entfernten System verfügbar, die Dateigröße. Alternative wär die Dateigröße in einem Hilfsordner des Backupskriptes auf dem lokalen Server wegzuspeichern. Ziel war es jedoch die Hilfsdateien gering zu halten. Man muss ja keinen "Datenmüll" produzieren, wenn man sich die Daten auch dynamisch holen kann.
* Datei speichern: Hier darf nicht mehr lokal gespeichert, sondern muss die Datei auf ein entferntes System geschrieben werden, mittels z.B. FTP-Konnektion oder WPUT.
Also alles kein Zauberwerk - die Ergänzungen. Aber als Ideenvorschlag, wie es funktionieren kann, ist hier das Skript.
Steht ja auch nicht wirklich in der Wettbewerbsausschreibung dabei, dass es sich um ein entferntes FTP-System handelt (außer eben wenn man mal auf den Link zum Blogeintrag klickt). 