2010-10-14 11 views

risposta

0

Non conosco nessuno strumento per analizzare file di dump mySQL non elaborati in questo modo.

O copiare e incollarlo (potenzialmente ingombrante) o importarlo in un database temporaneo, eliminare tutto il resto e riversare la tabella in un file.

+2

Non ci sarebbe motivo di abbandonare tutto il resto, è possibile mysqldump tabelle singole – stew

+0

@stew buon punto. @OP ecco come: http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html # option_mysqldump_tables –

0

Se il dump è stato fatto con la sintassi inserto estesa, quindi i dati della tabella effettivi sarà fatto come una singola riga all'interno del file di dump:

INSERT INTO tablename (field, ...) VALUES (data, ...), (data, ...), (etc..) 

che si potrebbe semplicemente grep fuori. Estrarre la definizione della tabella effettiva sarà più difficile, sebbene DOVREBBE essere immediatamente sopra la linea di dati. Non hanno accesso a una vera e propria shell in questo momento, ma andando fuori dalla parte superiore della mia testa, qualcosa come questo potrebbe fare il trucco (in pseudo-codice):

# retrieve line # that data insertion for the wanted table occurs on 
DATALINE=`grep -l 'INSERT INTO tablename' dumpfile.sql` 

# limiting ourselves to the part of the file up to the data line, find the line number 
# of the last CREATE TABLE, which SHOULD be the one creating the table for the data 
CREATELINE=`head -$DATALINE|grep -l 'CREATE TABLE'|tail -1|awk '{"print $1"}'` 

La si può estrarre la creazione DDL con giudizioso testa/coda e i numeri di riga che abbiamo appena recuperato:

CREATE=`head -$CREATELINE dumpfile.sql|tail -$($CREATELINE - $DATALINE - 1)` 

tenere a mente che sto andando fuori dalla parte superiore della mia testa su questo, quindi è quasi garantito di non lavorare, ma dovrebbe essere sufficiente per iniziare.

17

ho trovato this nice solution, è necessario scaricare this script sul server e digitare

$> ./MyDumpSplitter.sh yourfile.sql your_table_name 

Questo estrarrà il vostro tavolo in your_table_name.sql


Optionnal

Ora puoi rinominarlo usando questo tipo di comando

$> sed -i 's/`your_table_name`/`your_table_name2`/g' your_table_name.sql 

e re-iniezione con

mysql> source your_table_name.sql; 
+1

Attenzione: con l'estrazione di una singola tabella da un dump completo, le "SET statements" all'inizio di un dump vengono perse, ad esempio: SET NAMES utf8; - così potresti importare una tabella utf8 e ottenere dati codificati perché il client usa una codifica errata! lo stesso problema con tutte le altre soluzioni .... – michabbb

+0

Questo è corretto, grazie per questa informazione –

2

mi sono imbattuto in questo problema qualche tempo fa e ho scritto uno script Perl. Ha funzionato bene, ma era una versione precedente di MySQL. Chiamatela come:
extract.pl -table=TABLENAME mysqldumpfile.sql > recovered_table.sql

 
#!/usr/bin/perl -s -wnl 
#extract a single table from a mysql dump 
BEGIN { 
    $table or warn 
    "Usage: $0 -table=TABLE_TO_EXTRACT mysqldumpfile.sql" 
    and exit 1; 
} 

/^DROP TABLE IF EXISTS `$table`/ .. /^UNLOCK TABLES;$/ and print; 
2

semplicemente è possibile eseguire editor di flusso per il filtraggio e il comando di testo trasformando come di seguito:

 
$ sed -n -e '/CREATE TABLE.*products/,/CREATE TABLE/p' mysql.sql > products.sql 
0

Se si desidera estrarre un database è possibile utilizzare:

sed -n '/^-- Current Database: `dbname`/,/^-- Current Database: `/p' dumpfile > dbname.sql 2>error 

Esempio:

sed -n '/^-- Current Database: `blogs`/,/^-- Current Database: `/p' dump.sql > blogs.sql 2>error 
Problemi correlati