Mysql ibdata 丟失或損壞如何通過frm&ibd 恢複資料

來源:互聯網
上載者:User

mysql儲存在磁碟中,各種天災人禍都會導致資料丟失。大公司的時候我們常常需要做好資料冷熱備,對於小公司來說要做好所有資料備份需要支出大量的成本,很多公司也是不現實的。萬一還沒有做好備份,資料被誤刪除了,或者ibdata損壞了怎麼辦呢?別擔心,只要有部分的frm、ibd存在就可以恢複部分資料。

注意:
一、這個是對innodb的資料恢複。myisam不需要這麼麻煩,只要資料檔案存在直接複製過去就可以。
二、大家的mysql資料庫必須是按表存放資料的,預設不是,但是大家生產肯定是按分表設定的吧,如果不是,不好意思,這個方法不能恢複你的資料。my.ini的設定為 innodb_file_per_table = 1。

參考 http://blog.chinaunix.net/uid-24111901-id-2627876.html

1、找回表結構,如果表結構沒有丟失直接到下一步

      a、先建立一個資料庫,這個資料庫必須是沒有表和任何操作的。

 

      b、建立一個表結構,和要恢複的表名是一樣的。表裡的欄位無所謂。一定要是innodb引擎的。CREATE TABLE `weibo_qq0`( `weiboid` bigint(20)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

      c、關閉mysql, service mysqld stop;

 

      d、用需要恢複的frm檔案覆蓋剛建立的frm檔案;

 

      e、修改my.ini 裡 innodb_force_recovery=1 , 如果不成修改為 2,3,4,5,6。

 

    f、 啟動mysql,service mysqld start;show create table weibo_qq0 就能li到表結構資訊了。

2、找回資料。記得上面把 innodb_force_recovery改掉了,需要注釋掉,不然復原模式不好操作。 這裡有個關鍵的問題,就是innodb裡的任何資料操作都是一個日誌的記錄點。也就是如果我們需要資料恢複,必須把之前的表的資料的日誌記錄點添加到一致。

      a、建立一個資料庫,根據上面匯出的建立表的sql執行建立表。

 

      b、找到記錄點。先要把當前資料庫的資料表空間廢棄掉,使當前ibd的資料檔案和frm分離。 ALTER TABLE weibo_qq0 DISCARD TABLESPACE;

 

      c、把之前要恢複的 .ibd檔案複製到新的表結構檔案夾下。 使當前的ibd 和frm發生關係。ALTER TABLE weibo_qq0 IMPORT TABLESPACE; 結果不出意外肯定會報錯。就和我們開展資料開始說的那樣,資料記錄點不一致。我們看看之前ibd記錄的點在什麼位置。開始執行 import tablespace,報錯 ERROR 1030 (HY000): Got error -1 from storage engine。找到mysql的錯誤記錄檔,InnoDB: Error: tablespace id in file ‘.\test\weibo_qq0.ibd’ is 112, but in the InnoDB InnoDB: data dictionary it is 1. 因為 weibo_qq0 之前的記錄點在112,當前的表只建立一次,所以記錄點是1.

 

      d、那怎麼從1記錄到112。for ($1=1; $i<=111; $1++) {CREATE TABLE t# (id int) ENGINE=InnoDB;} 也許很奇怪,為什麼是迴圈111,不是112。因為在a執行建立表結構的時候已經記錄增加了一次。

 

      e、修改表結構 alter table weibo_qq0 discard tablespace;使當前的表結構和ibd脫離關係。複製.ibd到當前的目錄結構。

 

      f、使原來資料的ibd和當前frm建立關係。 ALTER TABLE product IMPORT TABLESPACE; 這個時候沒有錯誤,說明已經建立好了。但是查詢資料還是查不出來。

 

      g、相比這裡大家已經知道為什麼了,這個模式也不是說改了資料庫就可以在生產環境使用。更改 innodb_force_recovery=1 , 如果不成修改為 2,3,4,5,6。直到可以 查詢出資料為止,然後dump出來。資料就備份出來了。

 

    h、把所有資料匯出後,在新的資料庫匯入。所有資料就產生了。

擴充問題,很多時候我們是分表表結構怎麼大量操作,提高速度呢。用迴圈!迴圈把表的空間廢棄掉。
for i in `seq 0 111`; do mysql -uroot -P33061 -h127.0.0.1 -Dtestdd -e “CREATE TABLE inv_crawl_weibo_qq$i (id bigint(20) NOT NULL AUTO_INCREMENT,PRIMARY KEY (id)) ENGINE=innodb “; done
ALTER TABLE inv_crawl_weibo_qq0 DISCARD TABLESPACE;
從備份資料把ibd複製cp到dd資料庫下,注意複製過來的檔案許可權。
迴圈匯入資料表空間。
ALTER TABLE inv_crawl_weibo_qq0 IMPORT TABLESPACE;
沒有報錯就匯入成功了

原創文章,轉載請註明: 轉載自Lanceyan

本文連結地址: Mysql ibdata 丟失或損壞如何通過frm&ibd 恢複資料

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.