¿Puedo restaurar una sola tabla desde un archivo mysqldump completo de mysql?


Tengo una copia de seguridad mysqldump de mi base de datos mysql que consta de todas nuestras tablas que es de aproximadamente 440 megas. Quiero restaurar el contenido de solo una de las tablas de mysqldump. Es esto posible? Teóricamente, podría cortar la sección que reconstruye la tabla que quiero, pero ni siquiera sé cómo editar efectivamente un documento de texto de ese tamaño.

Author: Mobius, 2009-06-18

19 answers

Puede intentar usar sed para extraer solo la tabla que desee.

Digamos que el nombre de su tabla es mytable y el archivo mysql.dump es el archivo que contiene tu enorme dump:

$ sed -n -e '/CREATE TABLE.*`mytable`/,/CREATE TABLE/p' mysql.dump > mytable.dump

Esto copiará en el archivo mytable.dump lo que se encuentra entre CREATE TABLE mytable y el siguiente CREATE TABLE correspondiente a la siguiente tabla.

Luego puede ajustar el archivo mytable.dump que contiene la estructura de la tabla mytable, y los datos (una lista de INSERT).

 229
Author: uloBasEI,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-10 09:55:09

Usé una versión modificada del comando sed de uloBasEI. Incluye el comando DROP anterior, y lee hasta que mysql termine de descargar datos a su tabla (DESBLOQUEO). Funcionó para mí (re)importar wp_users a un montón de sitios de Wordpress.

sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' mydump.sql > tabledump.sql
 92
Author: bryn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-10 09:55:33

¿Esto se puede hacer más fácilmente? Así es como lo hice:

Crear una base de datos temporal (por ejemplo, restaurar):

Mysqladmin-u root-p create restore

Restaurar el volcado completo en la base de datos temp:

Mysql-u root-p restore

Volcar la tabla que desea recuperar:

Mysqldump restore mytable > mytable . sql

Importe la tabla en otra base de datos:

Mysql-u root-p database

 40
Author: Martijn Kools,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-25 12:58:25

Una solución simple sería simplemente crear un volcado de solo la tabla que desea restaurar por separado. Puede usar el comando mysqldump para hacerlo con la siguiente sintaxis:

mysqldump -u [user] -p[password] [database] [table] > [output_file_name].sql

Luego impórtalo como normal, y solo importará la tabla objeto de dumping.

 12
Author: Brom558,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-08 09:34:24

De una manera u otra, cualquier proceso que haga eso tendrá que pasar por todo el texto del volcado y analizarlo de alguna manera. Yo sólo grep para

INSERT INTO `the_table_i_want`

Y canalizar la salida a mysql. Echa un vistazo a la primera tabla en el vertedero antes, para asegurarse de que está recibiendo el INSERTO de la manera correcta.

Editar: OK, tengo el formato correcto esta vez.

 8
Author: JCCyC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-18 16:57:00

Deberías probar el comando @ bryn pero con el delimitador de lo contrario también extraerás las tablas con un prefijo o sufijo, esto es lo que suelo hacer:

sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' dump.sql > mytable.sql

También para fines de prueba, es posible que desee cambiar el nombre de la tabla antes de importar:

sed -n -e 's/`mytable`/`mytable_restored`/g' mytable.sql > mytable_restored.sql

Para importar puede usar el comando mysql:

mysql -u root -p'password' mydatabase < mytable_restore.sql
 7
Author: Maxime Biette,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-18 12:40:00
  1. Copia de seguridad

    $ mysqldump -A | gzip > mysqldump-A.gz
    
  2. Restaurar tabla única

    $ mysql -e "truncate TABLE_NAME" DB_NAME
    $ zgrep ^"INSERT INTO \`TABLE_NAME" mysqldump-A.gz | mysql DB_NAME
    
 5
Author: y.tk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-23 11:10:33

Una forma posible de lidiar con esto es restaurar a una base de datos temporal, y volcar solo esa tabla de la base de datos temporal. A continuación, utilice el nuevo script.

 4
Author: Tim Hoolihan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-18 16:57:48

Esta herramienta puede ser lo que quieres: tbdba-restore-mysqldump.pl

Https://github.com/orczhou/dba-tool/blob/master/tbdba-restore-mysqldump.pl

Por ejemplo, Restaurar una tabla desde el archivo de volcado de la base de datos:

Tbdba-restore-mysqldump.pl -t su mesa-s su copia de seguridad db-f.sql

 3
Author: user1097790,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-14 12:41:20

Esto también puede ayudar.

# mysqldump -u root -p database0 > /tmp/database0.sql
# mysql -u root -p -e 'create database database0_bkp'
# mysql -u root -p database0_bkp < /tmp/database0.sql
# mysql -u root -p database0 -e 'insert into database0.table_you_want select * from database0_bkp.table_you_want'
 2
Author: pjl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-02 14:45:26

La mayoría de los editores de texto modernos deberían ser capaces de manejar un archivo de texto de ese tamaño, si su sistema está a la altura.

