因爲強制關機所以數據庫崩了,只有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