如何修复 InnoDB 表?

问题描述 投票:0回答:9

我们(显然)昨晚的 Solaris MySQL 数据库引擎执行得很差。至少有一些 InnoDB 表已损坏,事务日志中出现时间戳无序错误,以及有关索引损坏的特定错误。

我们知道可用于 MyISAM 表修复的工具,但找不到任何适用于 InnoDB 的工具。

旁注:尝试表优化(在我尝试重建损坏的索引时)会导致数据库服务器崩溃。

mysql innodb repair
9个回答
30
投票

首先停止服务器并对光盘进行映像。只尝试一次是没有意义的。那么请看这里


27
投票

停止您的应用程序...或停止您的从站,这样就不会添加新行

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>;

重新启动您的服务器或从属服务器


10
投票

以下解决方案的灵感来自上述 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

祝你好运!


4
投票

1
投票

在我的案例中,只需停止并重新启动 SQL 服务器即可。


0
投票

请参阅这篇文章:http://www.unilogica.com/mysql-innodb-recovery/(葡萄牙语)

解释了如何使用innodb_force_recoveryinnodb_file_per_table。我在需要使用单个 ibdata1 恢复崩溃的数据库后发现了这一点。

使用innodb_file_per_table,InnoDB中的所有表都会创建一个单独的表文件,就像MyISAM一样。


0
投票

注意:如果您的问题是“innodb 索引被标记为损坏”! 然后,简单的解决方案就是删除索引并重新添加它们。这可以很快解决,不会丢失任何记录,也不会重新启动或将表内容移动到临时表中并返回。


0
投票

将表更改为myisam,然后再次更改为innodb,它对我来说适用于1300万张表(图像来自医院的PACS)


-10
投票

步骤 1。

停止MySQL服务器

第 2 步。

将此行添加到 my.cnf (在 Windows 中称为 my.ini )

set-variable=innodb_force_recovery=6

步骤 3。

删除 ib_logfile0ib_logfile1

步骤 4。

启动MySQL服务器

第 5 步。

运行此命令:

mysqlcheck --database db_name table_name -uroot -p

成功修复崩溃的innodb表后,不要忘记从my.cnf中删除#set-variable=innodb_force_recovery=6,然后再次重新启动MySQL服务器。

© www.soinside.com 2019 - 2024. All rights reserved.