mysql如何根據(jù).frm和.ibd文件恢復(fù)數(shù)據(jù)表
忠人之事受人之托 起因是因?yàn)橐晃慌笥训臄?shù)據(jù)庫(kù)服務(wù)器被重裝了,只剩下一個(gè)zbp_post.frm和zbp_post.ibd文件。咨詢我能不能恢復(fù),確實(shí)我只用過(guò)mysqldump這種工具導(dǎo)出數(shù)據(jù) 然后進(jìn)行恢復(fù)到數(shù)據(jù)庫(kù)。這種直接備份物理存儲(chǔ)文件還沒(méi)有嘗試過(guò)。
前提是需要?dú)v史ibd文件的所屬數(shù)據(jù)庫(kù)版本 需要和還原新庫(kù)數(shù)據(jù)庫(kù)版本保持一致,這樣才能少踩坑。
創(chuàng)建表結(jié)構(gòu)
要想恢復(fù)數(shù)據(jù),表結(jié)構(gòu)需要和.ibd里面的結(jié)構(gòu)保持一致,如果不一致將恢復(fù)不成功 可能會(huì)報(bào)如下錯(cuò)誤?;蛘咂渌惓?。
[ERROR] InnoDB: Trying to access page number 426442752 in space 24, space name test1/zbp_post, which is outside the tablespace bounds. Byte offset 0, len 16384, i/o type read. If you get this error at mysqld startup, please check that your my.cnf matches the ibdata files that you have in the MySQL server.
獲取表結(jié)構(gòu)
如果明確知道表結(jié)構(gòu) 這一步可跳過(guò)。不知道表結(jié)構(gòu)可從這一步操作中獲取到表結(jié)構(gòu)。
借助了mysql utilities工具來(lái)查看表結(jié)構(gòu)。
安裝mysql utilities
這里我適用window 其他系統(tǒng)也是類(lèi)似的操作 下載后安裝好。
https://downloads.mysql.com/archives/get/p/30/file/mysql-utilities-1.6.5-winx64.msi
其他系統(tǒng)下載地址 https://downloads.mysql.com/archives/
進(jìn)入zbp_post.frm目錄中執(zhí)行獲取表結(jié)構(gòu)命令。
cd zbp_post mysqlfrm --diagnostic ./zbp_post.frm
執(zhí)行完mysqlfrm命令后 輸出如下表結(jié)構(gòu)
CREATE TABLE `zbp_post` ( `log_ID` int(11) NOT NULL AUTO_INCREMENT, `log_CateID` int(11) NOT NULL, `log_AuthorID` int(11) NOT NULL, `log_Tag` varchar(1000) NOT NULL, `log_Status` tinyint(4) NOT NULL, `log_Type` int(11) NOT NULL, `log_Alias` varchar(1000) NOT NULL, `log_IsTop` tinyint(4) NOT NULL, `log_IsLock` tinyint(4) NOT NULL, `log_Title` varchar(1000) NOT NULL, `log_Intro` text, `log_Content` longtext, `log_CreateTime` int(11) NOT NULL, `log_PostTime` int(11) NOT NULL, `log_UpdateTime` int(11) NOT NULL, `log_CommNums` int(11) NOT NULL, `log_ViewNums` int(11) NOT NULL, `log_Template` varchar(1000) NOT NULL, `log_Meta` longtext, `log_BdPush` int(11) NOT NULL, PRIMARY KEY `PRIMARY` (`log_ID`), KEY `zbp_log_TPISC` (`log_Type`,`log_PostTime`,`log_IsTop`,`log_Status`,`log_CateID`), KEY `log_CateID` (`log_CateID`), KEY `log_AuthorID` (`log_AuthorID`), KEY `log_PostTime` (`log_PostTime`), KEY `log_CommNums` (`log_CommNums`), KEY `log_ViewNums` (`log_ViewNums`), KEY `log_Title` (`log_Title`) ) ENGINE=InnoDB;
數(shù)據(jù)庫(kù)配置修改
編輯MySQL的配置文件,通常是my.cnf或my.ini文件,在[mysqld]部分添加以下行:
這將確保每個(gè)表有單獨(dú)的.ibd文件。
[mysqld] innodb_file_per_table=1 wait_timeout=600 #600秒(10分鐘)
wait_timeout=600 這個(gè)配置可以不加 訪問(wèn)還原數(shù)據(jù)比較大。執(zhí)行超時(shí)的情況。需要根據(jù)場(chǎng)景酌情配置。
開(kāi)始恢復(fù)數(shù)據(jù)
創(chuàng)建新數(shù)據(jù)庫(kù)
創(chuàng)建一個(gè)數(shù)據(jù)庫(kù) 任意數(shù)據(jù)庫(kù)名。
create database test1;
創(chuàng)建表
進(jìn)入到新創(chuàng)建的數(shù)據(jù)庫(kù)中(use test1),復(fù)制上一步中的表結(jié)構(gòu)SQL。執(zhí)行創(chuàng)建表結(jié)構(gòu)操作。
使用.ibd文件恢復(fù)數(shù)據(jù)到新表
卸載表空間 執(zhí)行此步會(huì)自動(dòng)刪除新表對(duì)應(yīng)的.ibd文件
ALTER TABLE zbp_post DISCARD TABLESPACE;
拷貝備份的.ibd文件到新創(chuàng)建數(shù)據(jù)庫(kù)對(duì)應(yīng)的目錄中。
一般目錄在mysql保存數(shù)據(jù)庫(kù)的目錄。如我當(dāng)前的服務(wù)器mysql數(shù)據(jù)保存的目錄在/usr/local/mysql/data,數(shù)據(jù)庫(kù)名 test1 ,表名 zbp_post。
那么拷貝.ibd文件的目錄為 /usr/local/mysql/data/zbp_post/test1中。
裝載表空間
ALTER TABLE zbp_post IMPORT TABLESPACE;
完成以上步驟后,您應(yīng)該能夠成功還原.ibd文件。請(qǐng)注意,這種方法僅適用于InnoDB引擎的表。如果.ibd文件損壞或不匹配,可能需要使用MySQL的數(shù)據(jù)恢復(fù)工具來(lái)修復(fù)數(shù)據(jù)庫(kù)。
驗(yàn)證
果然完美
mysql> select count(1) from zbp_post; +----------+ | count(1) | +----------+ | 785216 | +----------+ 1 row in set (0.15 sec)
到此這篇關(guān)于mysql根據(jù).frm和.ibd文件恢復(fù)數(shù)據(jù)表的文章就介紹到這了,更多相關(guān)mysql恢復(fù)數(shù)據(jù)表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MySQL通過(guò)binlog實(shí)現(xiàn)恢復(fù)數(shù)據(jù)
- Python MySQL如何通過(guò)Binlog獲取變更記錄恢復(fù)數(shù)據(jù)
- MySQL通過(guò)日志恢復(fù)數(shù)據(jù)的操作步驟
- MySQL通過(guò)ibd文件恢復(fù)數(shù)據(jù)的操作過(guò)程
- MySQL開(kāi)啟配置binlog及通過(guò)binlog恢復(fù)數(shù)據(jù)步驟詳析
- mysql binlog如何恢復(fù)數(shù)據(jù)到某一時(shí)刻
- MySQL誤刪后使用binlog恢復(fù)數(shù)據(jù)的實(shí)現(xiàn)方法
- mysql數(shù)據(jù)損壞,如何通過(guò)ibd和frm文件批量恢復(fù)數(shù)據(jù)庫(kù)數(shù)據(jù)
- Mysql如何通過(guò)ibd文件恢復(fù)數(shù)據(jù)
- 一步步教你如何使用mysql?binlog恢復(fù)數(shù)據(jù)
- MySql恢復(fù)數(shù)據(jù)方法梳理講解
- Mysql通過(guò)ibd文件恢復(fù)數(shù)據(jù)的詳細(xì)步驟
- MySQL數(shù)據(jù)庫(kù)通過(guò)Binlog恢復(fù)數(shù)據(jù)的詳細(xì)步驟
- Mysql如何通過(guò)binlog日志恢復(fù)數(shù)據(jù)詳解
- mysql5.7使用binlog 恢復(fù)數(shù)據(jù)的方法
- MySQL通過(guò)binlog恢復(fù)數(shù)據(jù)
- mysql8.0無(wú)備份通過(guò)idb文件恢復(fù)數(shù)據(jù)的方法、idb文件修復(fù)和tablespace?id不一致處理
相關(guān)文章
關(guān)于mysql主備切換canal出現(xiàn)的問(wèn)題解決
這篇文章主要給大家介紹了關(guān)于mysql主備切換canal出現(xiàn)的一些問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11mysql連接查詢、聯(lián)合查詢、子查詢?cè)砼c用法實(shí)例詳解
這篇文章主要介紹了mysql連接查詢、聯(lián)合查詢、子查詢?cè)砼c用法,結(jié)合實(shí)例形式詳細(xì)分析了mysql連接查詢、聯(lián)合查詢、子查詢的基本概念、功能、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-04-04MySQL大小寫(xiě)敏感導(dǎo)致的問(wèn)題分析
在本篇內(nèi)容里小編給大家整理了關(guān)于MySQL大小寫(xiě)敏感導(dǎo)致的問(wèn)題的詳細(xì)分析,有興趣的朋友們可以學(xué)習(xí)參考下。2019-06-06MySQL服務(wù)器的啟動(dòng)和關(guān)閉
作為MySQL管理員,一個(gè)普通的目標(biāo)就是確保服務(wù)器盡可能地處于運(yùn)行狀態(tài),使得客戶機(jī)能夠隨時(shí)訪問(wèn)它。但是,有時(shí)最好關(guān)閉服務(wù)器(例如,如果正在進(jìn)行數(shù)據(jù)庫(kù)的重定位,不希望服務(wù)器在該數(shù)據(jù)庫(kù)中更新表)。保持服務(wù)器運(yùn)行和偶爾關(guān)閉它的需求關(guān)系不是本書(shū)所解 決的。但是我們至少可以討論如何使服務(wù)器啟動(dòng)和停止,以便您具備進(jìn)行這兩個(gè)操作的能力。2008-04-04MySQL定時(shí)刪除XX天數(shù)據(jù)示例代碼
通過(guò)使用MySQL的事件調(diào)度器,我們可以方便地創(chuàng)建定時(shí)任務(wù)來(lái)定期清理數(shù)據(jù)庫(kù)中的過(guò)期數(shù)據(jù),本文介紹了如何創(chuàng)建定時(shí)任務(wù)以及如何刪除3個(gè)月前的數(shù)據(jù)作為示例,感興趣的朋友跟隨小編一起看看吧2023-09-09