mysql 如何修复InnoDB表?

gt0wga4j  于 2022-11-28  发布在  Mysql
关注(0)|答案(8)|浏览(195)

昨晚我们的Solaris MySQL数据库引擎执行得很糟糕。至少有一些InnoDB表被损坏了,事务日志中有时间戳乱序错误,还有一个关于索引被损坏的特定错误。
我们知道MyISAM表修复可用的工具,但找不到任何用于InnoDB的工具。
旁注:尝试表优化(在我尝试重建损坏的索引时)会导致数据库服务器崩溃。

wwtsj6pe

wwtsj6pe1#

首先是stop the server and image the disc。在这个问题上只有一次机会是没有意义的。然后再看here

sf6xfgos

sf6xfgos2#

停止应用程序...或停止从属服务器,以便不添加新行

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

重新启动服务器或从服务器

7nbnzgx9

7nbnzgx93#

以下解决方案的灵感来源于桑德罗的建议。

警告:虽然它对我有用,但我不知道它是否对你有用。

我的问题如下:从一个表中阅读一些特定的行(我们把这个表叫做broken)会使MySQL崩溃。即使是SELECT COUNT(*) FROM broken也会杀死它。我希望这个表上有一个PRIMARY KEY(在下面的例子中,它是id)。
1.确保您有损坏的MySQL服务器的备份或快照(以防万一您想返回到步骤1并尝试其他操作!)

  1. CREATE TABLE broken_repair LIKE broken;
  2. INSERT broken_repair SELECT * FROM broken WHERE id NOT IN (SELECT id FROM broken_repair) LIMIT 1;
    1.重复步骤3,直到DB崩溃(您可以使用LIMIT 100000,然后使用更低的值,直到使用LIMIT 1使DB崩溃)。
    1.看看你是否有一切(你可以比较SELECT MAX(id) FROM brokenbroken_repair中的行数)。
    1.此时,我显然已经拥有了所有的行(除了那些可能被InnoDB截断的行)。如果缺少一些行,可以尝试向LIMIT添加一个OFFSET
    祝你好运!
up9lanfz

up9lanfz5#

请参阅以下文章:http://www.unilogica.com/mysql-innodb-recovery/(葡萄牙语)
解释了如何使用innodb_force_recoveryinnodb_file_per_table。我在需要使用单个ibdata1恢复崩溃的数据库后发现了这一点。
使用innodb_file_per_table,InnoDB中的所有表将创建一个单独的表文件,如MyISAM。

2sbarzqh

2sbarzqh6#

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

zzzyeukh

zzzyeukh7#

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

e0bqpujr

e0bqpujr8#

第一步.

停止MySQL服务器

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

set-variable=innodb_force_recovery=6

第三步。
删除ib_logfile0ib_logfile1
第四步。

启动MySQL服务器

第五步。
执行此指令:

mysqlcheck --database db_name table_name -uroot -p

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

相关问题