我的问题如下:从一个表中阅读一些特定的行(我们把这个表叫做broken)会使MySQL崩溃。即使是SELECT COUNT(*) FROM broken也会杀死它。我希望这个表上有一个PRIMARY KEY(在下面的例子中,它是id)。 1.确保您有损坏的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; 1.重复步骤3,直到DB崩溃(您可以使用LIMIT 100000,然后使用更低的值,直到使用LIMIT 1使DB崩溃)。 1.看看你是否有一切(你可以比较SELECT MAX(id) FROM broken和broken_repair中的行数)。 1.此时,我显然已经拥有了所有的行(除了那些可能被InnoDB截断的行)。如果缺少一些行,可以尝试向LIMIT添加一个OFFSET。 祝你好运!
8条答案
按热度按时间wwtsj6pe1#
首先是
stop the server and image the disc
。在这个问题上只有一次机会是没有意义的。然后再看here。sf6xfgos2#
停止应用程序...或停止从属服务器,以便不添加新行
重新启动服务器或从服务器
7nbnzgx93#
以下解决方案的灵感来源于桑德罗的建议。
警告:虽然它对我有用,但我不知道它是否对你有用。
我的问题如下:从一个表中阅读一些特定的行(我们把这个表叫做
broken
)会使MySQL崩溃。即使是SELECT COUNT(*) FROM broken
也会杀死它。我希望这个表上有一个PRIMARY KEY
(在下面的例子中,它是id
)。1.确保您有损坏的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;
1.重复步骤3,直到DB崩溃(您可以使用
LIMIT 100000
,然后使用更低的值,直到使用LIMIT 1
使DB崩溃)。1.看看你是否有一切(你可以比较
SELECT MAX(id) FROM broken
和broken_repair
中的行数)。1.此时,我显然已经拥有了所有的行(除了那些可能被InnoDB截断的行)。如果缺少一些行,可以尝试向
LIMIT
添加一个OFFSET
。祝你好运!
mzmfm0qo4#
下面是MySQL提供的解决方案:http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
up9lanfz5#
请参阅以下文章:http://www.unilogica.com/mysql-innodb-recovery/(葡萄牙语)
解释了如何使用innodb_force_recovery和innodb_file_per_table。我在需要使用单个ibdata1恢复崩溃的数据库后发现了这一点。
使用innodb_file_per_table,InnoDB中的所有表将创建一个单独的表文件,如MyISAM。
2sbarzqh6#
注意:如果您的问题是“innodb索引被标记为损坏”!那么,简单的解决方案是,删除索引并重新添加它们。这样可以很快解决问题,而不会丢失任何记录,也不会重新启动或将表内容移到临时表中,然后再移回来。
zzzyeukh7#
在我的案例中,只需停止并重新启动SQL服务器就可以了。
e0bqpujr8#
第一步.
停止MySQL服务器
第二步.
将此行添加到my.cnf(在Windows中称为my.ini)
第三步。
删除ib_logfile0和ib_logfile1
第四步。
启动MySQL服务器
第五步。
执行此指令:
成功修复崩溃的innodb表后,不要忘记从my.cnf中删除#set-variable=innodb_force_recovery=6,然后重新启动MySQL服务器。