我们(显然)昨晚的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 )。

  1. 确保您拥有损坏的MySQL服务器的备份或快照(以防您想要返回步骤1并尝试其他方式!)
  2. CREATE TABLE broken_repair LIKE broken;
  3. INSERT broken_repair SELECT * FROM broken WHERE id NOT IN(SELECT id FROM broken_repair)LIMIT 1;
  4. 重复步骤3,直至崩溃数据库(您可以使用 LIMIT 100000 然后使用较低的值,直到使用 LIMIT 1 崩溃数据库)。
  5. 查看您是否拥有所有内容(您可以将 SELECT MAX(id)FROM broken broken_repair 中的行数进行比较。)
  6. 此时,我显然已经拥有了所有行(除了那些可能被InnoDB野蛮截断的行)。如果您错过了某些行,可以尝试将 OFFSET 添加到 LIMIT
  7. 祝你好运!

请参阅此文章: 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服务器。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top