De todos modos, tuve que hacerlo una vez muy rápido y no tuve tiempo de encontrar ninguna herramienta. Configuré una nueva instancia de MySQL, importé toda la copia de seguridad y luego escupí solo la tabla que quería.

Luego importé esa tabla a la base de datos principal.

Era tedioso pero bastante fácil. Buena suerte.

 1
Author: Bryan Migliorisi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-18 16:58:53

Puede usar el editor vi. Tipo:

vi -o mysql.dump mytable.dump

Para abrir todo el volcado mysql.dump y un nuevo archivo mytable.dump. Encuentre la inserción apropiada en la línea presionando / y luego escriba una frase, por ejemplo: "insertar en `mytable`", luego copie esa línea usando yy. Cambie al siguiente archivo por ctrl+w luego down arrow key, pegue la línea copiada con pp. Finalmente guarde el nuevo archivo escribiendo :wq y bastante vi editor por :q.

Tenga en cuenta que si ha volcado los datos utilizando múltiples inserciones, puede copiar (yank) todos ellos a la vez usando Nyy en el que N es el número de líneas a copiar.

Lo he hecho con un archivo de 920 MB de tamaño.

 1
Author: mtoloo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-02 07:28:34
sed -n -e '/-- Table structure for table `my_table_name`/,/UNLOCK TABLES/p' database_file.sql > table_file.sql

Esta es una mejor solución que algunas de las anteriores porque no todos los volcados SQL contienen una instrucción DROP TABLE. Este funcionará con todo tipo de vertederos.

 1
Author: Weston Ganger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-12 16:59:22

Consigue un editor de texto decente como Notepad++ o Vim (si ya eres competente con él). Busque el nombre de la tabla y debería poder resaltar solo los comandos CREAR, ALTERAR e INSERTAR para esa tabla. Puede ser más fácil navegar con el teclado en lugar de un ratón. Y me aseguraría de que estás en una máquina con mucho o RAM para que no tenga un problema al cargar todo el archivo a la vez. Una vez que haya resaltado y copiado las filas que necesita, sería una buena idea: haga una copia de seguridad de solo la parte copiada en su propio archivo de copia de seguridad y luego impórtelo en MySQL.

 0
Author: Cameron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-18 17:04:42

Los trozos de SQL se bloquean con "Estructura de tabla para la tabla my_table" y "Volcado de datos para la tabla my_table."

Puede usar una línea de comandos de Windows de la siguiente manera para obtener los números de línea para las diversas secciones. Ajuste la cadena buscada según sea necesario.

Find / n" for table ` " sql.txt

Se devolverá lo siguiente:

---------- SQL.TXT

[4384] structure Estructura de la tabla para la tabla my_table

[4500] Dumping Datos de dumping para el cuadro my_table

[4514]-- Estructura del cuadro some_other_table

... sucesivamente.

Eso te da los números de línea que necesitas... ahora, si supiera cómo usarlos... investigar.

 0
Author: Kuyenda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-18 18:24:02

En el '08 tuve la necesidad de hacer esto también. Escribí un guión de Perl que lo hará, y ahora es mi método de elección. También resumió cómo hacerlo en awk o cómo restaurar en otro lugar y extraer. Recientemente agregué este método sed a la lista también. Puede encontrar el script y los otros métodos aquí: http://blog.tsheets.com/2008/tips-tricks/extract-a-single-table-from-a-mysqldump-file.html

 0
Author: JaredC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-09 16:11:50

Probé algunas opciones, que eran increíblemente lentas. Esto dividió un volcado de 360 GB en sus tablas en unos minutos:

¿Cómo divido la salida de mysqldump en archivos más pequeños?

 0
Author: Kohjah Breese,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:18:23

Las soluciones ' sed ' mencionadas anteriormente son agradables, pero como se mencionó no 100% seguro

  • Puede tener comandos INSERT con datos que contengan: ... CREAR TABLA...(lo)...mytable...

  • O incluso la cadena exacta "CREATE TABLE' mytable`;" si está almacenando comandos DML, por ejemplo!

(y si la tabla es enorme no quieres comprobarlo manualmente)

Verificaría la sintaxis exacta de la versión de volcado utilizada, y tendría un más búsqueda de patrones restrictivos:

Evitar ".* "y use" ^ " para asegurarse de que comenzamos al principio de la línea. Y preferiría agarrar la 'CAÍDA' inicial

En general, esto funciona mejor para mí:

sed -n -e '/^DROP TABLE IF EXISTS \`mytable\`;/,/^UNLOCK TABLES;/p' mysql.dump > mytable.dump
 0
Author: phil_w,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-17 12:24:04

La tabla debe presentarse con la misma estructura tanto en el volcado como en la base de datos.

`zgrep -a ^"INSERT INTO \`table_name" DbDump-backup.sql.tar.gz | mysql -u<user> -p<password> database_name`

O

`zgrep -a ^"INSERT INTO \`table_name" DbDump-backup.sql | mysql -u<user> -p<password> database_name`
 0
Author: Neminath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-21 10:11:12