¿Hay alguna manera de recuperar una base de datos mysql descartada?

8

Accidentalmente dejé caer una base de datos MySQL en mi servidor. ¿Hay alguna forma de recuperar una base de datos descartada?

kewl
fuente
¿En qué plataforma se está ejecutando su base de datos MySQL?
Jack dice que intente topanswers.xyz
¿Hay alguna posibilidad de que se esté haciendo una copia de seguridad del disco en el que se encuentra su base de datos y el administrador del servidor puede salvarlo?
Kenneth Fisher
Hay una variedad de herramientas en el mercado para reparar bases de datos MySQL corruptas, pero para obtener los mejores y probados resultados, siempre puede confiar en las herramientas Stellar para reparar su base de datos. La herramienta puede reparar tablas InnoDB y MyISAM de la base de datos MySQL. También puede obtener una vista previa de los objetos reparados de la base de datos que le ayudarán a obtener una visión general de los datos que se están recuperando. La versión demo de prueba del software está disponible de forma gratuita para reparar la base de datos con total integridad y formato original, asegurando que no haya pérdida de datos.
Mitchel, el

Respuestas:

16

Si actúa rápido, hay muchas posibilidades de recuperar su base de datos. La posibilidad es mayor para InnoDB, para MyISAM no es cero, pero está cerca.

El problema es cuando MySQL ejecuta DROP TABLE o DROP DATABASE (que es esencialmente lo mismo) InnoDB no borra los datos. Las páginas con los datos todavía están en el disco.

Dependiendo de la configuración de innodb_file_per_table, el proceso de recuperación varía. Si innodb_file_per_table está desactivado (predeterminado hasta 5.5), la tabla descartada permanece en ibdata1. Si innodb_file_per_table está activado (predeterminado a partir de 5.5), la tabla descartada estaba en el archivo .ibd respectivo. MySQL elimina este archivo cuando suelta la tabla.

Lo primero que debe hacer es detener cualquier posible escritura para que su tabla no se sobrescriba. Si innodb_file_per_table está desactivado, es suficiente para detener MySQL (kill -9 es incluso mejor, pero asegúrese de matar safe_mysqld primero). Si innodb_file_per_table está activado, desmonte la partición donde MySQL almacena sus datos. Si el datadir está en la partición raíz, recomiendo cerrar el servidor o al menos tomar una imagen del disco. Permítanme repetir, el objetivo es evitar sobrescribir la tabla caída por MySQL o el sistema operativo.

Existe una herramienta que permite trabajar con páginas InnoDB a bajo nivel, el kit de herramientas de recuperación de datos TwinDB . Lo usaré para ilustrar la recuperación de la caída.

Debe tomar los medios con la tabla caída (ya sea ibdata1 o imagen de disco) y buscar páginas de InnoDB en él. La herramienta stream_parser del kit de herramientas lo hace.

./stream_parser -f /path/to/disk/image

Escaneará el archivo, buscará las páginas de InnoDB y las ordenará por tipo e index_id. index_id es un identificador que InnoDB usa para referirse a un índice. Una tabla se almacena en el índice PRIMARIO. Para encontrar qué index_id es su tabla descartada, necesita recuperar el diccionario InnoDB .

El diccionario InnoDB se almacena en el archivo ibdat1. Necesita escanear el archivo ibdata1 de la misma manera que arriba:

./stream_parser -f /var/lib/mysql/ibdata1

Ahora necesita obtener registros de las tablas del diccionario InnoDB SYS_TABLES y SYS_INDEXES (supongamos que su tabla es sakila.actor):

./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000001.page -t dictionary/SYS_TABLES.sql | grep sakila/actor
000000000B28  2A000001430D4D  SYS_TABLES  "sakila/actor"  158  4  1 0   0   ""  0

158 es table_id, recuérdalo.

