题
我们(显然)昨晚的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
)。
- 确保您拥有损坏的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
。
醇>
祝你好运!
以下是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。
第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中删除#setset-variable = innodb_force_recovery = 6,然后重新启动MySQL服务器。