因为强制关机所以数据库崩了,只有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