利用frm和ibd文件恢復(fù)mysql表數(shù)據(jù)的詳細(xì)過(guò)程
問(wèn)題
總是遇到mysql服務(wù)意外斷開(kāi)之后導(dǎo)致mysql服務(wù)無(wú)法正常運(yùn)行的情況,使用Navicat工具查看能夠看到里面的庫(kù)和表,但是無(wú)法獲取數(shù)據(jù)記錄,提示數(shù)據(jù)表不存在。
這里記錄一下用frm文件和ibd文件手動(dòng)恢復(fù)數(shù)據(jù)表的過(guò)程。
思路
1、frm文件:
存儲(chǔ)數(shù)據(jù)表結(jié)構(gòu)定義的文件,每個(gè)表對(duì)應(yīng)一個(gè)frm文件。
其中包含:表名、列名、主鍵、字符集等數(shù)據(jù)。
可以使用命令 SHOW CREATE TABLE table_name;
或者DESCRIBE table_name;
查看基于frm文件的表結(jié)構(gòu)信息。
2、ibd文件:
存儲(chǔ)表數(shù)據(jù)和索引的文件,每個(gè)使用InnoDB存儲(chǔ)引擎的表,啟用了獨(dú)立標(biāo)空間時(shí),都會(huì)有一個(gè)對(duì)應(yīng)的ibd文件。
其中包含:數(shù)據(jù)行記錄、索引等數(shù)據(jù)。
3、由frm文件確認(rèn)表結(jié)構(gòu),由ibd文件恢復(fù)表數(shù)據(jù)。
解決
這里以prj_idx表為例,記錄手動(dòng)處理的過(guò)程。
1、確保當(dāng)前 mysql 服務(wù)正常運(yùn)行,新建一個(gè)數(shù)據(jù)庫(kù)
create database test;
2、創(chuàng)建 prj_idx 同名表,默認(rèn)一個(gè)字段
create table `prj_idx`(`id` int);
3、替換 frm 文件
1. 斷開(kāi)mysql服務(wù)
2. 使用要恢復(fù)的prj_idx.frm文件替換新創(chuàng)建的prj_idx.frm文件
3. 啟動(dòng)mysql服務(wù)
4、查詢(xún)表結(jié)構(gòu)
rem 刷新數(shù)據(jù)庫(kù)表 flush tables; rem 查看表結(jié)構(gòu) show create table `prj_idx`;
這時(shí)會(huì)提示錯(cuò)誤:Table ‘test.prj_idx’ doesn’t exist.
查看錯(cuò)誤日志err文件,如果找不到錯(cuò)誤日志位置,可以先查詢(xún):
show variables like 'log_%';
查看錯(cuò)誤日志,找到錯(cuò)誤提示:
[Warning] InnoDB: table test/prj_idx contains 1 user defined columns
in InnoDB, but 16 columns in MySQL.
提示里面說(shuō)明了prj_idx表中實(shí)際的字段數(shù)量。
5、刪除prj_idx表,重新創(chuàng)建正確數(shù)量的任意字段的prj_idx表
這里只需要數(shù)量正確即可
draop table if exists `prj_idx`; create table `prj_idx`(`id` int,`1` int,`2` int,`3` int,`4` int,`5` int,`6` int,`7` int,`8` int,`9` int,`10` int,`11` int,`12` int,`13` int,`14` int,`15` int);
6、重新替換frm文件,并查看表結(jié)構(gòu)
1. 斷開(kāi)mysql服務(wù) 2. 使用要恢復(fù)的prj_idx.frm文件替換新創(chuàng)建的prj_idx.frm文件 3. 啟動(dòng)mysql服務(wù) 4. 刷新數(shù)據(jù)表 5. 查看表結(jié)構(gòu)
flush tables; show create table `prj_idx`;
這時(shí)就能夠查看到prj_idx的表結(jié)構(gòu)了:
7、使用表空間快速遷移ibd文件
- 丟棄表空間(刪除ibd文件):
alter table prj_idx discard tablespace;
- 復(fù)制要恢復(fù)的prj_idx.ibd文件到對(duì)應(yīng)的路徑下
- 導(dǎo)入表空間:
alter table prj_idx import tablespace;
- 確認(rèn)字符集、行格式、排序順序等設(shè)置
- 再次打開(kāi)prj_idx表,里面就已經(jīng)有數(shù)據(jù)了
8、myd、myi文件
- 復(fù)制到對(duì)應(yīng)路徑下
- 重啟mysql服務(wù)
ok,搞定!
以上就是利用frm和ibd文件恢復(fù)mysql表數(shù)據(jù)的詳細(xì)過(guò)程的詳細(xì)內(nèi)容,更多關(guān)于frm和ibd恢復(fù)mysql表數(shù)據(jù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MySQL和Oracle的元數(shù)據(jù)抽取實(shí)例分析
MySQL和Oracle雖然在架構(gòu)上有很大的不同,但是如果從某些方面比較起來(lái),它們有些方面也是相通的,下面這篇文章主要給大家介紹了關(guān)于MySQL和Oracle元數(shù)據(jù)抽取的相關(guān)資料,需要的朋友可以參考下2021-12-12關(guān)于Mysql8.0版本驅(qū)動(dòng)getTables返回所有庫(kù)的表問(wèn)題淺析
這篇文章主要給大家介紹了關(guān)于Mysql 8.0版本驅(qū)動(dòng)getTables返回所有庫(kù)的表問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12MySQL通過(guò)自定義函數(shù)實(shí)現(xiàn)遞歸查詢(xún)父級(jí)ID或者子級(jí)ID
這篇文章主要介紹了MySQL通過(guò)自定義函數(shù)實(shí)現(xiàn)遞歸查詢(xún)父級(jí)ID或者子級(jí)ID,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11根據(jù)mysql慢日志監(jiān)控SQL語(yǔ)句執(zhí)行效率
根據(jù)mysql慢日志監(jiān)控SQL語(yǔ)句執(zhí)行效率 啟用MySQL的log-slow-queries(慢查詢(xún)記錄)。2012-11-11MySQL中索引優(yōu)化distinct語(yǔ)句及distinct的多字段操作
這篇文章主要介紹了MySQL中索引優(yōu)化distinct語(yǔ)句及distinct的多字段操作方法,distinct語(yǔ)句去重功能的使用是MySQL入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-01-01