忠人之事受人之托 起因是因?yàn)橐晃慌笥训臄?shù)據(jù)庫服務(wù)器被重裝了,只剩下一個(gè)zbp_post.frm和zbp_post.ibd文件。咨詢我能不能恢復(fù),確實(shí)我只用過mysqldump這種工具導(dǎo)出數(shù)據(jù) 然后進(jìn)行恢復(fù)到數(shù)據(jù)庫。這種直接備份物理存儲文件還沒有嘗試過。
前提是需要?dú)v史ibd文件的所屬數(shù)據(jù)庫版本 需要和還原新庫數(shù)據(jù)庫版本保持一致,這樣才能少踩坑。
創(chuàng)建表結(jié)構(gòu)
要想恢復(fù)數(shù)據(jù),表結(jié)構(gòu)需要和.ibd里面的結(jié)構(gòu)保持一致,如果不一致將恢復(fù)不成功 可能會報(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) 這一步可跳過。不知道表結(jié)構(gòu)可從這一步操作中獲取到表結(jié)構(gòu)。
借助了mysql utilities工具來查看表結(jié)構(gòu)。
安裝mysql utilities
這里我適用window 其他系統(tǒng)也是類似的操作 下載后安裝好。
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ù)庫配置修改
編輯MySQL的配置文件,通常是my.cnf或my.ini文件,在[mysqld]部分添加以下行:
這將確保每個(gè)表有單獨(dú)的.ibd文件。
[mysqld]
innodb_file_per_table=1
wait_timeout=600 #600秒(10分鐘)
wait_timeout=600 這個(gè)配置可以不加 訪問還原數(shù)據(jù)比較大。執(zhí)行超時(shí)的情況。需要根據(jù)場景酌情配置。
開始恢復(fù)數(shù)據(jù)
創(chuàng)建新數(shù)據(jù)庫
創(chuàng)建一個(gè)數(shù)據(jù)庫 任意數(shù)據(jù)庫名。
create database test1;
創(chuàng)建表
進(jìn)入到新創(chuàng)建的數(shù)據(jù)庫中(use test1),復(fù)制上一步中的表結(jié)構(gòu)SQL。執(zhí)行創(chuàng)建表結(jié)構(gòu)操作。
使用.ibd文件恢復(fù)數(shù)據(jù)到新表
卸載表空間 執(zhí)行此步會自動刪除新表對應(yīng)的.ibd文件
ALTER TABLE zbp_post DISCARD TABLESPACE;
拷貝備份的.ibd文件到新創(chuàng)建數(shù)據(jù)庫對應(yīng)的目錄中。
一般目錄在mysql保存數(shù)據(jù)庫的目錄。如我當(dāng)前的服務(wù)器mysql數(shù)據(jù)保存的目錄在/usr/local/mysql/data,數(shù)據(jù)庫名 test1 ,表名 zbp_post。
那么拷貝.ibd文件的目錄為 /usr/local/mysql/data/zbp_post/test1中。
裝載表空間
ALTER TABLE zbp_post IMPORT TABLESPACE;
完成以上步驟后,您應(yīng)該能夠成功還原.ibd文件。請注意,這種方法僅適用于InnoDB引擎的表。如果.ibd文件損壞或不匹配,可能需要使用MySQL的數(shù)據(jù)恢復(fù)工具來修復(fù)數(shù)據(jù)庫。
驗(yàn)證
果然完美文章來源:http://www.zghlxwxcb.cn/news/detail-607503.html
mysql> select count(1) from zbp_post;
+----------+
| count(1) |
+----------+
| 785216 |
+----------+
1 row in set (0.15 sec)
如果有朋友遇到類似問題可以和我聯(lián)系。文章來源地址http://www.zghlxwxcb.cn/news/detail-607503.html
到了這里,關(guān)于mysql根據(jù).frm和.ibd文件恢復(fù)數(shù)據(jù)表的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!