2012-03-27 13 views
6

Come si elimina l'output per una grande tabella all'interno di un mysqldump con molte tabelle al suo interno?Come si elimina una tabella da un mysqldump

Ho un dump di un database di 6 GB di grandi dimensioni, ma il 90% di esso è solo una tabella di registrazione "cache_entries", che non mi serve più nel mio backup.

Come posso rimuovere facilmente quel bit all'interno del dump, che descrive la grande tabella di registrazione?

ho trovato questo: http://gtowey.blogspot.de/2009/11/restore-single-table-from-mysqldump.html

Esempio:

grep -n 'Table structure' dump.sql 

e poi per esempio:

sed -n '40,61 p' dump.sql > t2.sql 

Ma come posso cambiare la situazione per le mie esigenze?

+0

Perché includere anche quella tabella nel dump iniziale? Sembra che l'API per mysqldump ti consenta di scaricare solo le tabelle che ti interessano di http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html – ControlAltDel

+0

Non ho fatto quel backup folle;) – rubo77

risposta

9

ho trovato questo script bash, che divide un dump di un database in un file separato per ogni tabella, usando csplit (che divide un file in sezioni determinate da linee di contesto):

#!/bin/bash 

#### 
# Split MySQL dump SQL file into one file per table 
# based on http://blog.tty.nl/2011/12/28/splitting-a-database-dump 
#### 

if [ $# -ne 1 ] ; then 
    echo "USAGE $0 DUMP_FILE" 
fi 

csplit -s -ftable $1 "/-- Table structure for table/" {*} 
mv table00 head 

for FILE in `ls -1 table*`; do 
     NAME=`head -n1 $FILE | cut -d$'\x60' -f2` 
     cat head $FILE > "$NAME.sql" 
done 

rm head table* 

Fonte: gist.github.com/1608062

e un po 'migliorata: How do I split the output from mysqldump into smaller files?

una volta, si dispone di file separati per ogni tabella, è possibile eliminare le tabelle indesiderate e incollare insieme, se necessario, con

cat table* >glued_sqldump.sql

0

è necessario trovare l'istruzione di creazione tabella della tabella e trovare la successiva istruzione di creazione tabella. dì che sono n1 e n2.

quindi puoi cancellarli con sed come sopra. sed 'n1, n2d' dump.sql> new.sql

puoi semplicemente creare tabella e annotare i numeri di riga per la tua elaborazione.

qui è una demo.

[email protected]:~$ grep -n [34] a.txt 
3:3 
4:4 
[email protected]:~$ cat a.txt 
1 
2 
3 
4 
5 
6 
[email protected]:~$ grep [34] a.txt 
3 
4 
[email protected]:~$ sed '3,4d' a.txt > b.txt 
[email protected]:~$ cat b.txt 
1 
2 
5 
6 
[email protected]:~$ 
10

È possibile utilizzare 'n, n d' per rimuovere determinate righe. Immagino che nel tuo caso tu voglia avere il tavolo in questione, ma non vuoi i dati?

Modifica il comando grep per includere "i dati di dumping per tavola":

 
grep -n 'Table structure\|Dumping data for table' dump.sql 
19:-- Table structure for table `t1` 
37:-- Dumping data for table `t1` 
47:-- Table structure for table `t2` 
66:-- Dumping data for table `t2` 
76:-- Table structure for table `t3` 
96:-- Dumping data for table `t3` 

Ora, se non si desidera che i dati per t2, è possibile utilizzare:

sed '66,75 d' dump.sql > cleandump.sql
Problemi correlati