数据库灾难...

因为强制关机所以数据库崩了,只有frm和ibd格式要恢复数据....因为表空间以及ibddata的问题折磨的想哭,但是这个解决办法救了我:

比较保险的操作方法是新建一个MySQL的数据目录,并启动另外一个MySQL实例,将备份的数据库目录之间复制到MySQL的数据目录中,启动后对待修复的数据表进行操作时出现以下错误

[Warning] InnoDB: Cannot open table xxxx/yyyy from the internal data dictionary of InnoDB though the .frm file for the table exists. See http://dev.mysql.com/doc/refman/5.6/en/innodb-troubleshooting.html for how you can resolve the problem.

参考了报错中提示的文档http://dev.mysql.com/doc/refman/5.6/en/innodb-troubleshooting-datadict.html,提供了一种操作的方法,即在另外一个库中新建一个相同的表,然后将其从表空间中移除,然后将待修复表的ibd文件复制到当前的数据库目录中,然后再将此表导入表空间。如文档中给出的例子

#新建数据库
CREATE DATABASE sakila;

#进入新建的数据库
USE sakila;

#建与待修复表相同的表
CREATE TABLE actor (
   actor_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
   first_name VARCHAR(45) NOT NULL,
   last_name VARCHAR(45) NOT NULL,
   last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
   PRIMARY KEY  (actor_id),
   KEY idx_actor_last_name (last_name)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

#将此表移出表空间
ALTER TABLE sakila.actor DISCARD TABLESPACE;

复制数据文件

cp /backup_directory/actor.ibd path/to/mysql-5.6/data/sakila/

重新将其导入表空间

ALTER TABLE sakila.actor IMPORT TABLESPACE;

如果一切正常,应该就可以对修复后的表进行查询操作了,将查询出的数据恢复到损坏的MySQL实例中即可。

这个办法就是,建一个新库还有相同的新表(这个由于建表脚本我有,所以不是很清楚,这个表是要只跟原来的名字一样相同还是格式相同),建表就有frm和ibd了,然后在表空间把这个表drop掉,你会发现frm还在ibd没了,然后把你要恢复的ibd再塞进来,然后把这个表再恢复到表空间,这样数据就回来了.......

明天研究下mysql备份,要不再来几次数据灾难真的活不起了......


还有建索引,参考这个:

http://www.cnblogs.com/cy163/archive/2008/10/27/1320798.html

发布了56 篇原创文章 · 获赞 9 · 访问量 6万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章