MySQL-Backup von mehr als 20 Datenbanken

Ein paar Tipps:
- Timestamp erstellen, bis zu dem gelöscht werden soll
- Ordnernamen auslesen, dabei den Namen in Timestamp umwandeln
- Array Shift von groß nach klein (Wichtig!)
- und dann ... rm -rf der vorhandenen Elemente im Array. Natürlich nicht vergessen den timestamp wieder in das Datum zu ändern.
 
Hi,

danke ich werds versuchen umzusetzen ;D.

Hatte grad noch ne andre Idee nämlich die von einem Restore:


Code:
#!/bin/bash
#Datenbank Wiederherstellen - Einzel
 
#MySQL Login-Daten
MYSQL_USER='root'
MYSQL_PW='rootpw'
 
#Datum in Format TT-MM-YYYY
DATE='TT-MM-YYYY'
 
#Datenbank welche wiederhergestellt werden soll
DB='datenbankname'
 
#Pfad zum Wurzelverzeichnis des Backup-Dirs
BACKUP_DIR='/home/backup/mysql/'
 
#Pfad zum Backupverzeichnis dieses Durchlaufs
PATH_TO_STORE=${BACKUP_DIR}${DATE}/
 
echo Beginne entpacken für $DB
# Gunzip der Datenbank
cd ${PATH_TO_STORE}
gunzip $PATH_TO_STORE$DB.sql.gz;
cd ${BACKUP_DIR}
echo .sql entpackt
 
mysql -u $MYSQL_USER -p$MYSQL_PW $DB < $PATH_TO_STORE$DB.sql
echo DB wiederhergestellt
 
gzip $PATH_TO_STORE$DB.sql


Wichtig ist hierbei eigentlich nur, dass die Datenbank leer ist (also vorher löschen - entweder die Datenbank an sich oder nur den Inhalt) Aber ich denke da find ich auch noch ne möglichkeit vorher noch ein DROP DATABASE anzuhängen.

Und dann habsch noch die Idee Alle Datenbanken wiederherzustellen


greetz

Vielleicht hilft es ja mal irgendwem der sowas in der Art sucht.
 
Last edited by a moderator:
Wir könnten aber auch in dem eigtl. Backup-Skript die Option --drop-tables einfügen ;) Dann brauch die DB nicht leer sein.

Warum machst Du Dein restore Skript nicht mit einem Dialog? Dann brauch das Skript nicht dauernd geöffnet werden.

Edit: Wieso bist Du überhaupt wach? ;)
 
Hi,

mit --drop-tables auf die idee wär ich auch noch gekommen (hatte es ja grade editiert das ich vll noch ne Möglichkeit finde :D)

Und was meinst mit Dialog? Ganz so "frisch" bin ich leider nich ist mehr oder weniger mein erstes Script was ich auch selber verstehe *grins.
Ist ja auch einfach aufgebaut ;D.


Warum bist du denn noch wach?
Hab noch n bissl gearbeitet und konnte nicht schlafen ;).



greetz
 
So, also erstmal hab ich das backup-script um die Abfrage erweitert.
Code:
#!/bin/bash
# Je DB eine .sql-Datei erstellen

#MySQL Login-Daten
MYSQL_USER='admin'
MYSQL_PW='33#HBB#1983'

#Datum als Variable
DATE=$(date +"%d-%m-%Y")

#Pfad zum Wurzelverzeichnis des Backup-Dirs
BACKUP_DIR='/root/mysql/'

#Ordner mit $datum anlegen
mkdir ${BACKUP_DIR}${DATE}

#Pfad zum Backupverzeichnis dieses Durchlaufs
PATH_TO_STORE=${BACKUP_DIR}${DATE}/

#Drop Tables einfügen?
echo "DROP-Statement einfügen? (j/n)?" > /dev/tty
read ANTWORT
case $ANTWORT in
  j*|J*) OPTIONS="--add-drop-table" ;;
  q*|Q*) OPTIONS="" ;;
esac
echo "Die Datenbanken werden gesichert... bitte warten!" > /dev/tty

#MySQL Datenbanken in tmp Datei schreiben
mysqlshow -u ${MYSQL_USER} -p${MYSQL_PW} > ${BACKUP_DIR}databases.tmp
awk '{ print $2; }' < ${BACKUP_DIR}databases.tmp > ${BACKUP_DIR}databases.tmp2

