2011-01-16 7 views
38

Ho una directory con un gruppo di file .sql che mysql dump di ogni database sul mio server.Importa più file .sql di dump nel database mysql dalla shell

ad es.

database1-2011-01-15.sql 
database2-2011-01-15.sql 
... 

Ci sono un sacco di loro in realtà.

Ho bisogno di creare uno script di shell o una linea singola che probabilmente importerà ciascun database.

Sono in esecuzione su una macchina Linux Debian.

io pensando che ci sia un modo per tubi nei risultati di un ls in qualche comando find o qualcosa del genere ..

alcun aiuto e l'istruzione è molto apprezzato.

EDIT

Quindi in ultima analisi, voglio importare automaticamente un file alla volta nel database.

E.g. se ho fatto manualmente su uno sarebbe:

mysql -u root -ppassword < database1-2011-01-15.sql 

risposta

73

cat *.sql | mysql? Ne hai bisogno in un ordine specifico?

Se avete troppi per gestire in questo modo, quindi provare qualcosa di simile:

find . -name '*.sql' | awk '{ print "source",$0 }' | mysql --batch 

Questo diventa anche attorno ad alcuni problemi con il passaggio di ingresso sceneggiatura attraverso un gasdotto anche se non si dovrebbe avere alcun problema con pipeline processing sotto Linux. La cosa bella di questo approccio è che l'utilità mysql legge in ogni file invece di averlo letto da stdin.

+0

Alla fine ho usato il gatto \ * .sql ma lo ruppe per lettera così non c'erano troppe informazioni. per esempio. cat a \ *. sql | mysql -u root -ppass –

+9

Ho usato 'ls -1 * .sql | awk '{print "source", $ 0}' | mysql --batch -u {username} -p {password} {dbname} 'come ho chiamato i miei file sql sequenzialmente e volevo eseguire in quell'ordine – Luracast

+0

@Luracast Ho usato' ls -1 * .sql | awk '{print "source", $ 0}' | mysql --batch -u {username} -p {dbname} 'per farlo funzionare. La password deve essere inserita nella console quando viene effettivamente richiesta, non nel comando stesso. MySQL non accetta password nel comando. –

2

Non mi ricordo la sintassi di mysqldump ma sarà qualcosa di simile

find . -name '*.sql'|xargs mysql ... 
+0

dal fare un po 'di ricerca è quello che sto arrivando anche io. per esempio. trova . -name '* .sql' | xargs mysql -u root -ppassword Funzionerebbe? –

+0

e -h host se si è su un server remoto e probabilmente è necessario specificare il nome del database – Navi

+0

il database viene fatto riferimento in ogni file di backup, quindi la singola riga sopra funziona già ed è il localhost –

17

One-liner di leggere in tutte le .sql file e li importa:

for SQL in *.sql; do DB=${SQL/\.sql/}; echo importing $DB; mysql $DB < $SQL; done 

L'unico accorgimento è la sostituzione bash sottostringa per togliere la .sql per ottenere il nome del database.

+0

Come un incanto, grazie per questo! Ha funzionato meglio della risposta accettata per me. – Swader

3

Ho creato un copione qualche tempo fa per fare proprio questo, che ho chiamato (completamente non) "myload". Carica i file SQL in MySQL.

Here it is on GitHub

E 'semplice e diretto; consente di specificare parametri di connessione mysql e decomprimerà i file sql gzip al volo. Si presuppone che si disponga di un file per database e che la base del nome file sia il nome del database desiderato.

Quindi:

myload foo.sql bar.sql.gz 

creerà (se non esiste) i database chiamato "foo" e "bar", e importare il file SQL in ciascuna.

Per l'altro lato del processo, ho scritto this script (mydumpall) che crea i corrispondenti file sql (o sql.gz) per ogni database (o qualche sottoinsieme specificato per nome o regex).

7

C'è superba piccolo script in http://kedar.nitty-witty.com/blog/mydumpsplitter-extract-tables-from-mysql-dump-shell-script che avrà un file mysqldump enorme e dividerlo in un unico file per ogni tabella. Quindi è possibile eseguire questo script molto semplice per caricare il database da tali file:

for i in *.sql 
do 
    echo "file=$i" 
    mysql -u admin_privileged_user --password=whatever your_database_here < $i 
done 

mydumpsplitter funziona anche sui file .gz, ma è molto, molto più lento di decomprimere prima, poi eseguirlo sul file non compresso.

Dico enorme, ma credo che tutto sia relativo. Ci sono voluti circa 6-8 minuti per dividere un file di dump di 2000 tavoli e 200 MB per me.