2010-10-14 25 views

Antwort

0

Ich kenne kein Tool zum Parsen von rohen mySQL-Dump-Dateien auf diese Weise.

Entweder kopieren + einfügen (möglicherweise umständlich) oder in eine temporäre Datenbank importieren, alles andere löschen und die Tabelle in eine Datei zurückschreiben.

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

, die Sie grep konnten einfach:

+2

Es gäbe keinen Grund, alles andere fallen zu lassen, können Sie einzelne Tabellen mysqldump – stew

+0

@ stew guten Punkt. @OP hier ist wie: http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html # option_mysqldump_tables –

0

Wenn der Dump mit der erweiterten Einsatz Syntax durchgeführt wurde, dann die eigentlichen Tabellendaten werden als eine einzige Zeile in der Dump-Datei erfolgen. Das Extrahieren der eigentlichen Tabellendefinition wird schwieriger, obwohl es unmittelbar über der Datenlinie sein sollte. Sie haben keinen Zugriff auf eine richtige Schale im Moment, aber die Spitze von meinem Kopf abgehend, so etwas wie dies könnte den Trick tun (in Pseudocode):

# 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"}'` 

Die Sie die Erstellung DDL extrahieren mit klugen Kopf/Schwanz und den Zeilennummern wir gerade abgerufen:

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

bedenken sie, dass ich die Spitze meines Kopfes auf diesem gehe weg, so ist es fast garantiert nicht, aber sollte genug sein, fang an.

17

Ich fand this nice solution, müssen Sie this script auf Ihrem Server herunterladen und Sie

$> ./MyDumpSplitter.sh yourfile.sql your_table_name 

Dies extrahiert Tisch in your_table_name.sql


Optionnal

Jetzt geben kann es umbenennen mit dieser Art von Befehl

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

Und Wieder Injektion mit

mysql> source your_table_name.sql; 
+1

Vorsicht: Beim Extrahieren einer einzelnen Tabelle aus einem vollständigen Dump gehen die 'SET-Anweisungen' am Anfang eines Dump verloren, zum Beispiel: SET NAMES utf8; - Sie könnten also eine utf8-Tabelle importieren und verschlüsselte Daten erhalten, weil der Client eine falsche Codierung verwendet! Das gleiche Problem mit allen anderen Lösungen .... – michabbb

+0

Das ist richtig, danke für diese Information –

2

ich vor einer Weile in dieses Problem lief und schrieb ein Perl-Skript. Es funktionierte gut, aber es war eine ältere Version von MySQL. Nennen Sie es mögen:
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

einfach können Sie Stream-Editor für Filterung und Umwandlung von Text Befehl wie unten ausgeführt:

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

Wenn Sie eine Datenbank extrahieren möchten Sie nutzen könnten:

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

Zum Beispiel:

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