通過.ibd和.frm恢復mysql數據


背景:因為機器損壞,數據庫的索引文件什么的都損壞了。只留下了一個mysql的data目錄…

此方法恢復數據的前提:建表用的innodb索引
 
備注:如果mysql的目錄還都在,可以先嘗試,將mysql下的目錄都拷貝到一個新mysql目錄下,啟動看看能不能用,不能用后再嘗試下面方法
 
mysql會有一個data目錄存儲表結構和表數據。下面的目錄結構大概如下:
ib_logfile0
ib_logfile1
ibdata1
ibtmp1
xx數據庫1
xx數據庫2
 
每個數據庫目錄下面的表內容如下:
表1.frm
表1.ibd
表2.frm
表2.ibd
.frm文件:表結構文件
.ibd文件:表數據文件
 

下面為恢復數據方法

備注:這里假設要備注的庫名為db1,表名為table1

1、先備份要恢復數據的表文件

table1.frm和table1.ibd文件
 
可以直接把原數據庫的data目錄整個拷貝過來,如果指定了data目錄可以通過查看mysql的進程看到具體配置位置

2、新搭建一個mysql

我用的5.7,搭建在mac本地

3、將mysql下的log文件刪除,不要保留和要備份的庫相同的內容

如果你是完全新建的一個數據庫,和原來的庫表完全無關,可以忽略這步驟
 
rm -rf /usr/local/mysql/data/ib_logfile0
rm -rf /usr/local/mysql/data/ib_logfile1
rm -rf /usr/local/mysql/data/ibdata1
rm -rf /usr/local/mysql/data/btmp1
rm -rf /usr/local/mysql/data/db1

4、新建數據庫

鏈接上mysql命令行
create database db1;
 

5、通過命令行新建原來的表,

注意,一定在建表命令后加【ROW_FORMAT=COMPACT】防止沖突

例如:
DROP TABLE IF EXISTS `table1`;
CREATE TABLE `table1` (
  `name` varchar(200) NOT NULL DEFAULT '' COMMENT 'key值',
  `value` varchar(500) DEFAULT NULL COMMENT 'value值',
  `desc` varchar(500) DEFAULT NULL COMMENT '關於當前key的描述信息',
  PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

 

 
如果不記得表結構了,可以先參考下面的文章找回表結構,dump出sql結構后獲得創建表的語句:

6、將新建的表DISCARD掉

命令行執行:
ALTER TABLE table1 DISCARD TABLESPACE;

7、將備份的源表數據文件.ibd拷貝過來

將.ibd文件放到新數據庫的data目錄下,覆蓋剛創建表時新生成的.ibd文件
 
即/usr/local/mysql/data/db1/下

8、將拷貝過來的.ibd表數據導入進來

ALTER TABLE  `table1` IMPORT TABLESPACE;
 
然后數據就恢復啦~~
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM