Recupere la base de datos MySQL de la carpeta de datos sin ibdata1 de los archivos ibd

15

Mi directorio WAMP fue eliminado accidentalmente por otro usuario. Solo la carpeta de datos en MySQL está disponible. Y, en eso solo están disponibles las carpetas de bases de datos (carpetas en "\ bin \ mysql \ mysql5.6.12 \ data \" con el nombre de las bases de datos). Todos los archivos que incluyen " ibdata1 " en la raíz de "\ bin \ mysql \ mysql5.6.12 \ data \" también se eliminan.

Las carpetas de la base de datos contienen archivos con las siguientes extensiones solamente.

* .frm, * .ibd

y el archivo "db.opt".

¿Cómo se pueden recuperar las bases de datos?

Ya he intentado recuperar bdata1. Pero, incapaz de recuperarlo. Y, alguna base de datos contiene MYISAM también.

cyberwani
fuente

Respuestas:

16

MyISAM

Para una tabla MyISAM mydb.mytable, debe tener tres archivos

  • \bin\mysql\mysql5.6.12\data\mydb\mytable.frm
  • \bin\mysql\mysql5.6.12\data\mydb\mytable.MYD
  • \bin\mysql\mysql5.6.12\data\mydb\mytable.MYI

Ya deberían estar accesibles como una tabla, ya que cada archivo contiene datos, metadatos e información de índice necesarios. Colectivamente, forman la mesa. No hay mecanismos de motor de almacenamiento externo para acceder.

InnoDB

Echa un vistazo a esta representación pictórica de InnoDB

Arquitectura InnoDB

Lo único que une ibdata1 a los .ibdarchivos es el diccionario de datos.

Su misión, si decide aceptarla, es crear cada tabla e intercambiar .ibd

Antes de hacer nada, haga una copia completa de "\ bin \ mysql \ mysql5.6.12 \ data" en otra

Aquí hay una muestra

Supongamos que tiene una base de datos mydbcon la tabla mytable. Esto significa

  • Tienes la carpeta \bin\mysql\mysql5.6.12\data\mydb
  • Dentro de esa carpeta, tienes
    • mytable.frm
    • mytable.ibd

Necesitas el .frm. Si miras mi publicación ¿Cómo puedo extraer el esquema de la tabla solo del archivo .frm? , puede descargar una utilidad MySQL que puede generar el SQL necesario para crear la tabla.

Ahora deberías hacer lo siguiente

  • Mover mytable.ibda\bin\mysql\mysql5.6.12\data
  • Ejecute el SQL para crear la tabla InnoDB
  • Inicie sesión en mysql y ejecute ALTER TABLE mydb.mytable DISCARD TABLESPACE;(Esto eliminará \bin\mysql\mysql5.6.12\data\mydb\mytable.ibd)
  • Copiar \bin\mysql\mysql5.6.12\data\mytable.ibden\bin\mysql\mysql5.6.12\data\mydb
  • Inicie sesión en mysql y ejecute ALTER TABLE mydb.mytable IMPORT TABLESPACE;(Esto se registrará \bin\mysql\mysql5.6.12\data\mydb\mytable.ibden el diccionario de datos)

Después de esto, la mesa mydb.mytabledebería ser completamente accesible. Puede probar esa accesibilidad simplemente ejecutando:

SELECT * FROM mydb.mytable LIMIT 10;

Darle una oportunidad !!!

BEBIDA (la recuperación de datos incorpora el conocimiento necesario) responsablemente

RolandoMySQLDBA
fuente
Para completar esta gran respuesta, para innodb necesitará eliminar cualquier restricción FK que haga referencia a la tabla antes de descartar su espacio de tabla. Después de la importación, debe volver a crear el FK.
SebaGra
después de importar el espacio de information_schema.key_column_usagetablas (probablemente también otras tablas) no devolverá datos sobre el primero, selectpor lo que debe ejecutar al menos una consulta y esperar unos segundos antes de que la próxima consulta pueda funcionar. (mysql Ver 14.14 Distrib 5.7.19, para linux-glibc2.12 (x86_64) usando el envoltorio EditLine)
user3338098