Восстановление данных/структуры MySQL InnoDB из файлов .frm (без .myd и .myi, ibdada, my.ini)

Я попытался восстановить свои старые базы данных innodb из папки, скопированной из таблиц, определенных innodb. В настоящее время нет двоичного файла журнала и файла my.ini. У меня нет под рукой файла журнала ibdata. Мне нужно только иметь возможность повторно прочитать информацию о таблице, чтобы я мог переделать эти потерянные таблицы.

Я также потеряю отношения внешнего ключа.

Как я могу восстановить структуру таких таблиц, данные которых попадают в эти недоступные лог-файлы?

Некоторые полезные сообщения об ошибках, когда я пытаюсь получить доступ к таким таблицам:

1. Can't find file: 'college_users' (errno: 2 - No such file or directory)
2. Table 'college.college_batches' doesn't exist

person Bimal Poudel    schedule 23.06.2014    source источник


Ответы (2)


Есть программа под названием dbsake и у нее есть команда под названием frmdump.

Декодируйте файл MySQL .frm и выведите оператор CREATE VIEW или CREATE TABLE.

Эта команда не требует сервера MySQL и интерпретирует файл .frm в соответствии с правилами, аналогичными правилам сервера MySQL.

Для получения дополнительной информации о том, как работает эта команда, см. Описание файла .frm. формат

Пример:

$ dbsake frmdump --type-codes /var/lib/mysql/mysql/plugin.frm
--
-- Table structure for table `plugin`
-- Created with MySQL Version 5.5.35
--

CREATE TABLE `plugin` (
  `name` varchar(64) NOT NULL DEFAULT ''  /* MYSQL_TYPE_VARCHAR */,
  `dl` varchar(128) NOT NULL DEFAULT ''  /* MYSQL_TYPE_VARCHAR */,
  PRIMARY KEY (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='MySQL plugins';

Дополнительные сведения: https://dbsake.readthedocs.io/en/latest/commands/frmdump.html

person wiktor    schedule 28.01.2019
comment
Спасибо. Вы спасли мою жизнь. - person mostafaznv; 26.03.2019

ОБНОВЛЕНИЕ: С тех пор я запустил онлайн-инструмент для восстановления структуры из файлов .frm. https://recovery.twindb.com/

Чтобы восстановить структуру из файла Actor.frm, выполните следующие действия:

  1. Создайте фиктивную таблицу актера в тестовой базе данных (обратите внимание на 5.6, количество полей в поддельной и исходной таблицах должно совпадать):

    mysql> use test
    Database changed
    mysql> create table actor(id int);
    Query OK, 0 rows affected (0.01 sec)
    

    Для 5.6 оператор создания будет create table actor(id1 int, id2 int, id3 int, id4 int);. Как бы вы узнали фактическое количество полей в вашей таблице. Проверьте журнал ошибок на наличие следующей строки:

    2014-06-20 03:09:20 3741 [Warning] InnoDB: table test/actor contains 1 user defined columns in InnoDB, but 4 columns in MySQL. Please check INFORMATION_SCHEMA.INNODB_SYS_COLUMNS and http://dev.mysql.com/doc/refman/5.6/en/innodb-troubleshooting.html for how to resolve it
    
  2. Остановить MySQL

  3. Замените /var/lib/mysql/test/actor.frm вашим файлом actor.frm:

    cp /path/to/my/actor.frm `mysql -NBe"select @@datadir"`/test
    
  4. Запустите MySQL с innodb_force_recovery=6

    # cat /etc/my.cnf
    ...
    [mysqld]
    innodb_force_recovery=6
    

    В Windows поместите «innodb_force_recovery = 6» в файл my.ini в группе [mysqld].

  5. Запустить MySQL

  6. Прочтите структуру актера таблицы:

    mysql> show create table actor\G
    *************************** 1. row ***************************
           Table: actor
    Create Table: CREATE TABLE `actor` (
      `actor_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
      `first_name` varchar(45) NOT NULL,
      `last_name` varchar(45) NOT NULL,
      `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (`actor_id`),
      KEY `idx_actor_last_name` (`last_name`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    
person akuzminsky    schedule 23.06.2014