當前位置:成語大全網 - 書法字典 - 如何從ibd文件中恢復數據

如何從ibd文件中恢復數據

在使用獨立表空間的情況下,如果不小心損壞了innodb存儲引擎的元數據文件ibdata,我們也可以保存有價值的數據。因為在innodb中使用獨立表空間的情況下,ibdata文件會記錄每個innodb表的id。只要ibd中的表id與ibdata文件中記錄的表id相同,就可以打開表和讀取數據。

#創建表格

創造?桌子?` ibdtest `?(

` id `?int(11)?不是嗎?NULL?自動遞增,

` fid `?int(11)?不是嗎?NULL?評論?表b '中Id,

`內容`?char(255)?不是嗎?NULL?評論?操作內容,系統生成',

“馬克`?char(255)?不是嗎?NULL?評論?'備註',

初級?鑰匙?(` id `)

)?ENGINE=InnoDB?違約?CHARSET=utf8

#添加數據

插入?ibdtest?(fid,內容,標記)?價值觀?(1,'1','1'),(2,'2','2');

選擇?*?從哪裏?ibdtest

關閉MySQL,將ibdtest.ibd副本放入其他數據庫模擬災難。

[root @ localhost ~]#/opt/soft/MySQL/bin/MySQL admin-p 123456關機

120130 18:31:50 mysqld _ safe mysqld from pidfile/opt/soft/MySQL/60137 . local domain . PID ended

[1]+?done/opt/soft/MySQL/bin/mysqld _ safe-defaults-file =/opt/soft/MySQL/config/my . CNF-user = MySQL

【root@localhost?~]#?cd?/home/soft/mysql/data/test/

【root@localhost?測試]#?陸線 (landlines的縮寫)

總計?1296

-rw-rw。?1?mysql?mysql?8612?簡。18?00:06?a.frm

-rw-rw。?1?mysql?mysql?98304?簡。18?00:24?a.ibd

-rw-rw。?1?mysql?mysql?8624?簡。30?08:34?面積. frm

-rw-rw。?1?mysql?mysql?98304?簡。30?08:36?area.ibd

-rw-rw。?1?mysql?mysql?8642?簡。18?00:05?b.frm

-rw-rw。?1?mysql?mysql?98304?簡。18?00:08?ibd

-rw-rw。?1?mysql?mysql?8693?簡。30?18:27?ibdtest.frm

-rw-rw。?1?mysql?mysql?98304?簡。30?18:28?ibdtest.ibd

-rw-rw。?1?mysql?mysql?8728?簡。6?16:23?測試表

-rw-rw。?1?mysql?mysql?98304?簡。10?04:10?泰斯塔ibd

-rw-rw。?1?mysql?mysql?8693?簡。30?14:30?testmc.frm

-rw-rw。?1?mysql?mysql?98304?簡。30?14:30?testmc.ibd

-rw-rw。?1?mysql?mysql?8693?簡。30?13:54?testme.frm

-rw-rw。?1?mysql?mysql?98304?簡。30?13:55?testme.ibd

-rw-rw。?1?mysql?mysql?8693?簡。30?14:40?testmm.frm

-rw-rw。?1?mysql?mysql?98304?簡。30?14:45?testmm.ibd

-rw-rw。?1?mysql?mysql?8693?簡。30?13:40?testmu.frm

-rw-rw。?1?mysql?mysql?98304?簡。30?13:40?testmu.ibd

-rw-rw。?1?mysql?mysql?8693?簡。30?11:08?testmv.frm

-rw-rw。?1?mysql?mysql?98304?簡。30?11:10?testmv.ibd

-rw-rw。?1?mysql?mysql?8694?簡。4?21:55?testuser.frm

-rw-rw。?1?mysql?mysql?98304?簡。4?22:04?testuser.ibd

-rw-rw。?1?mysql?mysql?8644?簡。14?21:55?user.frm

-rw-rw。?1?mysql?mysql?98304?簡。14?21:55?user.ibd

【root@localhost?測試]#?cp?ibdtest.ibd?/主頁/下載/

【root@localhost?測試]#?cd?/主頁/下載/

#vim打開ibd,在16查看。

【root@localhost?下載]#?vim?-乙?ibdtest.ibd?

:%!xxd?

從下圖可以看出,這個表在當前mysql數據庫中的id是0x10,也就是16。

此時,讓我們假設災難發生了,ibdata被損壞…

只剩下ibdtest.ibd文本,所以我們跳到另壹個mysql服務器,用相同的表構建語句創建ibdtest表。

這時候我們打開這個mysql服務器下的ibdtest.ibd看看:

這個表的id是0x16,也就是22,所以我們只需要把原來的ibdtest.ibd表id改成0x16就可以了。

保存時記得用:% 1!xxd?-r

退出保存。

並用新的ibdtest.ibd覆蓋修改後的文件。

這個mysql服務器會認為表格損壞,無法打開。沒關系。修改innodb_force_recovery = 6。

重新啟動mysql服務:

在“選擇”下,您將知道數據是否已恢復:

此時,寫操作無法執行,所以應該盡快轉儲數據,修改innodb_force_recovery = 0,重新啟動服務,創建新表,然後返回數據。將不演示恢復數據。