mysql通過frm和ibd文件恢復(fù)表_mysql5.7根據(jù).frm和.ibd文件恢復(fù)表結(jié)構(gòu)和數(shù)據(jù)
一、恢復(fù)表結(jié)構(gòu)
1、環(huán)境:Windows 、mysql5.7;首先創(chuàng)建一個(gè)數(shù)據(jù)庫,可以通過navicat來創(chuàng)建:
2、使用當(dāng)前創(chuàng)建的數(shù)據(jù)庫:use ww;
3、隨意創(chuàng)建一張表,但是這張表的名字要和你要恢復(fù)的.frm或者.ibd一致,我的.frm與.ibd文件為gonggao.frm與gonggao.ibd 因此我的創(chuàng)建表語句為:
create table gonggao(id int);
4、在執(zhí)行上面的創(chuàng)建表語句之后,在服務(wù)里面或者使用net stop mysql關(guān)閉數(shù)據(jù)庫服務(wù),然后用需要恢復(fù)的gonggao.frm覆蓋這個(gè)新建的ww數(shù)據(jù)庫gonggao表的物理文件gonggao.frm,接著對(duì)配置文件(my.ini)設(shè)置innodb_force_recovery = 6,然后使用net start mysql啟動(dòng)服務(wù),接著使用:desc gonggao; 查看該表結(jié)構(gòu),會(huì)出現(xiàn)下面錯(cuò)誤信息:
5、針對(duì)這個(gè)問題,我們可以通過查看mysql的日志文件來解決,查看mysql安裝目錄下的data文件夾里面.err結(jié)尾的文件,你會(huì)發(fā)現(xiàn)出現(xiàn)下面所示的錯(cuò)誤信息:[Warning] InnoDB: Table ww/gonggao contains 1 user defined columns in InnoDB, but 4 columns in MySQL.原來是因?yàn)椋覀円謴?fù)的表有4個(gè)字段,而我們在創(chuàng)建表的時(shí)候只創(chuàng)建了1個(gè)字段。
解決方案:刪除gonggao表重新創(chuàng)建一個(gè)包含4個(gè)字段的表,具體這4個(gè)字段是什么不用管的。具體執(zhí)行過程為使用net stop mysql停掉服務(wù),然后在配置文件my.ini中將innodb_force_recovery = 6注釋掉(#或;均可),再net start mysql啟動(dòng)服務(wù)。接著在控制臺(tái)先執(zhí)行drop table gonggao;刪除表,再執(zhí)行創(chuàng)建表語句,我執(zhí)行的是下面的創(chuàng)建表語句:create table gonggao(id int,id1 int,id2 int,id3 int);
緊接著按照前面的方式,使用net stop mysql關(guān)閉數(shù)據(jù)庫服務(wù),然后用需要恢復(fù)的gonggao.frm覆蓋這個(gè)新建的ww數(shù)據(jù)庫的gonggao表的物理文件gonggao.frm,接著對(duì)配置文件(my.ini)設(shè)置innodb_force_recovery = 6,然后使用net start mysql啟動(dòng)服務(wù),接著使用:desc gonggao; 查看該表結(jié)構(gòu),輸出下面結(jié)果表示恢復(fù)表結(jié)構(gòu)成功:
6、復(fù)制創(chuàng)建gonggao表的語句;我們需要通過創(chuàng)建表的語句重新創(chuàng)建表,當(dāng)然在創(chuàng)建表之前需要將已經(jīng)創(chuàng)建好的gonggao刪除掉,具體獲取創(chuàng)建表的語句可以通過navicat來實(shí)現(xiàn),在navicat中選中g(shù)onggao表,右鍵點(diǎn)擊"對(duì)象信息",出現(xiàn)下面截圖信息,選中DDL,里面的內(nèi)容就是我們創(chuàng)建gonggao表的sql語句了:
接著在控制臺(tái)執(zhí)行drop table gonggao;刪除gonggao表,當(dāng)然在執(zhí)行刪除gonggao命令之前,還需要停庫將my.ini中的innodb_force_recovery = 6刪除或者注釋掉,再啟動(dòng)mysql。接著執(zhí)行下面命令重新創(chuàng)建表即可:
CREATE TABLE `gonggao` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `qihao` bigint(20) DEFAULT NULL COMMENT '號(hào)期,如1456', `gonggao_date` date DEFAULT NULL COMMENT '公告日期', `sn_this_year` smallint(6) DEFAULT NULL COMMENT '年本內(nèi)的期號(hào)', PRIMARY KEY (`id`), KEY `index_qihao` (`qihao`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
其實(shí)以上操作的目的就是為了獲取建表語句,也可以用mysqlfrm工具獲取到,具體可以看我另外一篇文章:
鏈接:https://www.cnblogs.com/weiyiming007/p/10280943.html
二、恢復(fù)表數(shù)據(jù)
1、恢復(fù)表數(shù)據(jù)需要首先將原先的.ibd文件與原先的.frm文件解除綁定,具體就是在控制臺(tái)執(zhí)行下面命令:
alter table gonggao discard tablespace;
2、接著執(zhí)行net stop mysql停掉服務(wù),將需要恢復(fù)的gonggao.ibd文件覆蓋這個(gè)新建的ww數(shù)據(jù)庫的gonggao表的物理文件gonggao.ibd,執(zhí)行net start mysql開啟服務(wù)。
3、將復(fù)制過來的gonggao.ibd文件與gonggao.frm文件發(fā)生聯(lián)系。具體執(zhí)行下面命令:
alter table gonggao import tablespace;
4、這時(shí)候通過navicat查看數(shù)據(jù)表,你會(huì)發(fā)現(xiàn)數(shù)據(jù)已經(jīng)成功恢復(fù)啦。
參考原文:https://blog.csdn.net/hzw19920329/article/details/78045864
MySQL innodb引擎下根據(jù).frm和.ibd文件恢復(fù)表結(jié)構(gòu)和數(shù)據(jù)
記錄通過.frm和.ibd文件恢復(fù)數(shù)據(jù)到本地 .frm文件:保存了每個(gè)表的元數(shù)據(jù),包括表結(jié)構(gòu)的定義等: .ibd文件:InnoDB引擎開啟了獨(dú)立表空間(my.ini中配置innodb_file_per ...
補(bǔ)充方法
一、恢復(fù)表結(jié)構(gòu)(從 .frm 文件)
方法 1:使用 mysqlfrm
工具(推薦)
mysqlfrm
是 MySQL Utilities 中的一個(gè)工具,可以從 .frm
文件提取表結(jié)構(gòu)。
安裝 MySQL Utilities
# Ubuntu/Debian sudo apt-get install mysql-utilities # CentOS/RHEL sudo yum install mysql-utilities
提取表結(jié)構(gòu)
mysqlfrm --diagnostic /path/to/table.frm --port=3306
示例輸出:
CREATE TABLE `table_name` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
保存生成的 SQL 語句,后續(xù)用于重建表。
方法 2:手動(dòng)重建表結(jié)構(gòu)(如果 mysqlfrm
不可用)
如果 .frm
文件損壞或無法使用工具,需根據(jù)業(yè)務(wù)邏輯手動(dòng)編寫建表語句。
二、恢復(fù)表數(shù)據(jù)(從 .ibd
文件)
前提條件
恢復(fù)數(shù)據(jù)的 MySQL 實(shí)例必須與原實(shí)例的 版本一致。
恢復(fù)數(shù)據(jù)的表結(jié)構(gòu)必須與原表 完全一致(字段名、類型、引擎、字符集等)。
步驟 1:創(chuàng)建同名空表
使用從 .frm
文件提取的 SQL 語句創(chuàng)建空表:
CREATE DATABASE IF NOT EXISTS recovery_db; USE recovery_db; -- 執(zhí)行提取的建表語句 CREATE TABLE `table_name` (...);
步驟 2:卸載表空間
ALTER TABLE recovery_db.table_name DISCARD TABLESPACE;
步驟 3:復(fù)制 .ibd 文件到數(shù)據(jù)目錄
關(guān)閉 MySQL 服務(wù):
systemctl stop mysql
將原 .ibd
文件復(fù)制到 MySQL 數(shù)據(jù)目錄:
cp /path/to/table.ibd /var/lib/mysql/recovery_db/table_name.ibd
修改文件權(quán)限:
chown mysql:mysql /var/lib/mysql/recovery_db/table_name.ibd
啟動(dòng) MySQL 服務(wù):
systemctl start mysql
步驟 4:導(dǎo)入表空間
ALTER TABLE recovery_db.table_name IMPORT TABLESPACE;
步驟 5:驗(yàn)證數(shù)據(jù)
SELECT * FROM recovery_db.table_name LIMIT 10;
三、常見問題及解決
1. 錯(cuò)誤 Tablespace is missing
原因:表結(jié)構(gòu)不匹配或 .ibd
文件路徑錯(cuò)誤。
解決:
確保表結(jié)構(gòu)與原表完全一致。
檢查 .ibd
文件是否在正確的數(shù)據(jù)庫目錄下。
2. 錯(cuò)誤 Table doesn't exist in engine
原因:InnoDB 內(nèi)部元數(shù)據(jù)不一致。
解決:
刪除表并重新創(chuàng)建。
重啟 MySQL 服務(wù)后重試。
3. 錯(cuò)誤 Row size too large
原因:原表使用了與當(dāng)前實(shí)例不同的 innodb_page_size
。
解決:
調(diào)整 innodb_page_size
參數(shù)并重建實(shí)例。
四、注意事項(xiàng)
備份原文件:操作前備份 .frm
和 .ibd
文件,避免意外損壞。
版本一致性:確保 MySQL 版本與原環(huán)境一致。
文件權(quán)限:復(fù)制文件后需正確設(shè)置權(quán)限(chown mysql:mysql
)。
通過以上步驟,即可從 .frm
和 .ibd
文件恢復(fù)完整的表結(jié)構(gòu)和數(shù)據(jù)。如果遇到復(fù)雜問題,建議聯(lián)系專業(yè)數(shù)據(jù)恢復(fù)服務(wù)。
- MySQL InnoDB引擎ibdata文件損壞/刪除后使用frm和ibd文件恢復(fù)數(shù)據(jù)
- mysql8.0無備份通過idb文件恢復(fù)數(shù)據(jù)的方法、idb文件修復(fù)和tablespace?id不一致處理
- mysql數(shù)據(jù)被誤刪的恢復(fù)方案以及預(yù)防措施
- MySQL通過binlog實(shí)現(xiàn)恢復(fù)數(shù)據(jù)
- Mysql數(shù)據(jù)庫之?dāng)?shù)據(jù)備份與恢復(fù)方式
- MySQL通過日志恢復(fù)數(shù)據(jù)的操作步驟
- mysql通過binlog定時(shí)備份數(shù)據(jù)庫與恢復(fù)的方法
- MySQL數(shù)據(jù)誤刪或者誤更新如何恢復(fù)詳細(xì)步驟(一看就會(huì))
- MySQL數(shù)據(jù)庫備份與恢復(fù)全攻略
- MySQL通過ibd文件恢復(fù)數(shù)據(jù)的操作過程
- mysql8.0?.ibd文件恢復(fù)表結(jié)構(gòu)的實(shí)現(xiàn)
- 從ibd文件恢復(fù)MySQL數(shù)據(jù)的操作步驟及常見錯(cuò)誤
- Mysql恢復(fù)誤刪庫表數(shù)據(jù)完整場景演示
- MySQL使用MyFlash快速恢復(fù)誤刪除和修改的數(shù)據(jù)
相關(guān)文章
MySQL的id關(guān)聯(lián)和索引使用的實(shí)際優(yōu)化案例
這篇文章主要介紹了MySQL的id關(guān)聯(lián)實(shí)際優(yōu)化案例,關(guān)聯(lián)和索引一直是MySQL常見的可優(yōu)化大塊兒,需要的朋友可以參考下2015-05-05解析MySQL的information_schema數(shù)據(jù)庫
本篇文章是對(duì)MySQL的information_schema數(shù)據(jù)庫進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06MySQL實(shí)現(xiàn)JDBC詳細(xì)步驟
JDBC?是?Java?訪問數(shù)據(jù)庫的標(biāo)準(zhǔn)規(guī)范,真正怎么操作數(shù)據(jù)庫還需要具體的實(shí)現(xiàn)類,也就是數(shù)據(jù)庫驅(qū)動(dòng),本文給大家介紹MySQL實(shí)現(xiàn)JDBC詳細(xì)講解,感興趣的朋友一起看看吧2022-02-02Centos7 如何部署MySQL8.0.30數(shù)據(jù)庫
這篇文章主要介紹了Centos7 如何部署MySQL8.0.30數(shù)據(jù)庫,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2024-05-05MySQL用戶密碼中的特殊字符嘆號(hào)(?。┑拿钣?/a>
這篇文章主要介紹了MySQL用戶密碼中的特殊字符嘆號(hào)(?。┑拿钣?本文介紹的是如果你的密碼中含有嘆號(hào)(?。?那么在控制臺(tái)登錄時(shí)會(huì)出現(xiàn)錯(cuò)誤哦,需要的朋友可以參考下2014-07-07