前言
MySQL的數(shù)據(jù)庫其相關(guān)文件都會存放在安裝目錄下data文件夾下的同命文件夾中额获,不同的存儲引擎創(chuàng)建的表其文件也不一樣,下面來認(rèn)識下這些數(shù)據(jù)庫文件晶衷。
db.opt
用來記錄該庫的默認(rèn)字符集編碼和字符集排序規(guī)則用的蓝纲。也就是說如果你創(chuàng)建數(shù)據(jù)庫指定默認(rèn)字符集和排序規(guī)則,那么后續(xù)創(chuàng)建的表如果沒有指定字符集和排序規(guī)則晌纫,那么該新建的表將采用db.opt文件中指定的屬性税迷。
.frm
與表相關(guān)的元數(shù)據(jù)信息都存放在.frm文件中,主要是表結(jié)構(gòu)的定義信息,不論什么存儲引擎,每一個表都會有一個以表名命名的.frm文件。
.MYD和.MYI
.MYD:MY Data锹漱,是MyISAM存儲引擎專用的用于存放MyISAM表的數(shù)據(jù)箭养;
.MYI:MY Index,也是專屬于MyISAM存儲引擎的主要存放MyISAM表的索引相關(guān)信息哥牍。
.ibd和.ibdata
兩者都是專屬于InnoDB存儲引擎的數(shù)據(jù)庫文件毕泌。
當(dāng)采用共享表空間時所有InnoDB表的數(shù)據(jù)均存放在.ibdata中喝检,所以當(dāng)表越來越多時,這個文件會變得很大撼泛;
相對應(yīng)的.ibd就是采用獨享表空間時InnoDB表的數(shù)據(jù)文件蛇耀。
修改為獨享表空間的方法是在my.ini配置文件中添加/修改此條:
Innodb_file_per_table=1
注意:筆者所用的MySQL-5.7是默認(rèn)獨享表空間的,不用特意在配置文件中添加坎弯。
當(dāng)然,就算開啟了獨享表空間译暂,.ibdata文件也會越來越大抠忘,因為這個文件里還存儲了:
? ? 變更緩沖區(qū)
? ? 雙寫緩沖區(qū)
? ? 撤銷日志
這些東西究竟是啥玩意兒?我也不知道233
如果是MyISAM存儲引擎外永,直接拷貝.frm崎脉、.MYD、.MYI到新的庫文件夾下就行了伯顶,簡直方便快捷簡單易用囚灼。但現(xiàn)在MySQL在不配置的情況下默認(rèn)的存儲引擎是InnoDB,說明它還是有優(yōu)越性在的祭衩。具體兩者的差異有空另起一篇或者網(wǎng)上查查資料吧灶体,三言兩語說不清楚,這里就不展開了掐暮。
當(dāng)然蝎抽,能點進這篇博客的肯定是想看InnoDB表的數(shù)據(jù)恢復(fù),尤其是丟失了.ibdata文件的情況下路克。
一樟结、恢復(fù)表結(jié)構(gòu)
首要的一件事情就是恢復(fù)表結(jié)構(gòu),如果很幸運地保留了當(dāng)時的表結(jié)構(gòu)精算,此步可跳過瓢宦。
1.1 隨意創(chuàng)建一張同名表
CREATE TABLE weibo_tweets(a int)ENGINE=InnoDB;
? ? 1
1.2 關(guān)閉mysql服務(wù)
net stop mysql
1.3 復(fù)制備份的.frm覆蓋新建的表.frm
1.4 開啟mysql服務(wù)
net start mysql
1.5 在mysql安裝目錄data文件夾下用文本編輯器打開.err文件
這是mysql的錯誤日志,找到諸如
2018-01-09T08:19:46.170814Z 3 [Warning] InnoDB: Table data_rec/weibo_tweets contains 1 user defined columns in InnoDB, but 6 columns in MySQL. Please check INFORMATION_SCHEMA.INNODB_SYS_COLUMNS
的記錄,發(fā)現(xiàn)原表擁有6個字段灰羽。
1.6 刪除當(dāng)前表驮履,新建一張擁有6個字段的同名表
mysql> DROP TABLE weibo_tweets;
Query OK, 0 rows affected (0.26 sec)
mysql>CREATE TABLE weibo_tweets(a1 int,a2 int,a3 int,a4 int,a5 int,a6 int)ENGINE=InnoDB;
Query OK, 0 rows affected (0.66 sec)
? ? 1
? ? 2
? ? 3
? ? 4
? ? 5
1.7 重復(fù)步驟1.2-1.3
修改配置文件my.ini在[mysqld]下添加/修改innodb_force_recovery=6
1.8 啟動mysql服務(wù),查看表結(jié)構(gòu)谦趣,發(fā)現(xiàn)表結(jié)構(gòu)已經(jīng)恢復(fù)
mysql> desc weibo_tweets;
+-------------+---------------+------+-----+-------------------+----------------+
| Field? ? ? | Type? ? ? ? ? | Null | Key | Default? ? ? ? ? | Extra? ? ? ? ? |
+-------------+---------------+------+-----+-------------------+----------------+
| id? ? ? ? ? | int(11)? ? ? | NO? | PRI | NULL? ? ? ? ? ? ? | auto_increment |
| uid? ? ? ? | varchar(10)? | NO? |? ? | NULL? ? ? ? ? ? ? |? ? ? ? ? ? ? ? |
| content? ? | varchar(1000) | YES? |? ? | NULL? ? ? ? ? ? ? |? ? ? ? ? ? ? ? |
| pub_time? ? | varchar(20)? | YES? |? ? | NULL? ? ? ? ? ? ? |? ? ? ? ? ? ? ? |
| tool? ? ? ? | varchar(50)? | YES? |? ? | NULL? ? ? ? ? ? ? |? ? ? ? ? ? ? ? |
| create_time | datetime? ? ? | YES? |? ? | CURRENT_TIMESTAMP |? ? ? ? ? ? ? ? |
+-------------+---------------+------+-----+-------------------+----------------+
6 rows in set, 1 warning (0.01 sec)
導(dǎo)出表結(jié)構(gòu)疲吸,在命令提示符下輸入
mysqldump -uroot -proot data_rec weibo_twets > e:\tweets.sql
在.sql文件中找到建表語句。
或者也可以用數(shù)據(jù)庫管理軟件如navicat中找到這張表前鹅,在對象信息中復(fù)制下DDL選項卡里的內(nèi)容摘悴。
1.9 停止mysql服務(wù),修改配置文件my.ini
修改innodb_force_recovery=0或者直接注釋掉舰绘。
2.0 啟動mysql服務(wù)蹂喻,刪掉這張表葱椭,用獲得的建表語句新建表
至此,表結(jié)構(gòu)已經(jīng)完全恢復(fù)口四。
二孵运、恢復(fù)表數(shù)據(jù)
2.1 分離表空間
使當(dāng)前.ibd的數(shù)據(jù)文件和.frm分離。
ALTER TABLE weibo_tweets DISCARD TABLESPACE;
2.2 復(fù)制備份的.ibd文件覆蓋新的表數(shù)據(jù)
2.3 重新建立新的連接
ALTER TABLE weibo_tweets IMPORT TABLESPACE;
至此蔓彩,數(shù)據(jù)恢復(fù)完畢治笨。
三、后話
網(wǎng)上有人用vim以16進制打開.ibd文件赤嚼,查看表空間ID后旷赖,將備份.ibd文件覆蓋后修改表空間ID為新的.ibd文件的ID,也可以重新建立數(shù)據(jù)文件和表空間的連接恢復(fù)數(shù)據(jù)更卒。
Windows環(huán)境下可以用WinHex達(dá)成此目的等孵,聽起來也是可行的。
我是一介懶人就不嘗試了蹂空,有興趣余力的大佬可以試試俯萌。
---------------------
作者:喜碧夫人聽眾
來源:CSDN
原文:https://blog.csdn.net/zhchs2012/article/details/79013951
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接上枕!