MySQL-Backup von mehr als 20 Datenbanken

bwar

Registered User
Hallo!

Ich betreibe ein kleines free Webhostingprojekt. Auch wenn meine AGB mich nicht zu Backups verpflichtet, tue ich das dennoch mit Hilfe eines Vollbackups von Virtuozzo.

Ich möchte allerdings gerne dennoch als kleinen "Service" im Notfall das Nötigste als backup parat haben.

Mein Ziel ist es, ca. 20 MySQL-Datenbanken zu sichern.
Die Forensuche ergab immer Sicherungsbesipiele, bei dem der Username und das Passwort bekannt sind. Bei mir ist das nicht der Fall.

Gibt es eine Möglichkeit, komplette Datenbanken ohne Kenntnis von Passwörtern, ohne Verlust von Username und Passwort, durch zu führen?


Ich wäre über Hilfe dankbar.

mfg

bwar
 
Ja, gibt es. Sichere einfach die physischen Datenbank files. Liegen bei den meisten distris unter /var/lib/mysql
 
Erstelle ein Dump mit dem mysql Konsolentool mysqldump
Code:
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

Gruß flyingoffice
 
Last edited by a moderator:
Ich weiß nicht wie wichtig die Daten sind, aber ich bastel gerade an einem Realtime Backup via MySQL Replikation. Wenn du also einen zweiten Server hast, oder zu Hause einen Server hast der 24 Stunden läuft wäre das vielleicht eine nette alternative. Wenn dir deine Datenbank dann ausfallen sollte, kannst du sofort auf dein Backup umschalten.
 
Wenn ich falsch liege, möge mich doch jemand berichtigen:

Also afaik sind Standardmäßig die Verbindungen zw. Server und Client nicht verschlüsselt. MySQL unterstützt aber SSL Verbindungen. Für ein Replika kannst du ja auch noch eine VPN Verbindung nutzen, um dich auf eine sicherere Seite zu begeben.
 
flyingoffice said:
Erstelle ein Dump mit dem mysql Konsolentool mysqldump
Code:
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

Ok. Danke. Ich werde die Version nutzen. :)
 
Last edited by a moderator:
Darkdream said:
Ich weiß nicht wie wichtig die Daten sind, aber ich bastel gerade an einem Realtime Backup via MySQL Replikation. Wenn du also einen zweiten Server hast, oder zu Hause einen Server hast der 24 Stunden läuft wäre das vielleicht eine nette alternative. Wenn dir deine Datenbank dann ausfallen sollte, kannst du sofort auf dein Backup umschalten.

Via Replikation hast du kein Backup.
Das macht auch überhaupt keinen Sinn, da du z.B. fälschlich gelöschte Daten bei der Replikation genauso verlierst.


@ topic

Ich würde das Backup über ein Bash Script mit Hilfe einer for Schleife machen...
Ich Backupe so täglich meinen Confixx User Datenbanken...
 
Hi,

könntest du das evtl. nochmal genauer beschreiben?
Werden da alle Datenbanken einzelnd gesichert oder auch alle DBs in eine gepackt?



greetz
 
Das kannst Du halten wie der Dachdecker, mbanse.

mysqldump gibt Dir jedmögliche Freiheit, was das erstellen betrifft. Wenn Du ohnehin ein Bash-Script schreibst, kannst Du ja auch jede DB einzeln sichern. Du kannst sogar einzelne Tabellen sichern.
Code:
mysqldump --help
gibt einen ersten Aufschluss, was man mit mysqldump so alles anstellen kann.

Ich hab Dir mal fix ein kleines Bashscript zusammen getippt, womit Du jede DB einzeln in einer eigenen sql-Datei sicherst:
Code:
#!/bin/bash
# Je DB eine .sql-Datei erstellen
# In /root/show.sql steht einfach nur
# show databases;

typeset -i LINECOUNT=0
MYSQL_USER=''
MYSQL_PW=''
PATH_TO_STORE='/root/'

mysql -u ${MYSQL_USER} -p${MYSQL_PW} < ${PATH_TO_STORE}show.sql  > ${PATH_TO_STORE}current_dbs.txt

while read LINE; do
  (( LINECOUNT++ ))
  # Erste Zeile muss übersprungen werden
  if (( LINECOUNT > 1 )); then
    mysqldump --database -u ${MYSQL_USER} -p${MYSQL_PW} ${LINE} > ${PATH_TO_STOR
E}${LINE}.sql
  fi
done < ${PATH_TO_STORE}current_dbs.txt
Evtl. weiß ja jemand, wie man mysql direkt mit einem Befehl füttern kann, ohne dass umständlich die Datei show.sql angelegt werden muss.
 
