2009-08-28 64 views
4

在我的一个InnoDB表中执行条件DELETE操作时,显然需要在ibdata1中创建一些临时表,硬盘已满并且mysql崩溃。直到我删除了ibdata1文件(〜30 GB)后,我才开始重新启动它。MySQL InnoDB表损坏 - 如何解决?

现在mysql的再次启动,但在数据库中的所有表似乎已损坏(当我做了REPAIR TABLE tablename EXTENDED我得到:

+-----------------------------------+--------+----------+---------+ 
| Table  | Op  | Msg_type | Msg_text      | 
+-----------------------------------+--------+----------+---------+ 
| mydb.table1 | repair | Error | Unknown table engine 'InnoDB' | 
| mydb.table1 | repair | error | Corrupt      | 
+-----------------------------------+--------+----------+---------+ 

我用innodb_file_per_table选项,让我所有的.FRM和。 ibd文件(应该分别包含元数据和数据)都是完整的(具有与崩溃前相同的文件大小),在目录中:/var/mysql/data/mydb/。有谁知道我如何让mysql用适当的方法识别这些表数据再次出现?

谢谢!

+0

你是否在腐败之前做了完整备份? – northpole 2009-08-28 17:24:39

+0

我只对表结构做了备份(使用--no-data),因为其余数据非常庞大,大约100GB,可以通过其他脚本重新填充。但我仍然有这些带有相应.frm文件的多GB .ibd文件,所以我认为数据仍然存在。只是不确定如何让MySQL再次阅读它。 – ash 2009-08-28 17:27:26

回答

3

不能保证,但你可能想看看:https://launchpad.net/percona-data-recovery-tool-for-innodb

+0

不得已而为之,您可以直接从MySQL原始文件中检索数据(仅限实验用户;-) 请查看:http://www.ekito.fr/portail/repairing-a-badly-hurt- mysql-database?lang = en – 2012-02-09 14:36:00

3

即使您使用表的命名空间,在ibdata1中的文件仍然包含这些命名空间依赖,如多版本索引号和事务日志数据。你不能只是删除该文件,并期望它的工作。

如果您非常幸运,您可以恢复/取消删除ibdata1文件并使用--innodb_force_recovery = 3选项启动mysql。这将允许mysql启动而不尝试回滚/前滚任何事务。

如果你仍然具有eproblems,你需要从启动后发布你的mysql服务器日志。

+0

感谢您的帮助。 – ash 2009-09-02 03:27:31