#! /bin/bash
### file /Path/To/backup.sh
### code in utf-8
host="localhost";
port="3306"
user="test";
passwort="HalloJosch";
# siehe mysqldump --help
moreDumpOptions='--add-drop-database --add-drop-table --allow-keywords --extended-insert=TRUE';
#Wer bekommt die Mails?
mailto='bürgerlicher Name <user@host>';
### Verzeichnis für den Output
directory="/tmp/";
### Schemas("Datenbanken") nicht dumpen (Trenner ist GENAU ein PIPE "|", 'Database' muss stehen bleiben):
nodump="information_schema|mysql|OSM";
# showMessages=1 zeigt Nachrichten (bei cronjob vermeiden)
showMessages=1;
# Pfade zu Programmen
mysql_bin=`which mysql`;
mysqldump_bin=`which mysqldump`;
mail_bin=`which mail`;
#mysql_bin="/usr/bin/mysql";
#mysqldump_bin="/usr/bin/mysqldump";
#mail_bin="/usr/bin/mail";
# Es ist "ein wenig schwierig", automatisch zu ermitteln, ob für die Ermittlung der Datenbanken 'show schemas' oder 'show databases' benutzt werden muss:
#schemasName="databases";
schemasName="schemas";
### Programm: ###
mailto=`echo "${mailto}" | iconv -f UTF-8 -t ASCII//TRANSLIT`;
err=0;
counter=0;
datetime=`date +%Y-%m-%d_%H:%M:%S`;
databases=`echo "show ${schemasName};" | $mysql_bin --host="${host}" --port="${port}" --user="${user}" --password="${passwort}" --column-names=FALSE | grep -vP "${nodump}"`;
for database in $databases; do
outFile="${directory}/${datetime}_${database}.sql.gz";
logFile="${directory}/${datetime}.log";
if [ 1 -eq $showMessages ]; then
echo -n "Dumpe Schema: '${database}'.";
fi
$mysqldump_bin --host="${host}" --port="${port}" --user="${user}" --password="${passwort}" $moreDumpOptions -B $databases | gzip -c > "${outFile}" 2>> "${logFile}" ;
if [ 0 -eq $? ]; then
counter=$(($counter+1));
if [ 1 -eq $showMessages ]; then
echo "Schema \"${database}\" wurde gesichert." >> "${logFile}";
echo -e "\b -> fertig.";
fi
else
if [ 1 -eq $showMessages ]; then
echo -e "\b -> FEHLER!";
fi
err=1;
fi
done
if [ 1 -eq $err ]; then
cat "${directory}/${datetime}.log" | $mail_bin -s "Fehler beim Datenbank-Backup von ${host}:${port}" "${mailto}";
fi
fileList=`ls -alh ${directory}/${datetime}*`;
echo -en "${counter} Schemas wurden gesichert.\nAngelegte Dateien:\n\n${fileList}" | $mail_bin --subject="Erfolgtes Datenbank-Backup von ${host}:${port}" "${mailto}";
Einen echten Fehler habe ich gefunden: Beim Ermitteln der $fileList
fehlte ${directory}.
Weitere Veränderungen betreffen die "Schönheit", z.B. die bequeme Angabe von Optionen.