36

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

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

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

4

7 回答 7

30

首先停止服务器并对光盘进行映像。只用一枪是没有意义的。那就看看这里吧

于 2008-10-22T17:55:26.887 回答
25

停止您的应用程序...或停止您的从站,因此不会添加新行

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>;

重新启动您的服务器或从站

于 2010-07-23T22:49:01.943 回答
9

以下解决方案的灵感来自上面 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.

祝你好运!

于 2011-05-06T21:45:05.100 回答
4

这是 MySQL 提供的解决方案:http: //dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html

于 2011-12-20T08:51:32.247 回答
0

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

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

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

于 2014-03-18T01:11:19.560 回答
0

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

于 2019-10-29T12:54:01.980 回答
-8

第1步。

停止 MySQL 服务器

第2步。

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

set-variable=innodb_force_recovery=6

步骤 3。

删除ib_logfile0ib_logfile1

第4步。

启动 MySQL 服务器

步骤 5。

运行此命令:

mysqlcheck --database db_name table_name -uroot -p

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

于 2015-09-27T08:56:19.257 回答