while read LINE; do
  if [[ $LINE != "" ]] && [[ $LINE != "Databases" ]]; then
    mysqldump --database \
              -u ${MYSQL_USER} -p${MYSQL_PW} \
              ${OPTIONS} ${LINE} > ${PATH_TO_STORE}${LINE}.sql
  fi
done < ${BACKUP_DIR}databases.tmp2

# Gzip der Dateien
cd ${PATH_TO_STORE}
for FILE in *.sql;
  do gzip ${FILE};
done
cd ${BACKUP_DIR}

# Loeschen der TMP-Datei
rm ${BACKUP_DIR}databases.tmp
rm ${BACKUP_DIR}databases.tmp2

Jetzt Dein angefangenes Restore-Script mit Parameter:
Code:
#!/bin/bash
#Datenbank Wiederherstellen - Einzeln

if [ $# -eq 0 ] ; then
   echo "Aufruf: $0 -f <file>"
   exit
fi

#MySQL Login-Daten
MYSQL_USER='root'
MYSQL_PW='rootpw'

#Datum in Format TT-MM-YYYY
DATE='TT-MM-YYYY'

#Datenbank welche wiederhergestellt werden soll
DB="$1"

#Pfad zum Wurzelverzeichnis des Backup-Dirs
BACKUP_DIR='/home/backup/mysql/'

#Pfad zum Backupverzeichnis dieses Durchlaufs
PATH_TO_STORE=${BACKUP_DIR}${DATE}/

echo "Beginne entpacken für ${DB}" > /dev/tty
# Gunzip der Datenbank
cd ${PATH_TO_STORE}
gunzip ${PATH_TO_STORE}${DB}.sql.gz;
cd ${BACKUP_DIR}
echo ".sql entpackt"

mysql -u ${MYSQL_USER} -p${MYSQL_PW} ${DB} < ${PATH_TO_STORE}${DB}.sql
echo "${DB} wiederhergestellt!"

gzip ${PATH_TO_STORE}${DB}.sql
 
Hi,

und was bedeutet es wenn ich beim backup das --drop-table mit speicher? Dann leert er die DB beim Backup oder wie versteh ich das Falsch? *g



greetz
 
Hi,

asoo, alles klar ;D.
Jetz muss ich mich da ersma durchwurschteln damit ich versteh wie es da jetzt abläuft im Script *g.



greetz
 
flying: Kleine Spielerei ;) Nichts Wildes. Aber recht hast Du, warum zweimal Ressourcen über ein bereits gelöstes Problem verschwenden. War heute bloß fürchterlich langweilig auf der Arbeit :)
 
Hi,

und ausserdem lern ich noch was dabei :D.
Jeder fängt mal klein an, obwohl ich gestehen muss dass ich nicht dazu gekommen bin weiter drüber nachzudenken.
Gab in der letzten Nacht einige Probleme mit einem der Server die behoben werden wollten, werd mich dann weiter am nächsten Tag drüber her machen.


greetz
 
Ich würde es einfach so machen. Dann benötigt man auch keine temporären Dateien...

Code:
#!/bin/sh
#
# mysql backup daily
#

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin

# config
backup_dir="/backup"
mysql_opt="--opt --allow-keywords"
mysql_pass="rootpass"

# script
date=`date '+%G%m%d'`

test -d ${backup_dir}/${date} || mkdir -p ${backup_dir}/${date}

for db in `echo show databases | mysql -u root -p${mysql_pass} | egrep -v "^Database$"`
do
mysqldump ${mysql_opt} -uroot -p${mysql_pass} -hlocalhost ${db} > ${backup_dir}/${date}/${db}.sql
tar -C ${backup_dir}/${date} -c -z -f ${backup_dir}/${date}/${db}_sql.tar.gz ${db}.sql
rm -f ${backup_dir}/${date}/${db}.sql
done
 
Ich habe das hier versucht, aber das erstellte backupfile ist viel zu klein.

mysqldump --all-databases --use={user} --password={passwort} > backup.sql
# {user} ist durch den "Root" User von MySql zu ersetzen
# {passwort} ist durch das Passwort vom Root User zu ersetzen
 
Last edited by a moderator:
Hallo!
Was passiert, wenn du das
Code:
> backup.sql
weglässt? Gibt es eine Fehlermeldung auf der Konsole?

mfG
Thorsten
 
...aber das erstellte backupfile ist viel zu klein.
Schau Dir doch mal die backup.sql mit einem Editor Deiner Wahl an und prüfe ob wirklich etwas fehlt.

Gruß flyingoffice
 
Back
Top