我们(显然)昨晚的 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
。祝你好运!
在我的案例中,只需停止并重新启动 SQL 服务器即可。
请参阅这篇文章:http://www.unilogica.com/mysql-innodb-recovery/(葡萄牙语)
解释了如何使用innodb_force_recovery和innodb_file_per_table。我在需要使用单个 ibdata1 恢复崩溃的数据库后发现了这一点。
使用innodb_file_per_table,InnoDB中的所有表都会创建一个单独的表文件,就像MyISAM一样。
注意:如果您的问题是“innodb 索引被标记为损坏”! 然后,简单的解决方案就是删除索引并重新添加它们。这可以很快解决,不会丢失任何记录,也不会重新启动或将表内容移动到临时表中并返回。
将表更改为myisam,然后再次更改为innodb,它对我来说适用于1300万张表(图像来自医院的PACS)
步骤 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服务器。