
假如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回来。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)