Este es un poco diferente a la relacionada con InnoDB reparación de las preguntas que he visto en stackoverflow.

Asumir que he restaurado el siguiente en mi base de datos MySQL 5.1 con innodb_file_per_table=1:

db/tablename.ibd
innodb/ibdata1
innodb/ib_logfile0
innodb/ib_logfile1

He perdido la db/tablename.frm archivo. Puedo iniciar el servidor de base de datos, pero InnoDB se queja:

110723 13:26:33  InnoDB: Error: table 'db/tablename'
InnoDB: in InnoDB data dictionary has tablespace id 5943,
InnoDB: but tablespace with that id or name does not exist. Have
InnoDB: you deleted or moved .ibd files?

¿Cómo puedo reconstruir el archivo FRM?

OriginalEl autor patrickmdnet | 2011-07-24

2 Comentarios

  1. 3

    EDITAR: he creado un simple script que hace todos los pasos que se describen a continuación: https://ourstickys.com/recover.sh


    vieja pregunta, pero he encontrado esta manera más fácil de hacerlo: https://dba.stackexchange.com/questions/16875/restore-table-from-frm-and-ibd-file

    I have recovered my MySQL 5.5 *.ibd and *.frm files with using MySQL Utilites and MariaDB 10.
    
    1) Generating Create SQLs.
    You can get your create sql's from frm file. You must use : https://dev.mysql.com/doc/mysql-utilities/1.5/en/mysqlfrm.html
    
    shell> mysqlfrm --server=root:[email protected]:3306 c:\MY\t1.frm --port=3310
    
    Other way you may have your create sql's.
    
    2) Create Your Tables
    Create your tables on the database.
    
    3) alter table xxx discard tablespace
    Discard your tables which do you want to replace your *.ibd files.
    
    4) Copy your *.ibd files (MySQL Or MariaDB) to MariaDB's data path
    First i try to use MySQL 5.5 and 5.6 to restrore, but database crashes and immediately stops about tablespace id broken error. (ERROR 1030 (HY000): Got error -1 from storage engine) 
    After i have used MariaDB 10.1.8, and i have succesfully recovered my data.
    
    5) alter table xxx import tablespace
    When you run this statement, MariaDB warns about file but its not important than to recover your data :) Database still continues and you can see your data.
    
    I hope this information will helpful for you.

    Permítanme añadir que usted puede descargar el mysqlfrm aquí: https://dev.mysql.com/downloads/utilities/


    También he encontrado una manera más rápida de obtener la CREATE TABLE mediante dbsake:

    curl -s http://get.dbsake.net > dbsake
    chmod u+x dbsake

    a continuación:

    #only one table
    ./dbsake frmdump /path/to/table.frm > recover.sql
    
    #multiple tables
    ./dbsake frmdump /path/to/*.frm > recover.sql

    seguido por:

    mysql -uUSER -p recover_db < recover.sql

    también se puede ejecutar en un trazador de líneas si desea:

    ./dbsake frmdump /path/to/*.frm | mysql -uUSER -p recover_db

    en este punto, usted puede seguir las instrucciones del punto 3.

    Estas utilidades son la clave – gracias!
    Como tenía que hacerlo para más de 100 tablas, he creado un script que lo hace por mí: ourstickys.com/recover.sh
    Me gustaría poder +100. Este es un protector de la vida de la solución.

    OriginalEl autor Fabrizio

  2. 3

    Se me ocurrió una solución por mi cuenta.

    La solución simple es encontrar su copia guardada de la CREATE TABLE SQL, a ejecutar en un desarrollo instancia, a continuación, copie el generado FRM archivo a la instancia restaurada.

    Sin embargo, en mi caso yo no tenía una copia de la CREATE TABLE de comandos disponibles.

    Usted puede conseguir un servidor MySQL que se ejecuta con el ibdata, ib_logfiles, y *.eii archivos. Sin embargo, sin FRMs no aparecerá ninguna de las tablas de las bases de datos.

    1. En su base de datos restaurada, ejecutar create table innodb_table_monitor (a int) ENGINE=InnoDB
    2. Ver el servidor MySQL archivo de error hasta que la tabla de datos del monitor ha sido objeto de dumping (generalmente alrededor de un minuto)
    3. Ejecutar drop table innodb_table_monitor
    4. Parada de la base de datos restaurada

    5. Escribir SQL para que coincida con la tabla de salida de monitor, por ejemplo:

      TABLE: name db/mylosttable, id 0 7872, flags 1, columns 5, indexes 1, appr.rows 1828
      COLUMNS: id: DATA_MYSQL DATA_NOT_NULL len 12; name: type 12 DATA_NOT_NULL len 45;     
      DB_ROW_ID: DATA_SYS prtype 256 len 6; DB_TRX_ID: DATA_SYS prtype 257 len 6; 
      DB_ROLL_PTR: DATA_SYS prtype 258 len 7;
      INDEX: name GEN_CLUST_INDEX, id 0 17508, fields 0/5, uniq 1, type 1
      root page 3, appr.key vals 1828, leaf pages 9, size pages 10
      FIELDS:  DB_ROW_ID DB_TRX_ID DB_ROLL_PTR id name

      puede ser expresado como:

      drop table if exists mylosttable;
      create table mylosttable (
          id char(12) NOT NULL,
          name varchar(45) NOT NULL
      );

      Si usted está confundido acerca de la tabla de salida de monitor, examine la salida de las tablas con un esquema conocido.

    6. Ejecutar el anterior SQL en un desarrollo de la instancia de MySQL

    7. Copia de la FRM los archivos creados en el servidor de desarrollo a la base de datos restaurada. Los encontrarás en el directorio de datos de MySQL en el subdirectorio de la base de datos correspondiente.

    8. Reiniciar la base de datos restaurada

      Nota puede copiar los archivos FRM a una instancia de base de datos. La razón para detener el servidor anterior es que si se bloquea la base de datos después de realizar la innodb_table_monitor tabla dejará el ibdata archivo en un estado inconsistente, y usted tendrá que empezar de nuevo desde una copia de seguridad.

    9. Prueba de que las mesas de trabajo utilizando select * declaraciones. Si usted está equivocado, usted verá:

      ERROR 2013 (HY000): Lost connection to MySQL server during query

    lo que significa que la base de datos se ha estrellado.

    Si esto ocurre, ¿ create table innodb_table_monitor... en la instancia de desarrollo y compare el resultado con la salida original de la instancia restaurada. Es probable que vea usted ha omitido una not NULL o algo tan pequeño como eso.

    Lo que es un dolor. Espero que alguien ofrece algo más sencillo. Hasta entonces, tienes mi +1.

    OriginalEl autor patrickmdnet

Dejar respuesta

Please enter your comment!
Please enter your name here