背景:因為機器損壞,數據庫的索引文件什么的都損壞了。只留下了一個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;
然后數據就恢復啦~~