2012-06-03 13 views
24

Ich schreibe einen einzigen Zeilenbefehl, der alle Datenbanken in ihren jeweiligen Namen statt Dumping alles in einem sql sichert.mysqldump mit db in einer separaten Datei

zB: DB1 gerettet werden db1.sql und db2 gespeichert wird

Bisher db2.sql hatte ich die folgenden Befehle gesammelt alle Datenbanken abzurufen.

mysql -uuname -ppwd -e 'show databases' | grep -v 'Database' 

Ich plane es mit awk Rohr etwas wie

awk '{mysqldump -uuname -ppwd $1 > $1.sql}' 

zu tun, aber das funktioniert nicht.

Ich bin neu zu bash, also könnte ich falsch in meinem Denken sein.
Was soll ich tun, damit die db in ihren jeweiligen Namen exportiert wird?

update:
Ok, muss endlich geschafft haben, es funktioniert von den Hinweisen unten zu bekommen.
Dies ist das letzte Skript

# replace [] with your own config 
# replace own dir to save 
# echo doesn't work. hmm... 

mysql -u[uname] -p'[pwd]' -e "show databases" \ 
| grep -Ev 'Database|information_schema' \ 
| while read dbname; \ 
do \ 
echo 'Dumping $dbname' \ 
mysqldump -u[uanme] -p'[pwd]' $dbname > ~/db_backup/$dbname.sql;\ 
done 

Das Echo Teil allerdings nicht funktioniert.

+0

Das Echo funktioniert nicht, weil es in ~/db_backup/$ dbname.sql umgeleitet wird. Ihr mysqldump funktioniert wahrscheinlich auch nicht - so wie es hier geschrieben ist, es ist einfach ein Argument für das Echo. Ich würde empfehlen, das Argument mysqldump --result-file zu verwenden, anstatt umzuleiten, einfach um zu klären, was passiert. –

+0

mindestens müssen Sie ein ";" hinzufügen Nach echo 'Dumping $ dbname' – Nadir

Antwort

0

Keine Antwort auf Ihre Frage, aber werfen Sie einen Blick auf das Projekt AutoMySQLBackup auf Sourceforge, anstatt das Rad neu zu erfinden. Es macht, was Sie wollen, und bietet eine Menge zusätzlicher Funktionen, einschließlich Komprimierung, Verschlüsselung, Rotation und E-Mail-Benachrichtigungen. Ich habe es vor einiger Zeit benutzt und es hat wirklich gut funktioniert.

0

Es scheint gut. Das einzige, was ich im Moment finden kann (ohne zu testen) ist, dass Sie ein Semikolon hinter Show Tabellen verpassen.

35
mysql -uroot -e 'show databases' | while read dbname; do mysqldump -uroot --complete-insert --some-other-options "$dbname" > "$dbname".sql; done 
+7

Bei Übergabe von '-N' an' mysql' wird die Spaltenüberschrift 'Database' weggelassen. –

+0

Danke Vinicius. Ich bekam "mysqldump: Fehler: 1049: Unbekannte Datenbank 'Datenbank' bei der Auswahl der Datenbank" und konnte nicht herausfinden warum. – Phil

0

Während verfügbaren Pakete für die AutoMySQLBackup Projekt vorgeschlagen von @Jeshurun ​​Suche kam ich accross Holland.

Fasziniert von dem Namen (ich lebe in Belgien im Süden der Niederlande, manchmal - oder besser einige Teile - bezeichnet als "Holland"), beschloss ich, es zu überprüfen. Vielleicht kann es dir auch helfen.

16

Das Erstellen von Sicherungen pro Datenbank ist in der Tat viel effizienter. Nicht nur einfacher wiederherzustellen, wenn es einmal benötigt wird, sondern ich habe auch erfahren, dass ein Backup der gesamten Datenbank bricht, wenn eine Tabelle kaputt/beschädigt ist. Und durch Erstellen von Backups pro Datenbank wird nur für diese Datenbank unterbrochen und der Rest ist weiterhin gültig.

Die oneliner wir sichern unsere MySQL-Datenbanken erstellt ist:

mysql -s -r -u bupuser -pSecret -e 'show databases' | while read db; do mysqldump -u bupuser -pSecret $db -r /var/db-bup/${db}.sql; [[ $? -eq 0 ]] && gzip /var/db-bup/${db}.sql; done 

