如何仅使用ibdata和*.ibd文件为MySQL InnoDB表重新创建FRM文件?

pat*_*net 5 mysql database innodb restore database-restore

这与我在stackoverflow上看到的相关InnoDB修复问题略有不同.

假设我使用innodb_file_per_table = 1在MySQL 5.1数据库中恢复了以下内容:

db/tablename.ibd
innodb/ibdata1
innodb/ib_logfile0
innodb/ib_logfile1
Run Code Online (Sandbox Code Playgroud)

我丢失了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?
Run Code Online (Sandbox Code Playgroud)

我怎样才能重建FRM文件?

Fab*_*zio 5

编辑:我创建了一个简单的脚本,它执行下面描述的所有步骤: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.
Run Code Online (Sandbox Code Playgroud)

让我补充一点,您可以在此处下载 mysqlfrm:https ://dev.mysql.com/downloads/utilities/


我还找到了一种更快的方法来CREATE TABLE使用dbsake

curl -s http://get.dbsake.net > dbsake
chmod u+x dbsake
Run Code Online (Sandbox Code Playgroud)

然后:

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

#multiple tables
./dbsake frmdump /path/to/*.frm > recover.sql
Run Code Online (Sandbox Code Playgroud)

其次是:

mysql -uUSER -p recover_db < recover.sql
Run Code Online (Sandbox Code Playgroud)

如果需要,您也可以在一个班轮中执行它:

./dbsake frmdump /path/to/*.frm | mysql -uUSER -p recover_db
Run Code Online (Sandbox Code Playgroud)

此时,您可以从第 3 点开始按照上述说明进行操作。