如何为 MySQL 数据库修正损坏的 InnoDB

如何为 MySQL 数据库修正损坏的 InnoDB,第1张

InnoDB拥有内部恢复机制,假如数据库崩溃了,InnoDB通过从最后一个时间戳开始运行日志文件,来尝试修复数据库。大多数情况下会修复成功,而且整个过程是透明的。

假如InnoDB自行修复失败,那么数据库将不能启动。无论怎样一次又一次的尝试启动MySQL,它都只是发出一条错误信息。这也是在使用 InnoDB时,需要运行master/master的原因,只有这样才能在一个master宕掉时,还有一台冗余master做后备。

在继续 *** 作前,先浏览下MySQL的日志文件,确定数据库是因为InnoDB表的损坏而崩溃。

有一种方法是更新InnoDB的日志文件计数器以跳过引起崩溃的查询,但是经验告诉我们这不是个好方法。这种情况下,将造成数据的不一致性而且会经常使主从复制中断。

一旦确定MySQL因为InnoDB表损坏无法启动时,就可以按照以下5步进行修复:

1.添加如下配置到/etc/my.cnf文件中

innodb_force_recovery = 4

2.这时就可以重新启动数据库了,在innodb_force_recovery配置的作用,所有的插入与更新 *** 作将被忽略

3.导出所有的数据表

4.关闭数据库并删除所有数据表文件及目录,再运行 mysql_install_db来创建MySQL默认数据表

5.在/etc/my.cnf中删除innodb_force_recovery这一行,再启动MySQL(这时MySQL正常启动)

6.从第3步备份的文件中恢复所有的数据。

你会备份,不能恢复。真的服你了。

给你二个解决办法:

第一个办法:使用这个命令格式

shell>mysqladmin

create

数据库名

-uroot

-p

(数据库已经存在就不用此步)

shell>mysql

-uroot

-p

数据库名

<

backup-file.sql

第二个办法:更详细的用法在mysql的在线手册中,已经给你找到备份恢复的页面了,打看学一下,你们问题就可以肯定搞定了。这是mysql官方中文手册。

备份恢复的页面链接:http://dev.mysql.com/doc/refman/5.1/zh/database-administration.html#disaster-prevention

因为被破坏的地方只在索引的部分,所以当使用innodb_force_recovery = 1运行InnoDB时, *** 作如下:

执行check,repair table 都无效

alter table email_status engine =myisam#也报错了,因为模式是innodb_force_recovery =1。

ERROR 1025 (HY000): Error on rename of '...' to '....' (errno: -1)

建立一张表:create table email_status_bak #和原表结构一样,只是把INNODB改成了MYISAM。把数据导进去insert into email_status_bak select * from email_status

删除掉原表:

drop table email_status

注释掉innodb_force_recovery 之后,重启。

重命名:

rename table edm_email_status_bak to email_status

最后该回存储引擎

alter table edm_email_status engine = innodb

总结:

这里的一个重要知识点就是 对 innodb_force_recovery 参数的理解了,要是遇到数据损坏甚至是其他的损坏。可能上面的方法不行了,需要尝试另一个方法:insert into tb select * from ta limit X;甚至是dump出去,再load回来。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/6670855.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-26
下一篇2023-03-26

发表评论

登录后才能评论

评论列表(0条)

    保存