Восстановление потерянных файлов FRM из ibdata

Восстановление потерянных файлов FRM из ibdata

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

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

решение1

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


Простое решение — найти сохраненную копию SQL CREATE TABLE , запустить ее наразработкаэкземпляр 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 или что-то вроде этого.

Связанный контент