我们(显然)昨晚的Solaris MySQL数据库引擎执行得很糟糕.至少有一些InnoDB表已损坏,事务日志中的时间戳乱序错误,以及有关索引损坏的特定错误.
我们知道可用于MyISAM表修复的工具,但找不到InnoDB的任何内容.
附注:尝试表优化(在我尝试重建损坏的索引时)会导致数据库服务器崩溃.
首先停止服务器并对光盘进行成像.只有一次射击是没有意义的.然后看看这里.
停止您的应用程序...或停止您的从属设备,以便不添加新行
create tablelike ; insert select * from ; truncate table ; insert select * from ;
重启服务器或从服务器
以下解决方案的灵感来自Sandro的上述提示.
警告:虽然它对我有用,但我不知道它是否适合你.
我的问题如下:从表中读取一些特定的行(让我们调用这个表broken
)会使MySQL崩溃.甚至SELECT COUNT(*) FROM broken
会杀了它.我希望你PRIMARY KEY
在这张桌子上有一个(在下面的例子中,它是id
).
确保你有一个损坏的MySQL服务器的备份或快照(以防万一你想回到第1步并尝试别的东西!)
CREATE TABLE broken_repair LIKE broken;
INSERT broken_repair SELECT * FROM broken WHERE id NOT IN (SELECT id FROM broken_repair) LIMIT 1;
重复步骤3直到它崩溃数据库(您可以使用LIMIT 100000
然后使用较低的值,直到使用LIMIT 1
崩溃数据库).
看看你是否拥有所有东西(你可以SELECT MAX(id) FROM broken
与行数比较broken_repair
).
此时,我显然已经拥有了所有行(除了那些可能被InnoDB野蛮截断的行).如果你错过了一些行,你可以尝试添加OFFSET
到LIMIT
.
祝好运!