我当时正在使用 mysql innodb 数据库。当我使用 mysqlworkbench 时,意外地从 mysql 数据文件夹中删除了所有 .frm 文件,但数据文件夹中仍有 ibdata 文件。我没有使用 innodb_file_per_table,这意味着我的所有 innodb 表数据都在单个 ibdata 文件中。
不幸的是,我没有备份可以恢复。有人能告诉我如何从 ibdata 文件恢复数据吗?
答案1
您的问题似乎与这个在 Stack Overflow 上。
我在这里重现了部分被接受的答案。
简单的解决方案是找到您保存的 SQL 副本
CREATE TABLE
,在发展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 实例
将开发服务器中创建的 FRM 文件复制到恢复的数据库。您将在相应数据库的子目录中的 MySQL 数据目录中找到它们。
重新启动已恢复的数据库
请注意,您可以将 FRM 文件从开发系统复制到实时数据库实例中。停止上述服务器的原因是,如果您在创建 innodb_table_monitor 表后使数据库崩溃,则会导致 ibdata 文件处于不一致状态,您必须从备份重新开始。
使用语句测试表格是否正常工作
select *
。如果你错了,你会看到:ERROR 2013 (HY000): Lost connection to MySQL server during query
这意味着数据库已崩溃。如果发生这种情况,请
create table innodb_table_monitor...
在开发实例上执行并将输出与恢复实例的原始输出进行比较。您可能会发现您错过了一个 NOT NULL 或类似的小东西。