2010-10-14 22 views

Respuesta

0

No conozco ninguna herramienta para analizar archivos de volcado mySQL brutos de esta manera.

Copie o pegue (potencialmente engorroso) o impórtelo a una base de datos temporal, elimine todo lo demás y vuelva a colocar la tabla en un archivo.

+2

No habría ninguna razón para dejar todo lo demás, puede mysqldump tablas individuales – stew

+0

@stew buen punto. @OP así es cómo: http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html # option_mysqldump_tables –

0

Si el vertedero se hizo con la sintaxis extendida de inserción, a continuación, los datos reales de la tabla se llevará a cabo como una sola línea en el archivo de volcado:

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

que podría simplemente grep a cabo. Extraer la definición real de la tabla será más difícil, aunque DEBERÍA estar inmediatamente encima de la línea de datos. No tienen acceso a una concha adecuada en el momento, pero salirse de la parte superior de mi cabeza, algo como esto puede hacer el truco (en pseudo-código):

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

El puede extraer la creación DDL con juiciosa los números de línea de cabeza/cola y que sólo recuperarán:

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

tener en cuenta que voy de la parte superior de mi cabeza en esto, así que es casi seguro que no funciona, pero debería ser suficiente para comienza.

17

He encontrado this nice solution, usted tiene que descargar this script en su servidor y escriba

$> ./MyDumpSplitter.sh yourfile.sql your_table_name 

Esto extraerá su mesa en your_table_name.sql


Optionnal

Ahora puede cambiarle el nombre usando este tipo de comando

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

y re-inyección con

mysql> source your_table_name.sql; 
+1

tenga cuidado: con la extracción de una sola tabla de un volcado completo, las 'sentencias SET' al comienzo de un volcado se pierden, por ejemplo: SET NAMES utf8; - por lo que puede importar una tabla utf8 y obtener datos codificados porque el cliente usa una codificación incorrecta. mismo problema con todas las demás soluciones .... – michabbb

+0

Eso es correcto, gracias por esta información –

2

me encontré con ese problema hace un tiempo y escribió un script Perl. Funcionó bien, pero era una versión anterior de MySQL. Llamar así:
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

simplemente se puede ejecutar editor de flujo para el filtrado y la transformación de comando de texto, como a continuación:

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

Si desea extraer una base de datos que podría utilizar:

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

Por ejemplo:

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