Last edited by a moderator:
Hi,

ich danke dir, dass ist genau das was ich nicht hinbekommen hab...
Solch ein "einfacher" 19 Zeiler *g.

Hätte echt nicht gedacht, dass es so "einfach" geht.
Hab mich da schon lange dran versucht.

Tausend Dank, hast grade ne menge Usern bei nem Crash nen DB Backup geschenkt.



greetz
 
Hi,

vorerst Sorry für den Doppelpost, wollte nicht editieren, da das jetzt nichts mit dem Post davor zu tun hat.

Also hab dein kleines aber feines Script noch ein bisschen Verbessert (bin ja gerne am basteln ;)).

Habe einmal die Config und das Backupverzeichnis getrennt und dem Script gesagt dass es bei jedem Backup ein neues Verzeichnis mit dem aktuellem Datum anlegt (passt bei mir gut, da ich nur vorhabe alle 24 Stunden ein Backup zu machen, sollte man natürlich mehrere Backups machen wollen ist es nicht schlecht evtl. die Zeit mit im Verzeichnis anzugeben damit es keine Probleme gibt):

Code:
#!/bin/bash
# Je DB eine .sql-Datei erstellen
# In /root/show.sql steht einfach nur
# show databases;
 
typeset -i LINECOUNT=0
 
#MySQL User (root)
MYSQL_USER='root'
 
#MySQL Passwort vom User
MYSQL_PW='rootpw'
 
#Datum als Variable
date=$(date +"%d-%m-%Y")

#Ordner mit $datum anlegen
mkdir $date

#Pfad zum Backupverzeichnis
PATH_TO_STORE='/home/backup/backup/'$date/

#Pfad wo show.sql und current_dbs.txt liegen
CONFIG='/home/backup/backup/config/'
 
mysql -u ${MYSQL_USER} -p${MYSQL_PW} < ${CONFIG}show.sql > ${CONFIG}current_dbs.txt
while read LINE; do
(( LINECOUNT++ ))
# Erste Zeile muss übersprungen werden
if (( LINECOUNT > 1 )); then
mysqldump --database -u ${MYSQL_USER} -p${MYSQL_PW} ${LINE} > ${PATH_TO_STORE}${LINE}.sql
fi
done < ${CONFIG}current_dbs.txt

#FREUEN :D

Also wie man sieht eig nur den einen Pfad angepasst, ich hab schon nen lösungsansatz um die show.sql wegzulassen nämlich über "mysqlshow -prootpw" da zeigt er auch die DBs an genau wie der "show databases;" - Befehl.
Wenn das klappt (atm kommt noch ne Fehlermessage) poste ichs natürlich auch, kann bestimmt noch jemand gebrauchen.

Warum?
Mich hats gewurmt, dass ich in jedem Verzeichnis immer die current_dbs.txt und show.sql anlegen musste.
Aber das wird damit ja dann überflüssig - und macht das Script Crontauglich ;). Also ich finds ne schöne Möglichkeit seine Datenbanken in .sql Dateien zu sichern - und es geht schnell ich hab ca. 800 Datenbanken von 1 GB Größe und das rattert in weniger als 1 Min durch.

Hoffe damit noch jemandem geholfen zu haben ;)

greetz
 
Du brauchst doch nur einmal die show.sql?

Ach ja und da ist noch ein kleiner Denkfehler. Du erstellst das Verzeichnis ohne absolute Pfadangabe, also wird es immer da installiert, von wo das Skript aufgerufen wird. Ich würde also folgendes schreiben:
Code:
mkdir ${PATH_TO_STORE}/${date}
P_T_S muss dann natürlich davor deklariert werden ;)
 
Hi,

ah danke ;D.

Jau, aber mit der mysqlshow ... Lösung wird keine show.sql mehr gebraucht die den "show databases;" Befehl beinhaltet.

Klappt auch soweit nur erhalte ich folgende Meldung dabei:


