MySQL InnoDB 表损坏——如何修复?

Posted

技术标签:

【中文标题】MySQL InnoDB 表损坏——如何修复?【英文标题】:MySQL InnoDB tables corrupt -- how to fix? 【发布时间】:2010-11-23 19:36:33 【问题描述】:

在我的一个 InnoDB 表中执行条件 DELETE 操作时,显然需要在 ibdata1 中创建一些临时表,但硬盘已满,mysql 崩溃。在删除 ibdata1 文件(~30 GB)之前,我无法让它重新启动。

现在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 再次用适当的数据识别这些表?

谢谢!

【问题讨论】:

您在损坏之前是否进行了完整备份? 我只对表结构进行了备份(使用 --no-data),因为其余数据非常庞大,大约 100GB,并且可以通过另一个脚本重新填充。但我仍然有这些多 GB .ibd 文件和各自的 .frm 文件,所以我认为数据仍然存在。只是不确定如何让 MySQL 再次读取它。 【参考方案1】:

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

【讨论】:

最后,您可以直接从 MySQL 原始文件中检索数据(仅限实验用户 ;-) 看看:ekito.fr/portail/repairing-a-badly-hurt-mysql-database?lang=en【参考方案2】:

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

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

如果你仍然有问题,你需要从启动时发布你的 mysql 服务器日志。

【讨论】:

以上是关于MySQL InnoDB 表损坏——如何修复?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复损坏的 xampp 'mysql.user' 表?

如何在 mysql 中修复或删除/创建损坏的表?

innodb_file_per_table - 转换为InnoDB

MySQL之——崩溃-修复损坏的innodb:innodb_force_recovery

Mysql 5.7.20 mysql innodb 系统表损坏带来的问题

MySQL崩溃修复案例