Назад | Перейти на главную страницу

Потерянные файлы Frm, восстанавливающие данные из ibdata

Я работал с базой данных mysql innodb. Когда я работал с mysqlworkbench, случайно все файлы .frm были удалены из папки данных mysql, но у меня все еще есть файл ibdata в папке данных. Я не использовал innodb_file_per_table, что означает, что все данные моих таблиц innodb были в одном файле ibdata.

К сожалению, у меня нет резервной копии для восстановления. Может ли кто-нибудь предложить мне, как восстановить данные из файла ibdata.

Ваш вопрос кажется идентичным этот в Stack Overflow.
Я воспроизвел здесь часть принятого ответа.


Простое решение - найти сохраненную копию CREATE TABLE SQL, запустите его на развитие экземпляр MySQL, затем скопируйте сгенерированный файл FRM в восстановленный экземпляр.

Если у вас нет доступа к CREATE TABLE операторы вы можете попробовать следующее:

  1. В восстановленной базе данных запустите create table innodb_table_monitor (a int) ENGINE=InnoDB
  2. Следите за файлом ошибок сервера MySQL, пока данные монитора таблицы не будут сброшены (обычно около минуты)
  3. Бегать drop table innodb_table_monitor
  4. Остановить восстановленную базу данных

  5. Напишите SQL для соответствия выводам монитора таблицы, например:

    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
    

    можно выразить как:

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

    Если вас смущает вывод монитора таблиц, посмотрите на вывод таблиц с известной схемой.

  6. Запустите указанный выше SQL на развитие экземпляр MySQL

  7. Скопируйте файлы FRM, созданные на сервере разработки, в восстановленную базу данных. Вы найдете их в каталоге данных MySQL в подкаталоге соответствующей базы данных.

  8. Перезагрузите восстановленную базу данных

    Обратите внимание, что вы можете скопировать файлы FRM из своей системы разработки в действующий экземпляр базы данных. Причина остановки указанного выше сервера заключается в том, что если вы завершите работу базы данных после создания таблицы innodb_table_monitor, она оставит файл ibdata в несогласованном состоянии, и вам придется начинать заново с резервной копии.

  9. Проверьте, что таблицы работают, используя select * заявления. Если вы ошиблись, вы увидите:

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

что означает сбой базы данных. Если это произойдет, сделайте create table innodb_table_monitor... на экземпляре dev и сравните вывод с исходным выводом восстановленного экземпляра. Вы, вероятно, увидите, что пропустили NOT NULL или что-то в этом роде.