Code:
xxx:/home/backup/backup # ./dump
mkdir: cannot create directory `30-07-2006': File exists
./dump: line 28: ${SHOW}#: ambiguous redirect

Mkdir, weiss ich Verzeichnis ist schon vorhanden - klar.
Aber nach "ambiguous redirect" macht er weiter und alle DBs werden dennoch angelegt.
Hast ne Idee?

Hier wär die geänderte Codezeile:

Code:
mysql -u ${MYSQL_USER} -p${MYSQL_PW} < ${SHOW}# > ${CONFIG}current_dbs.txt


greetz
 
Hi,

hier:

Code:
[SIZE=1]
#!/bin/bash
# Je DB eine .sql-Datei erstellen
# In /root/show.sql steht einfach nur
# show databases;
typeset -i LINECOUNT=0
 
#MySQL User (root)
MYSQL_USER='root'
 
#MySQL Passwort vom User
MYSQL_PW='rootpw'
 
#Datum als Variable
date=$(date +"%d-%m-%Y")
 
#Pfad zum Backupverzeichnis
BACKUP='/home/backup/backup'
 
#Ordner mit $datum anlegen
mkdir $BACKUP/$date
 
#Pfad zum Backupverzeichnis
PATH_TO_STORE='/home/backup/backup/'$date/
 
#Pfad wo show.sql und current_dbs.txt liegen
CONFIG='/home/backup/backup/config/'
 
#MySQL Datenbanken anzeigen
SHOW='mysqlshow -p'$MYSQL_PW
 

mysql -u ${MYSQL_USER} -p${MYSQL_PW} < ${SHOW} > ${CONFIG}current_dbs.txt
while read LINE; do
(( LINECOUNT++ ))
# Erste Zeile muss übersprungen werden
if (( LINECOUNT > 1 )); then
mysqldump --database -u ${MYSQL_USER} -p${MYSQL_PW} ${LINE} > ${PATH_TO_STORE}${LINE}.sql
fi
done < ${CONFIG}current_dbs.txt
 
#FREUEN :D
[/SIZE]

Wie gesagt *.sql Dateien mit den DB Inhalten werden auch angelegt, google findet nichts informatives dazu.


greetz
 
Söderle... mbanse ist sicherlich schon ganz aufgeregt :) *just kidding*

Code:
#!/bin/bash
# Je DB eine .sql-Datei erstellen

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

#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}/

#MySQL Datenbanken in tmp Datei schreiben
mysqlshow -u ${MYSQL_USER} -p${MYSQL_PW} > ${BACKUP_DIR}databases.tmp
tr -cd '[:alnum:]' | awk '{ print $2; }' < ${BACKUP_DIR}databases.tmp > ${BACKUP_DIR}databases.tmp

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

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

Das einzige Problem ist im Moment noch, dass die tr | awk Kombination scheinbar eine Endlosschleife produziert und das Skript deshalb nicht astrein funktioniert.

Die tmp-Datei ist leider notwendig. Grundsätzlich umgehst Du das Problem mit dem ambigious redirect damit, dass Du die Variable mit VARIABLE=$(...) initialisierst.

Wenn jetzt noch jemand das Problem mit tr und awk löst, haben wir es glaube ich.
 
Hi,

nur jetzt tritt das Problem auf:

Code:
xxx:/home/backup/mysql # ./backup
: bad interpreter: No such file or directory

Hab versucht ne Lösung zu finden, dem war aber nicht so.
Auch mit "bash backup" lässt es sich nicht wirklich korrekt ausführen.
Das Verzeichnis wird zwar angelegt aber keine Backups gemacht.

Funktioniert es bei dir? Bzw. hast es getestet?



greetz

PS: Und ja die Shebang Zeile ist korrekt #!/bin/bash - Bash ist auch an dieser Stelle verfügbar, bevor die Frage kommt.
 
Last edited by a moderator:
Sorry für die geistige Umnachtung in dem vorigen Skript! Ich hab jetzt noch einen gzip mit eingebaut. Ich weiß, dass man das gzippen auch direkt nach dem Dump machen kann, aber... ich hab es jetzt erstmal so gelassen. Gzip hat meinen Dump auf 10% der Originalgröße schrumpfen lassen - also dringend zu empfehlen.

Das folgende ist getestet und funktioniert einwandfrei! :)
Code:
#!/bin/bash
# Je DB eine .sql-Datei erstellen

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

#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}/

#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} ${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
 
Last edited by a moderator:
Hi,

ich hatte es vorher auch auf eine andere Art gelöst:

Ich hatte wieder die Version mit der show.sql genommen, da klappte ja alles einwandfrei.
Habe dann das Backup erzeugen lassen, dann den Inhalt vom Ordner einge"tarrt" mit "tar czf $date.tar.gz *" dann das tar.gz in den Backup Order verschoben und den alten Ordner gelöscht.
Danach war mein Backup nur noch knapp 80MB groß nicht mehr wie zuvor rund 700MB. Aber deine Lösung ist natürlich schöner, dann brauch man nicht mehr alles entpacken wenn man nur eine DB haben möchte.

Klappte auch schön.
Ich versuch jetzt noch in dein Script einzubauen das alte Backups gelöscht werden nach einigen Tagen, dann hab ich noch ne kleine herausforderung :D. Mal gucken ob ichs hinbekomm wenn ja post ich es auch hier.



greetz
 
Back
Top