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 del mysqldump. es 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.
194
Respuestas:
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 su gran volcado:Esto copiará en el archivo
mytable.dump
lo que se encuentra entreCREATE TABLE mytable
y el siguienteCREATE TABLE
correspondiente a la siguiente tabla.Luego puede ajustar el archivo
mytable.dump
que contiene la estructura de la tablamytable
y los datos (una lista deINSERT
).fuente
Table structure for table
comentario, en lugar de hacerlo por CREATE TABLE. Esto garantizará que la siguiente tabla no se descarte si se olvida eliminar su instrucción DROP TABLE y permite la canalización para la restauración de la tabla con un solo comando (gzip | sed | mysql). Sin embargo, esta solución depende de la sintaxis de comentarios mysqldump (no sé qué tan estándar es).Usé una versión modificada del comando sed de uloBasEI. Incluye el comando DROP anterior y se lee hasta que mysql termina de volcar datos en su tabla (UNLOCK). Trabajó para mí (re) importar wp_users a un montón de sitios de Wordpress.
fuente
`mytable`
para evitar que coincidan las tablas,mytable2
etc., como era mi caso.sed
no debe interferir con la codificación ...DROP TABLE
(mi volcado de MySQL no tenía esto) pueden querer usar:sed -n -e '/-- Table structure for table ``<Table Name>/,/UNLOCK TABLES/p' <SQL File> > table.sql
Esto hace uso de los comentarios de la tabla proporcionados antes de cada tabla en un volcado de MySQl, y garantiza que/*!40101 SET @saved_cs_client = @@character_set_client */;
se incluyan líneas como .Esto se puede hacer más fácilmente? Así es como lo hice:
Cree una base de datos temporal (por ejemplo, restaurar):
Restaurar el volcado completo en la base de datos temporal:
Volcar la tabla que desea recuperar:
Importe la tabla en otra base de datos:
fuente
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:
Luego, impórtelo de manera normal, y solo importará la tabla volcada.
fuente
De una forma u otra, cualquier proceso que haga eso tendrá que pasar por todo el texto del volcado y analizarlo de alguna manera. Me encantaría
y canalizar la salida en mysql. Eche un vistazo a la primera tabla en el basurero antes, para asegurarse de obtener los INSERTOS de la manera correcta.
Editar: OK, obtuve el formato correcto esta vez.
fuente
Deberías probar el comando @bryn pero con el delimitador `de lo contrario también extraerás las tablas que tienen un prefijo o sufijo, esto es lo que suelo hacer:
También para fines de prueba, es posible que desee cambiar el nombre de la tabla antes de importar:
Para importar, puede usar el comando mysql:
fuente
Apoyo
Restaurar tabla individual
fuente
Una posible forma de lidiar con esto es restaurar una base de datos temporal y volcar solo esa tabla de la base de datos temporal. Luego usa el nuevo script.
fuente
Esta herramienta puede ser lo que desea: tbdba-restore-mysqldump.pl
https://github.com/orczhou/dba-tool/blob/master/tbdba-restore-mysqldump.pl
Por ejemplo, restaurar una tabla del archivo de volcado de la base de datos:
fuente
Esta es una mejor solución que algunas de las anteriores porque no todos los volcados de SQL contienen una
DROP TABLE
declaración. Este funcionará con todo tipo de vertederos.fuente
Esto también puede ayudar.
fuente
La tabla debe presentarse con la misma estructura tanto en el volcado como en la base de datos.
o
fuente
La mayoría de los editores de texto modernos deberían poder 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.
Fue tedioso pero bastante fácil. Buena suerte.
fuente
Puedes usar el editor vi. Tipo:
para abrir tanto el volcado completo
mysql.dump
como un nuevo archivomytable.dump
. Busque la inserción apropiada en la línea presionando/
y luego escriba una frase, por ejemplo: "insertar en` mytable` ", luego copie esa línea usandoyy
. Cambie al siguiente archivo paractrl+w
entoncesdown arrow key
, pegue la línea copiada conpp
. Finalmente guarde el nuevo archivo escribiendo:wq
y bastante editor vi por:q
.Tenga en cuenta que si ha volcado los datos usando múltiples inserciones, puede copiarlos (tirarlos) todos a la vez usando
Nyy
cuálN
es el número de líneas que se copiarán.Lo hice con un archivo de 920 MB de tamaño.
fuente
Obtenga un editor de texto decente como Notepad ++ o Vim (si ya es competente con él). Busque el nombre de la tabla y debería poder resaltar solo los comandos CREATE, ALTER e INSERT para esa tabla. Puede ser más fácil navegar con el teclado que con el mouse. Y me aseguraría de que esté en una máquina con mucha RAM o RAM para que no tenga problemas para cargar todo el archivo de una vez. Una vez que haya resaltado y copiado las filas que necesita, sería una buena idea hacer una copia de seguridad de la parte copiada en su propio archivo de copia de seguridad y luego importarla a MySQL.
fuente
Los fragmentos de SQL se bloquean con "Estructura de tabla para tabla
my_table
" y "Volcado de datos para tablamy_table
".Puede usar una línea de comandos de Windows de la siguiente manera para obtener los números de línea para las diferentes secciones. Ajuste la cadena buscada según sea necesario.
find / n "para la tabla` "sql.txt
Se devolverá lo siguiente:
---------- SQL.TXT
[4384] - Estructura de mesa para mesa
my_table
[4500] - Volcado de datos para tabla
my_table
[4514] - Estructura de mesa para mesa
some_other_table
... etc.
Eso te da los números de línea que necesitas ... ahora, si supiera cómo usarlos ... investigando.
fuente
En el '08 tuve la necesidad de hacer esto también. Escribí un script 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
fuente
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?
fuente
Las soluciones 'sed' mencionadas anteriormente son agradables pero, como se mencionó, no son 100% seguras
Puede tener comandos INSERT con datos que contengan: ... CREATE TABLE ... (lo que sea) ... mytable ...
o incluso la cadena exacta "CREATE TABLE` mytable`; " si está almacenando comandos DML por ejemplo!
(y si la tabla es enorme, no querrá verificarlo manualmente)
Verificaría la sintaxis exacta de la versión de volcado utilizada y tendría una búsqueda de patrones más restrictiva:
Evite ". *" Y use "^" para asegurarse de que comencemos al comienzo de la línea. Y preferiría tomar el 'DROP' inicial
En general, esto funciona mejor para mí:
fuente