2012-06-03 15 views
24

Sto scrivendo un comando a riga singola che esegue il backup di tutti i database nei rispettivi nomi utilizzando invece il dumping tutto in un sql.mysqldump con db in un file separato

Esempio: DB1 vengono salvati per db1.sql e DB2 viene salvato db2.sql

Finora, avevo raccolto i seguenti comandi per recuperare tutti i database.

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

Sto pensando di tubo con awk fare qualcosa di simile

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

Ma questo non funziona.

Sono nuovo di bash, quindi potrei sbagliarmi nel mio modo di pensare.
Cosa devo fare per farlo esportare il db nei loro rispettivi nomi?

aggiornamento:
Ok, è finalmente riuscito a farlo funzionare seguendo i suggerimenti qui sotto.
Questo è lo script finale

# 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 

La parte eco della non funziona però.

+0

L'eco non funziona perché viene reindirizzato in ~/db_backup/$ dbname.sql. Probabilmente il tuo mysqldump non funziona - il modo in cui è scritto qui, è semplicemente un argomento per l'eco. Consiglierei di usare l'argomento mysqldump --result-file invece di reindirizzare, semplicemente per chiarire cosa sta succedendo. –

+0

almeno devi aggiungere un ";" after echo 'Dumping $ dbname' – Nadir

risposta

0

Non è una risposta alla tua domanda, ma dai un'occhiata al progetto AutoMySQLBackup su Sourceforge, invece di reinventare la ruota. Fa quello che vuoi, e offre un sacco di funzioni aggiuntive in cima, tra cui la compressione, la crittografia, la rotazione e le notifiche e-mail. L'ho usato un po 'indietro e ha funzionato molto bene.

0

Sembra soddisfacente. L'unica cosa che posso trovare al momento (senza test) è che ti manca un punto e virgola dopo Mostra tabelle.

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

Il passaggio di '-N' a' mysql' ometterà l'intestazione della colonna 'Database'. –

+0

Grazie Vinicio. Stavo ottenendo "mysqldump: errore ottenuto: 1049: database sconosciuto" Database "quando si seleziona il database" e non è stato possibile capire perché. – Phil

0

Mentre alla ricerca di pacchetti disponibili per il progetto AutoMySQLBackup suggerito da @Jeshurun ​​ho mai incontrato Holland.

Incuriosito dal nome (vivo in Belgio nel sud dei Paesi Bassi, a volte - o meglio alcune parti - denominato "Olanda"), ho deciso di dare un'occhiata. Forse può aiutarti anche tu.

16

Creazione di backup per database è davvero molto più efficiente. Non solo è più facile ripristinare una volta necessario, ma ho anche sperimentato che fare un backup dell'intero database si interromperebbe nel caso in cui una tabella fosse rotta/corrotta. E creando dei backup per database, si romperà solo per quel database e il resto è ancora valido.

L'oneliner che abbiamo creato per il backup nostri database MySQL è:

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 

migliore per creare un nuovo utente di sola lettura mysql 'bupuser' con passsword 'Secret' (cambiare!). Prima recupererà l'elenco dei database. Quindi loop e per ogni database creare un file dump.sql in/var/db-bup (è possibile modificare). E solo quando non ci sono errori incontrati allora gzip anche il file che davvero salverà drasticamente lo spazio di archiviazione. Quando alcuni database incontrano errori, vedrai il file .sql e non il file .sql.qz.

+0

davvero molto buono! – Mike

+0

Che era quasi perfetto - aggiungiamo un GREP per evitare le tabelle di sistema: mysql -s -r -u root -proot -e 'mostra database' | grep -Ev 'Database | mysql | information_schema | phpmyadmin' | mentre leggi db; do mysqldump -u root -proot $ db -r /var/www/html/${db}.sql; [[$? -eq 0]] && gzip /var/www/html/${db}.sql; done – Nadir

+1

** Questa è la mia ultima versione **: mysql -s -r -u root -proot -e 'show databases' | grep -Ev 'Database | information_schema | performance_schema | phpmyadmin' | grep -v '^ mysql $' | mentre leggi db; do mysqldump -u root -proot $ db | gzip> /var/dump/${db}.sql.gz; done – Nadir

8

Ecco uno script semplice che sarà:

  • discarica tutto DB un impacco l'uscita ->SCHEMA_NAME.sql.gz
  • uso [AUTOCOMMIT/unique_checks/foreign_key_checks] per accelerare l'importazione
  • esclude schemi predefiniti

File: Dump_all.sh

Come usare:
./Dump_all.sh -> sarà scaricare tutto DB
./Dump_all.sh SCHEMA_NAME -> sarà il 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

Questo è quello che sto usando, è molto semplice e funziona bene per me.

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

Con l'opzione di compressione:

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

Se non avete aggiunto la password nel comando, è necessario digitare uno più il numero totale delle banche dati che avete.

1

Ecco cosa ha funzionato per me

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