2009-11-19 15 views
29

mio database dispone di 3 tabelle: table1, Table2 e table3intera struttura, ma solo i dati mysqldump da tabelle selezionate in un unico comando

Mi piacerebbe fare un mysqldump su questo database con le seguenti condizioni:

  • struttura Dump per tutte le tabelle
  • discarica solo i dati di tabella 1 e table2, ignorare i dati in Tabella 3

Attualmente, lo faccio con 2 affermazioni mysqldump

mysqldump -u user -p -d db > db_structure.sql 
mysqldump -u user -p db --ignore-table=db.table3 > table1_and_table2_data.sql 

importarli nello stesso ordine in cui sono state oggetto di dumping (struttura, quindi i dati da table1 e table2)

Esiste un modo per combinare questo in un unico comando mysqldump?

+0

ho avuto la stessa domanda! Hai trovato un modo per farlo? –

risposta

37

Non è possibile combinarli in un unico comando, ma è possibile eseguire entrambi i comandi contemporaneamente ed eseguire lo stesso file.

mysqldump -u user -p --no-data db > structure.sql; mysqldump -u user -p db table1 table2 >> structure.sql 

per evitare di dover inserire la password due volte si può fare -ppassword (notare la mancanza di spazio!). Utilizzare anche --no-data nel primo comando o si finisce con i dati pure. -d non è necessario quando stai facendo un solo database.

+0

Grazie per questa risposta!Tuttavia mi stavo chiedendo se al giorno d'oggi è ancora impossibile farlo in un modo più elegante. –

+0

@ EmilioNicolás Non che io sappia – Cfreak

0

Non penso che tu possa farlo in un unico comando. Ma puoi sicuramente unire l'output a un file. Perché non avvolgerlo in qualche script di shell che non seguente:

mysqldump -u $1 -p$2 -d db > dump.sql && mysqldump -u $1 -p$2 db --ignore-table=db.table3 >> dump.sql 

potrete eseguire questo script con due parametri: username e password.

6

Dato che si potrebbe voler reindirizzare l'output a un altro comando, come invece ho fatto, invece di reindirizzare a un file e accodarlo a quel file nel comando successivo, si potrebbe provare (modificato dall'esempio di stask):

(mysqldump -u $1 -p$2 -d db && mysqldump -u $1 -p$2 db --ignore-table=db.table3) |\ 
your_command 

... nel mio caso:

(mysqldump -u $1 -p$2 -d db && mysqldump -u $1 -p$2 db --ignore-table=db.table3) |\ 
gzip -9 > filename.sql.gz 

Racchiudere i due mysqldump comandi tra parentesi crea una subshell la cui uscita abbiamo tubo nel gzip e quindi reindirizzare che in un file.

PS: Tuttavia, non sono stato in grado di combinarlo in una sola chiamata mysqldump.

0

In realtà è piuttosto semplice, utilizzare le clausole --where sulle tabelle in cui non si desiderano dati e dargli una condizione sempre falsa. Per esempio, i dati di carico su foo e gah e solo lo schema sulla barra:

mysqldump -u ... -p... myDatabase foo bar --where='1=2' gah > myfile.sql 

Quindi sì, si può fare questo su una sola riga.

0

È possibile rimuovere la parte INSERT INTO ...:

mysqldump \ 
    --opt \ 
    -u ${DB_USER} -p${DB_PASS} \ 
    ${DB_NAME} \ 
    | grep -v 'INSERT INTO `table3`' \ 
    | grep -v 'INSERT INTO `table4`' 
Problemi correlati