如何修复InnoDB表?

时间:2008-10-22 15:05:43

标签: mysql innodb repair

我们(显然)昨晚的Solaris MySQL数据库引擎执行不力。至少有一些InnoDB表已损坏,事务日志中的时间戳错误,以及有关索引损坏的特定错误。

我们了解可用于MyISAM表修复的工具,但找不到InnoDB的任何内容。

附注:尝试进行表优化(在我尝试重建损坏的索引时)会导致数据库服务器崩溃。

7 个答案:

答案 0 :(得分:26)

首先停止服务器并对光盘进行成像。只有一次射击是没有意义的。然后看看here

答案 1 :(得分:20)

答案 2 :(得分:5)

以下解决方案的灵感来自Sandro的上述提示。

警告:虽然它对我有用,但我不知道它是否适合你。

我的问题如下:从表中读取一些特定的行(让我们调用此表broken)会导致MySQL崩溃。即使SELECT COUNT(*) FROM broken也会杀了它。我希望你在这张桌子上有一个PRIMARY KEY(在下面的例子中,它是id)。

  1. 确保您拥有损坏的MySQL服务器的备份或快照(以防您想要返回步骤1并尝试其他方式!)
  2. CREATE TABLE broken_repair LIKE broken;
  3. INSERT broken_repair SELECT * FROM broken WHERE id NOT IN (SELECT id FROM broken_repair) LIMIT 1;
  4. 重复步骤3,直至崩溃数据库(您可以使用LIMIT 100000然后使用较低的值,直到使用LIMIT 1崩溃数据库)。
  5. 查看您是否拥有所有内容(您可以将SELECT MAX(id) FROM brokenbroken_repair中的行数进行比较)。
  6. 此时,我显然已经拥有了所有行(除了那些可能被InnoDB野蛮截断的行)。如果您遗漏了某些行,则可以尝试向OFFSET添加LIMIT
  7. 祝你好运!

答案 3 :(得分:4)

答案 4 :(得分:0)

参见这篇文章:http://www.unilogica.com/mysql-innodb-recovery/(用葡萄牙语写的)

解释了如何使用 innodb_force_recovery innodb_file_per_table 。在需要使用单个 ibdata1 恢复崩溃的数据库后,我发现了这一点。

使用innodb_file_per_table,InnoDB中的所有表都将创建一个独立的表文件,如MyISAM。

答案 5 :(得分:0)

注意:如果您的问题是“ innodb索引被标记为已损坏”! 然后,简单的解决方案就是删除索引并再次添加它们。这样可以很快解决,而不会丢失任何记录,也不会重新启动表内容或将其移入临时表或移回临时表。

答案 6 :(得分:-5)

第1步。

停止MySQL服务器

第2步。

将此行添加到my.cnf(在Windows中称为my.ini)

set-variable=innodb_force_recovery=6

第3步。

删除 ib_logfile0 ib_logfile1

第4步。

启动MySQL服务器

第5步。

运行此命令:

mysqlcheck --database db_name table_name -uroot -p

成功修复崩溃的innodb表后,不要忘记从my.cnf中删除#set-variable = innodb_force_recovery = 6,然后重新启动MySQL服务器。