====== Backupscript ======
Hier ein Script welches Dateien und MySQL-Datenbanken sichern kann.
In den ersten Zeilen steht auch wie man es installiert.
#!/bin/bash
#
### Installation:
## Auf jeweiligem Server per SSH verbinden und folgendes ausführen:
## touch /usr/local/bin/backup.sh
## chmod a+x /usr/local/bin/backup.sh && ln -s /usr/local/bin/backup.sh /etc/cron.daily/ && vi /usr/local/bin/backup.sh
##
## In die neue Datei diesen Inhalt hineinkopieren und die Variablen anpassen, danach Fertig.
# Datensicherungsziel OHNE abschliessenden Slash
DEST="/datensicherung"
BACKUPLOG=${DEST}/${BINHOSTNAME}-backup.log
# Dateien loeschen die aelter als X Minuten sind (1440 = 24 Stunden)
OLDMIN="1380" # 23 Stunden
# MySQL Zugangsdaten
DBUSER=""
DBPASS=""
# MySQL Datenbanken (Leerzeichen getrennt)
DBS=""
DBIGNORE="(^mysql|_schema)" # Grep Regex
# Datei -/Ordnerpfade (Leerzeichen getrennt, ohne abschliessenden Slash)
DIRS=""
#### Ab hier Finger weg, wenn keine Ahnung ####
# binary Pfade
BINHOSTNAME=`which hostname`
BINMYSQLDUMP=`which mysqldump`
BINTAR=`which tar`
BINGZIP=`which gzip`
BINCAT=`which cat`
BINFIND=`which find`
BINRM=`which rm`
BINMOUNT=`which mount`
BINUMOUNT=`which umount`
# Timestamp fuer logging
LOGTS="$(date "+%b %d %Y %H:%M:%S")"
# Filename prefix
FILEPREFIX="$(date +%Y-%m-%d_%H-%M).`${BINHOSTNAME} -s`"
#
# Mount Check
#
ERROR=0
if grep -qs "${DEST}" /proc/mounts; then
echo "${LOGTS} It's mounted."
if touch "${DEST}/test.touch" 2>/dev/null; then
rm "${DEST}/test.touch"
echo "${LOGTS} It's writeable."
else
echo "${LOGTS} WARNUNG: Ziel nicht beschreibbar."
ERROR="1"
fi
else
echo "${LOGTS} WARNUNG: Ziel nicht gemounted."
ERROR=1
fi
if [ ${ERROR} != 0 ]; then
echo "${LOGTS} WARNUNG: Versuche mount!"
${BINUMOUNT} ${DEST} 2>/dev/null
${BINMOUNT} ${DEST}
if touch "${DEST}/test.touch" 2>/dev/null; then
rm "${DEST}/test.touch"
echo "${LOGTS} It's writeable."
else
echo "${LOGTS} WARNUNG: Ziel immer noch nicht beschreibbar."
exit 1
fi
fi
#
# MySQL
#
if [ ! -z "$DBUSER" ]; then
DBS=$(mysql -u$DBUSER -p$DBPASS --batch --disable-column-names -e "SHOW DATABASES;")
if [ ! -z "$DBIGNORE" ]; then
DBS=$(echo "$DBS" | grep -vE "$DBIGNORE")
fi
for db in ${DBS}
do
echo "${LOGTS} sichere Datenbank: $db"
${BINMYSQLDUMP} -u${DBUSER} --password=${DBPASS} --opt $db | ${BINGZIP} -c | ${BINCAT} > "${DEST}/${FILEPREFIX}.$db.sql.gz"
done
fi
#
# Dateien
#
echo "${LOGTS} sichere Dateien: ${DIRS}"
${BINTAR} -zcvf "${DEST}/${FILEPREFIX}.files.tar.gz" ${DIRS} 1> /dev/null
#
# Alte Backups loeschen
#
echo "${LOGTS} loesche Backups welche aelter als ${OLDMIN} Sekunden sind"
${BINFIND} ${DEST}/*.gz -type f -mmin +${OLDMIN} -exec ${BINRM} {} \;
exit 0
#
# Mail Backup-Log
#
if grep -qs 'erfolgreich' ${BACKUPLOG}; then
SUBJECT="$(hostname)_Backup-OK"
else
SUBJECT="$(hostname)_Backup-Fehler"
fi
mail ${MAILRCPT} -s ${SUBJECT} << EOF
Die erstellte Sicherungsdatei lautet: `ls -l ${DESTDIR}/${FILEPREFIX}*|awk '{print $9}'|grep ${FILEPREFIX}*`
Informationen zur Datei:
`ls -lh ${DESTDIR}/${FILEPREFIX}*`
Informationen zum Sicherungslog `ls -l ${BACKUPLOG}|awk '{print $9}'`
`cat ${BACKUPLOG}`
EOF
exit 0
===== Inkrementelles Backup =====
Damit man täglich nicht immer die selbe Menge sichern muss, sondern nur die Änderungen, weist man ''tar'' an eine "Inkrementelle Sicherung" zu erstellen.
Man fügt zum tar-Befehl einfach den Parameter ''-g /'' hinzu.
Um dann zwischendurch noch Komplette Sicherungen zu erstellen kommt noch wahlweise der Parameter ''--level=0''
In unserem Script fügt man oben einen neuen Parameter hinzu und ändert folgende Zeile:
+++ SNAPFILE=${DEST}/snap.snar
--- ${BINTAR} -zcvf "${DEST}/${FILEPREFIX}.files.tar.gz" ${DIRS} 1> /dev/null
+++ ${BINTAR} -zcvf "${DEST}/${FILEPREFIX}.files.tar.gz" -g ${SNAPFILE} $1 ${DIRS} 1> /dev/null
Nun fügt man in der ''/etc/crontab'' diese Zeilen hinzu, um z.B. Sonntags eine komplette und an den sonstigen Tagen einen inkrementelle Sicherung zu erstellen.
# m h dom mon dow user command
* * 0 root /backup.sh "--level=0" >
* * 1-6 root /backup.sh >