數據庫災難...

因爲強制關機所以數據庫崩了,只有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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章