如何修复InnoDB表?

lef*_*cus 34 mysql repair innodb

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

我们知道可用于MyISAM表修复的工具,但找不到InnoDB的任何内容.

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

Jon*_*per 26

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

  • 看来链接的内容不同,不是吗? (2认同)

小智 22

停止您的应用程序...或停止您的从属设备,以便不添加新行

create table <new table> like <old table>;
insert <new table> select * from <old table>;
truncate table  <old table>;
insert <old table> select * from <new table>;
Run Code Online (Sandbox Code Playgroud)

重启服务器或从服务器

  • 不知道为什么会这样,但它解决了我的问题. (2认同)
  • 即使在截断之后,我的旧表也已损坏。我删除了它并将&lt;新表&gt;重命名为&lt;旧表&gt;,它修复了所有问题,谢谢!注意:一些行在操作中丢失了......但我猜它们是损坏的行,所以可能无法以任何方式恢复 (2认同)

jpe*_*zzo 7

以下解决方案的灵感来自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 broken与行数比较broken_repair).
  6. 此时,我显然已经拥有了所有行(除了那些可能被InnoDB野蛮截断的行).如果你错过了一些行,你可以尝试添加OFFSETLIMIT.

祝好运!