我们(显然)昨晚的Solaris MySQL数据库引擎执行不力。至少有一些InnoDB表已损坏,事务日志中的时间戳错误,以及有关索引损坏的特定错误。
我们了解可用于MyISAM表修复的工具,但找不到InnoDB的任何内容。
附注:尝试进行表优化(在我尝试重建损坏的索引时)会导致数据库服务器崩溃。
答案 0 :(得分:26)
首先停止服务器并对光盘进行成像。只有一次射击是没有意义的。然后看看here。
答案 1 :(得分:20)
答案 2 :(得分:5)
以下解决方案的灵感来自Sandro的上述提示。
警告:虽然它对我有用,但我不知道它是否适合你。
我的问题如下:从表中读取一些特定的行(让我们调用此表broken
)会导致MySQL崩溃。即使SELECT COUNT(*) FROM broken
也会杀了它。我希望你在这张桌子上有一个PRIMARY KEY
(在下面的例子中,它是id
)。
CREATE TABLE broken_repair LIKE broken;
INSERT broken_repair SELECT * FROM broken WHERE id NOT IN (SELECT id FROM broken_repair) LIMIT 1;
LIMIT 100000
然后使用较低的值,直到使用LIMIT 1
崩溃数据库)。SELECT MAX(id) FROM broken
与broken_repair
中的行数进行比较)。OFFSET
添加LIMIT
。答案 3 :(得分:4)
以下是MySQL提供的解决方案: http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
答案 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服务器。