restaurar - recuperar tabla borrada mysql
¿Puedo restaurar una sola tabla desde un archivo mysql mysqldump completo? (19)
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.
Apoyo
$ mysqldump -A | gzip > mysqldump-A.gz
Restaurar una sola tabla
$ mysql -e "truncate TABLE_NAME" DB_NAME $ zgrep ^"INSERT INTO /`TABLE_NAME" mysqldump-A.gz | mysql DB_NAME
¿No sería mucho más fácil crear una base de datos de prueba, restaurar toda la base de datos, luego volcar la tabla única en un archivo y luego restaurar los datos a su base de datos de "producción"?
De una forma u otra, cualquier proceso que lo haga tendrá que pasar por todo el texto del volcado y analizarlo de alguna manera. Me gustaría grep para
INSERT INTO `the_table_i_want`
y pipe la salida en mysql. Eche un vistazo a la primera tabla en el vertedero anterior, para asegurarse de que está obteniendo los INSERT de la manera correcta.
Editar: OK, tengo el formato correcto esta vez.
Deberías probar el comando @bryn pero con el delimitador `de lo contrario también extraerás las tablas que tienen un prefijo o un 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
Esta herramienta puede ser lo que quieras: 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 base de datos:
tbdba-restore-mysqldump.pl -t yourtable -s yourdb -f backup.sql
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
Restaure el volcado completo en la base de datos temporal:
mysql -u root -p restore <fulldump.sql
Vuelca la tabla que deseas recuperar:
mysqldump restore mytable> mytable.sql
Importe la tabla en otra base de datos:
mysql -u root -p database <mytable.sql
Esto también puede ser útil.
# 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''
Intenté algunas opciones, que fueron increíblemente lentas. Esto dividió un volcado de 360 GB en sus tablas en pocos minutos:
¿Cómo se divide la salida de mysqldump en archivos más pequeños?
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 hacer eso 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 escupí solo la tabla que quería.
Luego importé esa tabla en la base de datos principal.
Fue tedioso pero bastante fácil. Buena suerte.
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 grande, no desea verificarla manualmente)
Verificaría la sintaxis exacta de la versión de volcado utilizada y tendré una búsqueda de patrón más restrictiva:
Evite ". *" Y use "^" para asegurarse de comenzar desde el principio de la línea. Y preferiría tomar el ''DROP'' inicial
En general, esto funciona mejor para mí:
sed -n -e ''/^DROP TABLE IF EXISTS /`mytable/`;/,/^UNLOCK TABLES;/p'' mysql.dump > mytable.dump
Los fragmentos de SQL están bloqueados con "Estructura de tabla para la tabla my_table
" y "Datos de volcado para la tabla my_table
".
Puede usar una línea de comando 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 "para tabla` "sql.txt
Lo siguiente será devuelto:
---------- SQL.TXT
[4384] - Estructura de tabla para la tabla my_table
[4500] - Datos de dumping para la tabla my_table
[4514] - Estructura de tabla para tabla some_other_table
... etc.
Eso te da los números de línea que necesitas ... ahora, si supiera cómo usarlos ... investigando.
Obtenga un editor de texto decente como Notepad ++ o Vim (si ya es hábil con él). Busque el nombre de la tabla y podrá resaltar solo los comandos CREAR, ALTERAR e INSERTAR para esa tabla. Puede ser más fácil navegar con el teclado que con el mouse. Y me aseguraría de que estés en una máquina con suficiente memoria RAM para que no tenga problemas para cargar todo el archivo a la 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 importarlo en MySQL.
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 enorme volcado:
$ 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.
A continuación, puede ajustar el archivo mytable.dump
que contiene la estructura de la tabla mytable
y los datos (una lista de INSERT
).
Puedes usar el editor vi. Tipo:
vi -o mysql.dump mytable.dump
para abrir tanto dump completo mysql.dump
y un nuevo archivo mytable.dump
. Encuentre la inserción adecuada en línea presionando /
y luego escriba una frase, por ejemplo: "insertar en` mitabla` ", luego copie esa línea usando yy
. Cambie al archivo siguiente con ctrl+w
luego down arrow key
, pegue la línea copiada con pp
. Finalmente guarde el nuevo archivo escribiendo :wq
y bastante editor vi por :q
.
Tenga en cuenta que si ha descargado los datos utilizando múltiples inserciones, puede copiar (eliminar) todos a la vez usando Nyy
donde N
es el número de líneas que se copiarán.
Lo he hecho con un archivo de 920 MB de tamaño.
Una forma posible de solucionar esto es restaurar a una base de datos temporal y volcar solo esa tabla de la base de datos temporal. Luego usa la nueva secuencia de comandos.
Una solución simple sería simplemente crear un volcado de 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
A continuación, impórtelo como de costumbre y solo importará la tabla objeto de dumping.
Usé una versión modificada del comando sed de uloBasEI. Incluye el comando DROP anterior y lee hasta que mysql termine de volcar los datos a su tabla (DESBLOQUEO). Trabajé para mí (re) importando wp_users a un grupo de sitios de Wordpress.
sed -n -e ''/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p'' mydump.sql > tabledump.sql
Ya en el 2008 tuve la necesidad de hacer esto también. Escribí un guión Perl que lo hará, y ahora es mi método de elección. También se resume cómo hacerlo en awk o cómo restaurarlo en otro lugar y extraerlo. 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
sed -n -e ''/-- Table structure for table `my_table_name`/,/UNLOCK TABLES/p'' database_file.sql > table_file.sql
Esta es una solución mejor que algunas de las anteriores porque no todos los volcados de SQL contienen una instrucción DROP TABLE
. Este funcionará con todo tipo de vertederos.