MySQL Backup mit der bash

Ein kleines HowTo zum automatisierten Backup von MySQL während dem laufenden Betrieb mit Bordmitteln der Shell. Mit variabler Vorhaltezeit. Was leider gar nicht so einfach wie man denkt.

#
# Speichert ALLE Live Datenbanken unter BKUP_PFAD ins Filesystem
# Es werden MySQL select- und lock-Tables-Rechte benötigt

TAR="/bin/tar"
DATE=`date +%Y-%m-%d_%H`
RSYNC="rsync --rsh ssh -avzltpou --partial --delete --bwlimit=20 "

BKUPvorhaltezeit=14 # Tage
BKUP_PFAD="/pub/backup/mysql" # ohne trailing slash
quellen="/etc/ /root/ /srv/"
ziel="$BKUP_PFAD/$DATE/backup_$DATE.tgz"
MySqlPW="P/\$$\/\/0rT"

##############################
############################## Functions
##############################

doMySqlBackup () {
echo "Alle MySQL-Datenbanken sichern:"
# Bereinigte Liste der Datenbanken erzeugen
mysqlshow -p$MySqlPW | awk '{print $2}' | grep -v Databases | sort >/tmp/dbaselist.txt
# Wohin sollen die Backups geschrieben werden?
mkdir -p $BKUP_PFAD/$DATE
[ ! -d $BKUP_PFAD/$DATE ] && {
echo "Das Skript $0 kann $BKUP_PFAD/$DATE nicht anlegen BEENDE!!";
exit 1;
}

HEUTE=$BKUP_PFAD/$DATE
cd $HEUTE

echo "Datenbank: Backup-Pfad: $HEUTE"
#mkdir -p mysql_$DATE
#cd mysql$DATE
for x in `cat /tmp/dbaselist.txt`; do
echo "Datenbank: $x sichern"
mysqldump --opt -p$MySqlPW $x >$DATE-$x.sql
echo "Datenbank: $x zippen"
gzip -9 -f $DATE-$x.sql
done;
rm /tmp/dbaselist.txt
}

doBackup () {
cmd="$TAR -czf $ziel $quellen "
echo "cmd : $cmd"
$cmd # 2>/dev/null
}

#---------------------------------------------------------- delete all old backup filez
delOldBackups () {
cd $BKUP_PFAD
find $BKUP_PFAD -mtime +$BKUPvorhaltezeit -exec rm {} \;
}

##############################
############################## MAIN
##############################
echo
echo "Starte Backup $0 "
anfang=`date "+%Y_%m_%d %H:%M:%S"`
echo "start : $anfang"
echo "quelle: $quelle"
echo "ziel : $ziel"

doMySqlBackup
#doBackup
#delOldBackups
ende=`date "+%Y_%m_%d %H:%M:%S"`
echo "ende : $ende"
echo

 

MySQL-Backup -> die kurze Version (nur bedingt für produktive Systeme zu empfehlen)

#!/bin/sh
# mysqlbackup.sh

DBUSER=backup-user
DBPW=HelloHacker

HOST=`/bin/hostname`
BACKUP_DIR=${1:-/srv/backup/mysql/$HOST}
EXPIRETIME=14
DATE=`date "+%Y%m%d"`

# Sicherstellen, dass $BACKUP_DIR existiert
if [ ! -d $BACKUP_DIR ]; then
mkdir -p $BACKUP_DIR
chmod 0700 $BACKUP_DIR
fi

echo "Script:\t$0"
echo "Server:\t$HOST"
echo "Folder:\t$BACKUP_DIR"

# Backups erstellen
for i in /var/lib/mysql/*/; do
DBNAME=`basename "$i"`
DSTFN=$BACKUP_DIR/$DATE.$DBNAME.gz
echo "\tdumping $DBNAME "
mysqldump --user $DBUSER --password=$DBPW "$DBNAME" | gzip -9 > $DSTFN
done

#Alte Backups loeschen
find $BACKUP_DIR -mtime +${EXPIRETIME} -exec rm {} \;

 

0 Kommentare

Hinterlasse einen Kommentar

An der Diskussion beteiligen?
Hinterlasse uns deinen Kommentar!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.