昨晚(显然)我们的 Solaris MySQL 数据库引擎执行不佳。至少有一些 InnoDB 表已损坏,事务日志中出现时间戳乱序错误,以及有关索引已损坏的特定错误。
我们知道可用于 MyISAM 表修复的工具,但找不到任何适用于 InnoDB 的工具。
旁注:尝试表优化(在我尝试重建损坏的索引时)会导致数据库服务器崩溃。
首先停止服务器并对光盘进行映像。只用一枪是没有意义的。那就看看这里吧。
停止您的应用程序...或停止您的从站,因此不会添加新行
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>;
重新启动您的服务器或从站
以下解决方案的灵感来自上面 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
.祝你好运!
这是 MySQL 提供的解决方案:http: //dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
见这篇文章:http ://www.unilogica.com/mysql-innodb-recovery/ (葡萄牙语)
解释了如何使用innodb_force_recovery和innodb_file_per_table。在需要使用单个ibdata1恢复崩溃的数据库后,我发现了这一点。
使用 innodb_file_per_table,InnoDB 中的所有表都将创建一个单独的表文件,如 MyISAM。
注意:如果您的问题是,“innodb 索引被标记为损坏”!然后,简单的解决方案可以是,只需删除索引并再次添加它们。这可以很快解决,而不会丢失任何记录,也不会重新启动或将表内容移动到临时表中并返回。
第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 服务器。