Mit der Shell im Anhang, ist es möglich, regelmäßig Backups der Datenbank/enzu machen.
Diese werden dann auf euren Backup Server via FTP geladen.
Das ganze basiert auf Bash, das heißt, ihr braucht das Package "Bash".
Zum installieren von Bash gebt ihr folgendes ein:
PHP Code:
pkg_add -r bash
rehash
PHP Code:
cd /usr/ports/shells/bash && make install clean && rehash
So, nun ist Bash installiert.
Nun passt ihr alle Einstellunge an, und führt die Shell mit "bash backup.sh" aus, NICHT mit "sh backup.sh".
Die Shell ist auf meinem Pc so halb am vergammeln gewesen, deswegen publiziere ich sie.
Sollte jemand Fehler entdecken, bitte ich sie zu posten, habe sie eben getestet und bis jetzt funktioniert sie noch, sofern man nicht start rumbastelt.
Sämtliche Vorgänge werden geloggt und in die "backup.log" geschrieben.
Falls Fehler auftauchen, wird dies in der "backup.log" erwähnt - nährere Informationen zu den gewisse n Fehlern stehen in der "backup.err" - die beiden Dateien sind im gleichen Verzeichnis wie die Shell.
Es gibt eine Mail Funktion, bedeutet, wenn SEND_MAIL auf 1 gestellt ist, werden euch alle nötigen Informationen via E-Mail zugesendet.
Achja, die Backups werden sicherheitshalber nochmals auf dem Root selbst gelagert, man kann aber einstellen, dass diese nach x Tagen automatisch gelöscht werden.
Wenn DELETE_OLD_BACKUPS auf 0 gestellt ist, werden keine alten Backups gelöscht.
Außerdem ist NUR der Root-Benutzer fähig, in die Backup Directory zu switchen, heißt, kein anderer hat zugriff auf die Backups.
Sollte jemand versuchen, die Backups von eurem FTP zu ziehen, wird es ihm nicht gelingen, dank den CHMOD Rechten.
PHP Code:
#!/bin/bash
# MySQL Backup Shell
#--
# by aiiR7
#--
#-- General Settings
NOW="$(date +"%Y%m%d")" # Date im YYYYMMDD Format
HOST="$(hostname)" # Hostname
DUMP_OPTS="-Q --single-transaction" # MySQL Dump Parameter
TAR_OPTS="-cvzf" # Tar Parameter
#-- MySQL Settings
MyUSER="root" # MYSQL Benutzer.
MyPASS="passwort" # MYSQL Passwort.
MyHOST="localhost" # MYSQL Host.
#-- FTP Settings
FTPUSER="ftpuser" # FTP Benutzer.
FTPPASS="ftppass" # FTP Password.
FTPHOST="ipoderhostname" # FTP IP/Host.
FTPDEST="verzeichnis" # FTP Verzeichnis, wo die Backups hinterlegt werden sollen.
#-- Log & Error File
LOG="backup.log" # Jeder Vorgang wird geloggt, diese kann man in dieser Datei finden.
ERR="backup.err" # Sämtliche Fehler werden in dieser Datei hinterlegt.
#-- Bin Pfad - ändere diese nur, wenn sie nicht via "which" erkannt werden.
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
GREP="$(which grep)"
CHOWN="$(which chown)"
CHMOD="$(which chmod)"
TAR="$(which tar)"
MAIL="$(which mail)"
FIND="$(which find)"
DF="$(which df)"
# ----------
# Trage hier ein, welche Datenbanken gesichert werden sollen. Wenn die untere Option aktiviert ist, muss diese auskommentiert werden.
DBS="account"
# Der unten stehende und auskommentierte Befehl kann aktiviert werden, wenn alle Datenbanken gesichert werden sollen.
# Dazu aber die obere Option "DBS" auskommentieren.
#DBS="$($MYSQL -u $MyUSER -h $MyHOST -p$MyPASS -Bse 'show databases')"
# Trage hier die Datenbanken ein, die NICHT gesichert werden sollen (Diese Option wird nur dann aktiviert, wenn der obere Befehl aktiviert ist.
#DNB="common information_schema mysql performance_schema test"
# ----------
# In diesem Ordner werden alle Backups hinterlegt.
DEST="/backup"
# Wenn "SEND_MAIL" auf "1" gestellt ist, werden dir sämtliche Informationen via E-Mail zugesendet.
SEND_EMAIL=1
NOTIFY_EMAIL="
"
NOTIFY_SUBJECT="MySQL Backup Notification"
#-- Backups Löschen
# Wenn "DELETE_OLD_BACKUPS" auf 1 gestellt ist, werden Backups, die älter als "DELETE_BACKUPS_OLDER_THAN_DAYS=x" gelöscht.
DELETE_OLD_BACKUPS=1
# Die Angabe wird in Tagen berechnet. Momentan werden die Backups nach 10 Tagen gelöscht, diese Angabe kann auf Wunsch geändert werden.
DELETE_BACKUPS_OLDER_THAN_DAYS=10
#-- E-Mail Funktion
function gen_email {
DO_SEND=$1
TMP_FILE=$2
NEW_LINE=$3
LINE=$4
if [ $DO_SEND -eq 1 ]; then
if [ $NEW_LINE -eq 1 ]; then
echo "$LINE" >> $TMP_FILE
else
echo -n "$LINE" >> $TMP_FILE
fi
fi
}
#-- Hier werden die Backups hinterlegt
if [ ! -d $DEST ]; then
echo "$(date) :: Das '$DEST' Verzeichnis existiert nicht." >> $LOG
echo "$(date) :: Erstelle '$DEST' Verzeichnis ..." >> $LOG
mkdir -p $DEST
echo "$(date) :: Das '$DEST' Verzeichnis wurde erstellt." >> $LOG
# Nur der Root Benutzer ist berechtigt, auf die Backups zuzugreifen.
echo "$(date) :: Verteile die Besitzer und Chmod Rechte für das Verzeichnis '$DEST' ..." >> $LOG
$CHOWN 0:0 $DEST
$CHMOD 0750 $DEST
echo "$(date) :: Die nötigen Rechte für das Verzeichnis '$DEST' wurden vergeben." >> $LOG
fi
#-- Backup Verzeichnis wird erstellt (bezieht sich auf die einzelnen Backups).
MBD="$DEST/$NOW"
[ ! -d $MBD ] && mkdir -p $MBD || :
$CHOWN 0:0 $MBD
$CHMOD 0750 $MBD
#-- Temp Message Datei
TMP_MSG_FILE="/tmp/$RANDOM.msg"
if [ $SEND_EMAIL -eq 1 -a -f "$TMP_MSG_FILE" ]; then
rm -f "$TMP_MSG_FILE"
fi
set -o pipefail
#-- Beginne mit Backup der zu sicherten Datenbanken.
echo "$(date) :: Beginne mit der Sicherung der Datenbanken ..." >> $LOG
for db in $DBS
do
skipdb=-1
if [ "$DNB" != "" ];
then
for i in $DNB
do
[ "$db" == "$i" ] && skipdb=1 || :
done
fi
if [ "$skipdb" == "-1" ] ; then
BACKUP="mysql_backup.`date +%d.%m.%Y-%H:%M:%S`.tgz"
$MYSQLDUMP $DUMP_OPTS -u $MyUSER -h $MyHOST -p$MyPASS --log-error=$ERR $db > $MBD/$db.sql
RESULT=$?
if [ $RESULT != 0 ]; then
rm $MBD/*.sql
NOTIFY_MESSAGE="$(date) :: Error: Fehler '$RESULT' ist aufgetreten."
echo $NOTIFY_MESSAGE >> $LOG
else
NOTIFY_MESSAGE="$(date) :: Die Datenbanken '$db' wurden erfolgreich gedumpt und im '$MBD' Verzeichnis hinterlegt."
echo $NOTIFY_MESSAGE >> $LOG
fi
gen_email $SEND_EMAIL $TMP_MSG_FILE 1 "$NOTIFY_MESSAGE"
echo $NOTIFY_MESSAGE
fi
done
$TAR $TAR_OPTS $MBD/$BACKUP $MBD/*.sql
if [ $? -ne 0 ] ; then
echo "$(date) :: Backup konnte nicht archiviert werden." >> $LOG
else
echo "$(date) :: Backup wurde erfolgreich archiviert." >> $LOG
rm $MBD/*.sql
echo "$(date) :: Bereite Backup zum transferieren vor ..." >> $LOG
echo "$(date) :: Verbinde mit Backup Server ..." >> $LOG
fi
#-- Empty line in email and stdout
gen_email $SEND_EMAIL $TMP_MSG_FILE 1 ""
echo ""
#-- Alte Backups löschen
if [ $DELETE_OLD_BACKUPS -eq 1 ]; then
find "$DEST" -maxdepth 1 -mtime +$DELETE_BACKUPS_OLDER_THAN_DAYS -type d | $GREP -v "^$DEST$" | while read DIR; do
gen_email $SEND_EMAIL $TMP_MSG_FILE 0 "Deleting: '$DIR': "
echo -n "Deleting: $DIR: "
echo "$(date) :: Bereite das alte Backupverzeichnis '$DIR' zum löschen vor, da es älter als '$DELETE_BACKUPS_OLDER_THAN_DAYS' ist." >> $LOG
rm -rf "$DIR"
RESULT=$?
if [ $RESULT != 0 ]; then
NOTIFY_MESSAGE="$(date) :: Error : Das alte Backupverzeichnis '$DIR' konnte nicht gelöscht werden."
echo $NOTIFY_MESSAGE >> $LOG
echo $NOTIFY_MESSAGE >> $ERR
else
NOTIFY_MESSAGE="$(date) :: Das alte Backupverzeichnis '$DIR' wurde erfolgreich gelöscht."
echo $NOTIFY_MESSAGE >> $LOG
fi
gen_email $SEND_EMAIL $TMP_MSG_FILE 1 "$NOTIFY_MESSAGE"
echo "$NOTIFY_MESSAGE"
done
fi
#-- Empty line in email and stdout
gen_email $SEND_EMAIL $TMP_MSG_FILE 1 ""
echo ""
#-- Festplatten Statistik wird via E-Mail übermittelt
if [ $SEND_EMAIL -eq 1 ]; then
$DF -h "$DEST" >> "$TMP_MSG_FILE"
fi
$DF -h "$DEST"
#-- Versenden der E-Mail in welcher alle Informationen vorzufinden sind.
if [ $SEND_EMAIL -eq 1 ]; then
$MAIL -s "$NOTIFY_SUBJECT" "$NOTIFY_EMAIL" < "$TMP_MSG_FILE"
rm -f "$TMP_MSG_FILE"
fi
#-- Hier verbindet sich der Server mit dem Backup Server und hinterlegt dort die Backups, sofern die letzten Vorgänge erfolgreich waren.
# Sollte ein Fehler während der Übertragung auftauchen, wird dieser in der $ERR (backup.err) hinterlegt.
ftp -inv $FTPHOST << EOF 2> $ERR
user $FTPUSER $FTPPASS
bin
prompt off
$CHMOD 0600 $FTPDEST
cd $FTPDEST
mkdir $NOW
cd $NOW
lcd $MBD
mput $BACKUP
$CHMOD 0600 $BACKUP
EOF
if $GREP "ftp" $ERR
then
echo "$(date) :: Error : Es ist ein Fehler während der FTP Übertragung aufgetreten, siehe mehr in '$ERR'" >> $LOG
else
echo "$(date) :: Backup wurde soeben auf den Backup Server transferiert." >> $LOG
echo "$(date) :: Das aktuelle Backup Verzeichnis lautet '$NOW'." >> $LOG
echo "$(date) :: Backup Erfolgreich Abgeschlossen." >> $LOG
echo "" >> $LOG
echo "----------------------" >> $LOG
echo "" >> $LOG
fi
Ladet sie bitte aus dem Anhang, ich zeige den Code nur, damit ihr sichergehen könnt, dass es sich nicht um einen Virus o.a. handelt!






