我正在使用MySQL innodb数据库。 当我不小心使用mysqlworkbench时,所有的.frm文件都被从mysql数据文件夹中删除,但是我仍然在数据文件夹中有ibdata文件。 我没有使用innodb_file_per_table意味着我所有的innodb表数据都在单个ibdata文件中。
不幸的是我没有备份来恢复。 任何人都可以告诉我如何从ibdata文件恢复数据。
你的问题似乎与这个堆栈溢出相同。
我已经在这里复制了部分接受的答案。
简单的解决scheme是find您保存的
CREATE TABLESQL的副本,在MySQL的开发实例上运行它,然后将生成的FRM文件复制到恢复的实例。如果您无权访问
CREATE TABLE语句,则可以尝试以下操作:
- 在恢复的数据库中,运行
create table innodb_table_monitor (a int) ENGINE=InnoDB- 观察MySQL服务器错误文件,直到表监视器数据被转储(通常大约一分钟)
- 运行
drop table innodb_table_monitor停止恢复的数据库
编写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 );如果您对表监视器输出感到困惑,请查看具有已知模式的表的输出。
在MySQL的开发实例上运行上面的SQL
将在开发服务器中创build的FRM文件复制到还原的数据库。 您将在相应数据库的子目录内的MySQL数据目录中find它们。
重新启动恢复的数据库
请注意,您可以将开发系统中的FRM文件复制到实时数据库实例中。 上面停止服务器的原因是,如果在创buildinnodb_table_monitor表之后崩溃数据库,它将使ibdata文件处于不一致的状态,您将不得不从备份重新开始。
testing这些表使用
select *语句工作。 如果你错了,你会看到:ERROR 2013 (HY000): Lost connection to MySQL server during query这意味着数据库已经崩溃。 如果发生这种情况,请在dev实例上
create table innodb_table_monitor...,并将输出与还原实例的原始输出进行比较。 你可能会看到你错过了一个NOT NULL或者那样的小东西。