Как воссоздать FRM-файл для таблицы MySQL InnoDB только с файлами ibdata и * .ibd? - PullRequest
5 голосов
/ 24 июля 2011

Это немного другой вопрос, чем связанные вопросы восстановления InnoDB, которые я видел в stackoverflow.

Предположим, что я восстановил следующее в моей базе данных MySQL 5.1 с innodb_file_per_table = 1:

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

Я потерял файл db/tablename.frm. Я могу запустить сервер базы данных, но InnoDB жалуется:

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?

Как мне восстановить файл FRM?

Ответы [ 2 ]

3 голосов
/ 31 января 2017

РЕДАКТИРОВАТЬ : я создал простой скрипт, который выполняет все шаги, описанные ниже: https://ourstickys.com/recover.sh


старый вопрос, но я нашел более простой способ сделать это: 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:pass@localhost: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.

Позвольте мне добавить, что вы можете скачать mysqlfrm здесь: https://dev.mysql.com/downloads/utilities/


Я также нашел более быстрый способ получить CREATE TABLE, используя dbsake:

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

, то:

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

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

с последующим:

mysql -uUSER -p recover_db < recover.sql

вы также можете выполнить его в один слой, если хотите:

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

В этот момент вы можете следовать приведенным выше инструкциям, начиная с пункта 3.

3 голосов
/ 24 июля 2011

Я сам нашел решение.

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

Однако в моем случае у меня не было копии доступной команды CREATE TABLE.

Вы можете запустить сервер MySQL с ibdata, ib_logfiles и * .ibd.файлы.Однако без FRM, по-видимому, в базах данных не будет таблиц.

  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 останется в несогласованном состоянии, и вам придется начинать заново с резервной копии.*

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

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

, что означает сбой базы данных.

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

...