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 <PFAD_ZU>/<SNAPSHOTFILE>
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 <MINUTE> <STUNDE> * * 0 root <PFAD_ZU>/backup.sh "--level=0" > <PFAD_ZU_FULLBACKUP_LOG> <MINUTE> <STUNDE> * * 1-6 root <PFAD_ZU>/backup.sh > <PFAD_ZU_INKBACKUP_LOG>