Arquivos Frm perdidos recuperando dados do ibdata

Arquivos Frm perdidos recuperando dados do ibdata

Eu estava trabalhando com um banco de dados mysql innodb. Quando eu estava trabalhando com o mysqlworkbench, acidentalmente todos os arquivos .frm foram excluídos da pasta de dados mysql, mas ainda tenho o arquivo ibdata na pasta de dados. Eu não estava usando innodb_file_per_table significa que todos os dados das minhas tabelas innodb estavam no único arquivo ibdata.

Infelizmente não tenho um backup para restaurar. Alguém poderia me sugerir como recuperar os dados do arquivo ibdata.

Responder1

Sua pergunta parece idêntica aeste no Stack Overflow.
Reproduzi parte da resposta aceita aqui.


A solução simples é encontrar sua cópia salva do CREATE TABLE SQL, executá-la em umdesenvolvimentoinstância do MySQL e copie o arquivo FRM gerado para a instância restaurada.

Se você não tiver acesso às CREATE TABLEdeclarações, tente o seguinte:

  1. Em seu banco de dados restaurado, executecreate table innodb_table_monitor (a int) ENGINE=InnoDB
  2. Observe o arquivo de erro do servidor MySQL até que os dados do monitor da tabela sejam despejados (geralmente cerca de um minuto)
  3. Correrdrop table innodb_table_monitor
  4. Pare o banco de dados restaurado

  5. Escreva SQL para corresponder à saída do monitor de tabela, por exemplo:

    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
    

    pode ser expresso como:

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

    Se você estiver confuso sobre a saída do monitor de tabela, observe a saída de tabelas com um esquema conhecido.

  6. Execute o SQL acima em umdesenvolvimentoinstância do MySQL

  7. Copie os arquivos FRM criados no servidor de desenvolvimento para o banco de dados restaurado. Você os encontrará no diretório de dados MySQL dentro do subdiretório do banco de dados correspondente.

  8. Reinicie o banco de dados restaurado

    Observe que você pode copiar os arquivos FRM do seu sistema de desenvolvimento para uma instância de banco de dados ativa. A razão para parar o servidor acima é que se você travar o banco de dados depois de criar a tabela innodb_table_monitor ele deixará o arquivo ibdata em um estado inconsistente e você terá que recomeçar a partir de um backup.

  9. Teste se as tabelas funcionam usando select *instruções. Se você estiver errado, verá:

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

o que significa que o banco de dados travou. Se isso ocorrer, faça isso create table innodb_table_monitor...na instância dev e compare a saída com a saída original da instância restaurada. Você provavelmente verá que perdeu NOT NULL ou algo pequeno assim.

informação relacionada