./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000003.page -t dictionary/SYS_INDEXES.sql | grep 158
000000000B28    2A000001430BCA  SYS_INDEXES     158     376     "PRIMARY"       1       3       0       4294967295
000000000B28    2A000001430C3C  SYS_INDEXES     158     377     "idx\_actor\_last\_name"        1       0       0       4294967295

Entonces, index_id de su tabla descartada (sakila.actor) es 376.

Ahora puede obtener registros de la tabla eliminada de InnoDB index_id 376. Debe tener la estructura de la tabla eliminada, exactamente la instrucción CREATE TABLE con la que se creó la tabla. ¿Dónde puedes conseguirlo? Ya sea de una copia de seguridad anterior o de otra parte. También es posible recuperar la estructura del diccionario InnoDB, pero no lo cubriré en esta respuesta. Asumamos que lo tienes.

./c_parser -6f pages-ibdata1/FIL_PAGE_INDEX/0000000000000376.page -t actor.sql > dump.tsv 2> load_cmd.sql

c_parser genera registros como volcado separado por tabulaciones en stdout. El volcado se puede cargar con el comando LOAD DATA. c_parser lo imprime en stderr.

Ver más detalles en publicaciones:

akuzminsky
fuente
¿sigue siendo recuperable si después de que se caiga la tabla, creo una nueva tabla e inserto nuevos registros?
Oki Erie Rinaldi
En este caso, pierde index_id porque CREATE sobrescribe el valor original. Necesitas encontrarlo de alguna manera. Por lo general, grep cadenas conocidas. Los siguientes INSERT pueden o no sobrescribir los datos. Si no, es recuperable. Tienes que intentarlo, no hay forma de saberlo de antemano
akuzminsky
Este enlace da un 404 !!
Nunca más
@akuzminsky Lo hice hasta la parte "dictionary / SYS_INDEXES.sql | grep 158". Y me da algo de index_id para mi tabla, pero dice que no hay un archivo de página con mi index_id. ej .: 0000000000000376.page (cuando ejecuto este c_parser -6f)
Sampath Sri Anuradha
@SampathSriAnuradha debe sentirse mal cuando Fortune no está de tu lado. Lo siento.
akuzminsky
11

No hay una manera fácil de decírtelo. No importa si dejó caer una base de datos a través de phpmyadmin o la línea de comandos. Se fue.

El error humano es una razón para tener un buen régimen de respaldo.

No soy religioso, pero rezaré con la esperanza de que no sea nada demasiado importante.

atxdba
fuente
fue muy importante, un montón de transacciones se perderán
kewl
8
Lo mejor que puedo recomendar en ese caso es desmontar el sistema de archivos en el que estaba su datadir. Apague el servidor si es necesario para hacerlo. Llame a un servicio de recuperación de datos y prepárese para pagar miles, si no decenas, todo mientras paga una sesión de basura sin garauntees: - \
atxdba
3
Si alguien en una situación similar lee esto en el futuro, creo que también vale la pena sugerir que es importante desmontar el sistema de archivos o de solo lectura lo antes posible si va a contratar una empresa de recuperación de datos. Mientras más tiempo continúe la escritura en el sistema de archivos, es más probable que los grupos que contienen sus archivos eliminados se sobrescriban.
James L
2

Depende de tu configuración. Es posible restaurar si configura su sistema correctamente. Si tiene una copia de seguridad, puede restaurarla. y luego aplique los registros binarios hasta el punto justo antes de soltar la tabla.

http://dev.mysql.com/doc/refman/5.5/en/mysqlbinlog.html

Le sugiero que haga esto en otro servidor, una vez que haya restaurado la tabla, puede usar mysqldump para extraerla e importarla nuevamente a su servidor de producción. Esto no será una restauración rápida, pero puede recuperar los datos.

Si no sabe lo que está haciendo, sugeriría abrir un contrato de soporte con una de las empresas de consultoría mysql (pythian, percona, palamino son probablemente las mejores) y que lo ayuden con esto.

te deseo la mejor de las suertes

Allen Kinnard
fuente