Restauración de tablas MySQL desde archivos .ibd, .frm y mysqllogbin

10

Por alguna razón, cuando intento abrir mis tablas que están almacenadas en .frmy .ibdarchivos (ya sea en MySQL o phpmyadmin) me da un error de sintaxis, o dice que no existe.

He leído la otra publicación que tenía un problema similar a este, pero no sé cómo verificar si innodb_file_per_tableestá habilitada, y en general estoy realmente confundido. También convertí una copia de mi mysql-bin.000002archivo a un archivo txt, así que veo que los datos de mi base de datos no se pierden por completo.

La base de datos fue creada el año pasado. Tengo 6 de esos mysql-bin.00000archivos, pero por alguna razón .000002es el más grande. En este momento, tengo los archivos .ibdy .frmpara todas mis bases de datos, pero no sé cómo puedo restaurarlo de nuevo en MySQL, o al menos en algo que pueda leer.

Estoy usando WampServer 2.4 y MySQL 5.6.12 en Windows 2003 Server. Además, ¿debo descargar un complemento en InnoDB?

carment
fuente
No, fue creado el año pasado. Tengo 6 de esos archivos mysql-bin.00000, pero por alguna razón el .000002 es el más grande. En este momento, tengo los archivos .ibd y .frm para todas mis bases de datos, pero no sé cómo puedo restaurarlo de nuevo en MySQL, o al menos en algo que pueda leer.
carment

Respuestas:

19

Finalmente descubrí y resolví mi problema a través de muchas pruebas y errores. Para aquellos que no tienen su archivo ibdata1 original, y solo tienen sus archivos .frm y .ibd, así es como restauré mis datos.

  1. Descargue e instale las utilidades MySQL en -> http://dev.mysql.com/downloads/utilities .
  2. Vaya a su comando / terminal para abrir la utilidad MySQL, mysqlfrm, y úsela para encontrar la estructura de su tabla que necesita restaurar. Cómo hice eso, fui cd'ed en la ubicación del archivo de mysqlfrm, luego ingresé "mysqlfrm --server = user: pwd @ localhost --port = 3307" path_to_.frm_file "> table_name.txt". El archivo .txt debe guardarse en la misma carpeta donde se guardan sus utilidades si no especificó a dónde desea que vaya.
  3. En el archivo de texto, verá las instrucciones CREATE TABLE, que incluyen todas las columnas e información (básicamente, la estructura original) de su tabla. Copie esa declaración CREATE con toda esa información.
  4. En su comando MySQL, cree una nueva base de datos (CREATE DATABASE database_name). Establezca el mismo nombre que el nombre de su base de datos original.
  5. Cree una nueva tabla dentro de la nueva base de datos; no tiene que ser el mismo nombre que la carpeta. Puede crear la nueva tabla dentro del símbolo del sistema, pero yo creé mi tabla en PhpMyAdmin, una herramienta de software gratuita que maneja la administración de MySQL en la web. Simplemente hice clic en la base de datos en PhpMyAdmin, luego en la tabla SQL, y pegué la estructura de la tabla desde el # 3. (Como nota al margen, siempre recibí errores si nombraba mis tablas "tabla" en mi símbolo del sistema, así que trate de evitar ese nombre).
  6. En su comando MySQL, vaya a su base de datos e ingrese "ALTER TABLE table_name DISCARD TABLESPACE", que esencialmente eliminará el archivo .ibd de esta tabla.
  7. Copie el archivo .ibd de su tabla original (la tabla que desea restaurar) en la tabla recién creada para reemplazar el archivo .ibd que acaba de eliminar. Cambie su archivo .ibd inicial al nombre de la tabla recién creada. Esto imitará el antiguo archivo .ibd que acaba de eliminar. Puede encontrar esta carpeta en la carpeta de datos MySQL, debajo de la carpeta de base de datos recién creada en su computadora.
  8. Regrese a su Comando MySQL, ingrese a su base de datos e ingrese "ALTER TABLE table_Name IMPORT TABLESPACE". Recibirá una declaración de error de "advertencia" (1), pero simplemente ignórela.
  9. ¡Y hecho! Si intenta acceder a su nueva tabla, debe contener todos los datos de su tabla anterior.

Espero que esto haya ayudado, y avíseme si tiene alguna pregunta o comentario. Además, consulte http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file para obtener más detalles.

carment
fuente
¡Grandes instrucciones, pero solo funciona con MySQL 5.6 ! En 5.5 obtendrá el error Got error -1 from storage enginecuando ejecute IMPORT TABLESPACE. Pero para mí MySQL 5.6 funcionó para tablas que fueron creadas usando MySQL 5.5, así que todo está bien;). Si está atascado con 5.5, debe seguir las instrucciones en el enlace de Chriscalender que planteó.
ostrokach
@carment Seguí tus instrucciones pero me enfrento a ERRPR: tratando de acceder al número de página 1767006713 en el espacio 13635, nombre del espacio <dbname> / <tblname>, que está fuera del límite del espacio de tabla. ¿Me puede guiar qué he hecho?
Mohit Mehta
Esto me ahorró mucho tiempo recreando una mesa. El método aún funciona en 2016, en MySQL 5.7.17
Andy Mercer
@ostrokach parece que es porque no has innodb_file_per_tablehabilitado.
Yvan
Simplemente ... me salvaste después de un largo viaje, ¡gracias!
Amr SubZero
4

El archivo de datos principal de InnoDB, generalmente denominado ibdata, es esencial para que MySQL pueda comprender sus archivos .ibd.

Si necesita mover datos entre servidores utilizando los archivos binarios, debe detener MySQL limpiamente y luego mover todos los archivos de datos, incluidos los archivos ibdata , entre directorios.

Un mecanismo más confiable para mover datos entre servidores en Windows sería usar ( mysqldump) o una exportación de base de datos desde PHPMyAdmin (o una herramienta similar).

Si el registro binario se ha habilitado todo el tiempo que su servidor ha estado ejecutándose (según los comentarios, este puede no ser el caso), también puede usar mysqlbinlogpara recuperar cada declaración SQL que haya ejecutado en el servidor desde los archivos mysql-bin , y recrear la base de datos de esa manera. Debería haber marcas de tiempo de Unix en los archivos mysql-bin que lo ayuden a determinar qué tan atrás van.

Si ha perdido sus archivos de base de datos originales y todo lo que le quedan son los archivos .ibd individuales, es posible que tenga que recurrir a la recuperación de datos según las sugerencias de akuzminsky en los comentarios.

MySQL 5.6 tiene algunas características nuevas para mover archivos de datos .ibd de InnoDB (espacios de tablas transportables ), pero estos requieren un poco de esfuerzo y, para una base de datos suficientemente pequeña, será mucho más fácil transferir datos usando mysqldump.

Nathan Jolly
fuente
0

Respuesta de Wiki generada a partir de comentarios de preguntas de akuzminsky


Si ve *.ibdarchivos, entonces innodb_file_per_tablees ON, de lo contrario, todas las tablas estarían en ibdata1.

Si dice que no existe una tabla, entonces la tabla falta en el diccionario InnoDB. Intente volcar todas las tablas en volcados de sql separados (una tabla - un archivo). Las tablas que no puede volcar puede restaurar con el kit de herramientas de recuperación TwinDB .

No hay paquetes binarios todavía. Tienes que obtener el código fuente de GitHub y compilarlo. Vea las instrucciones en el diccionario Recuperar InnoDB . Es bastante sencillo:

git clone [email protected]:twindb/undrop-for-innodb.git

y entonces

make all
Paul White
fuente