Beste neue Nur-Lese-mysql user 'bupuser' mit passsword 'Geheim' zu erstellen (ändern!). Es wird zuerst die Liste der Datenbanken abrufen. Dann Schleife und für jede Datenbank erstellen Sie eine dump.sql-Datei zu/var/db-bup (Sie können ändern). Und nur wenn keine Fehler aufgetreten sind, dann gzip die Datei auch gzip, was wirklich drastisch Speicher spart. Wenn bei einigen Datenbanken Fehler aufgetreten sind, sehen Sie die .sql-Datei und nicht die .sql.qz-Datei.

+0

sehr gut in der Tat! – Mike

+0

Das war fast perfekt - fügen wir ein GREP hinzu, um Systemtabellen zu vermeiden: mysql -s -r -u root -proot -e 'Datenbanken anzeigen' | grep -Ev 'Datenbank | mysql | informationsschema | phpmyadmin' | während db lesen; mysqldump -u root -proot $ db -r /var/www/html/${db}.sql; [[$? -eq 0]] && gzip /var/www/html/${db}.sql; done – Nadir

+1

** Dies ist meine letzte Version **: mysql -s -r -u root -proot -e 'Zeige Datenbanken' | grep -Ev 'Datenbank | information_schema | performance_schema | phpmyadmin' | grep -v '^ mysql $' | während db lesen; do mysqldump -u root -Proot $ db | gzip> /var/dump/${db}.sql.gz; done – Nadir

8

Hier ein einfaches Skript, das wird:

  • Dump alle DB eine Kompresse der Ausgabe ->SCHEMA_NAME.sql.gz
  • Verwendung [autocommit/unique_checks/foreign_key_checks] Import beschleunigen
  • Standardschemata ausschließen

Datei: Dump_all.sh

Wie verwenden:
./Dump_all.sh -> werden alle DB
./Dump_all.sh SCHEMA_NAME Dump -> SCHEMA_NAME DB

#!/bin/bash 
MYSQL_USER="root" 
MYSQL_PASS="YOUR_PASS" 

echo "-- START --" 

echo "SET autocommit=0;SET unique_checks=0;SET foreign_key_checks=0;" > tmp_sqlhead.sql 
echo "SET autocommit=1;SET unique_checks=1;SET foreign_key_checks=1;" > tmp_sqlend.sql 

if [ -z "$1" ] 
    then 
    echo "-- Dumping all DB ..." 
    for I in $(mysql -u $MYSQL_USER --password=$MYSQL_PASS -e 'show databases' -s --skip-column-names); 
    do 
     if [ "$I" = information_schema ] || [ "$I" = mysql ] || [ "$I" = phpmyadmin ] || [ "$I" = performance_schema ] # exclude this DB 
     then 
     echo "-- Skip $I ..." 
     continue 
     fi 
     echo "-- Dumping $I ..." 
     # Pipe compress and concat the head/end with the stoutput of mysqlump ('-' cat argument) 
     mysqldump -u $MYSQL_USER --password=$MYSQL_PASS $I | cat tmp_sqlhead.sql - tmp_sqlend.sql | gzip -fc > "$I.sql.gz" 
    done 

else 
     I=$1; 
     echo "-- Dumping $I ..." 
     # Pipe compress and concat the head/end with the stoutput of mysqlump ('-' cat argument) 
     mysqldump -u $MYSQL_USER --password=$MYSQL_PASS $I | cat tmp_sqlhead.sql - tmp_sqlend.sql | gzip -fc > "$I.sql.gz" 
fi 

# remove tmp files 
rm tmp_sqlhead.sql 
rm tmp_sqlend.sql 

echo "-- FINISH --" 
0

Dies ist, was ich verwende, ist es sehr einfach Dump und funktioniert gut für mich.

mysql --skip-column-names -u root -p -e 'show databases' | while read dbname; do mysqldump --lock-all-tables -u root -p "$dbname"> "$(date +%Y%m%d)-$dbname".sql; done

Mit Kompression Option:

mysql --skip-column-names -u root -p -e 'show databases' | while read dbname; do mysqldump --lock-all-tables -u root -p "$dbname" | gzip> /tmp/"$(date +%Y%m%d)-$dbname".sql.gz; done

Wenn Sie das Passwort nicht in dem Befehl hinzugefügt haben, müssen Sie es eins plus die Gesamtzahl der Datenbanken, die Sie eingeben müssen.

1

Hier ist, was für mich gearbeitet

mysql -s -r -uroot -e 'show databases' -N | while read dbname; do 
    mysqldump -uroot --complete-insert --single-transaction "$dbname" > "$dbname".sql; 
done 
Verwandte Themen