日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

MySQL 利用frm文件和ibd文件恢復(fù)表數(shù)據(jù)

瀏覽:138日期:2023-10-04 13:31:20
frm文件和ibd文件簡介

在MySQL中,如果我們使用了默認(rèn)的存儲引擎innodb創(chuàng)建一張表,那么在文件夾下面就會出現(xiàn)表名.frm和表名.ibd兩個文件,如果我們使用的是Myisam存儲引擎,那么就會出現(xiàn)三個文件,這里我們給出例子:

[root@ /data/yeyz]#lltotal 580-rw-rw---- 1 mysql mysql 8586 Apr 3 17:44 a.frm-rw-rw---- 1 mysql mysql 0 Apr 3 17:44 a.MYD-rw-rw---- 1 mysql mysql 1024 Apr 3 17:44 a.MYI-rw-rw---- 1 mysql mysql 8586 Apr 3 17:44 b.frm-rw-rw---- 1 mysql mysql 98304 Apr 3 17:45 b.ibd-rw-rw---- 1 mysql mysql 61 Nov 23 09:54 db.opt-rw-rw---- 1 mysql mysql 8556 Apr 29 21:37 tbl_test_2.frm-rw-rw---- 1 mysql mysql 98304 Apr 29 21:37 tbl_test_2.ibd-rw-rw---- 1 mysql mysql 8556 Apr 29 21:33 tbl_test.frm-rw-rw---- 1 mysql mysql 98304 Apr 29 21:33 tbl_test.ibd-rw-rw---- 1 mysql mysql 8614 Apr 29 21:40 test.frm-rw-rw---- 1 mysql mysql 98304 Apr 29 21:43 test.ibd-rw-rw---- 1 mysql mysql 8666 Apr 2 15:13 unstandard_ins.frm-rw-rw---- 1 mysql mysql 98304 Apr 3 11:46 unstandard_ins.ibd-rw-rw---- 1 mysql mysql 8586 Apr 3 17:44 yeyz.frm-rw-rw---- 1 mysql mysql 28 Apr 3 17:44 yeyz.MYD-rw-rw---- 1 mysql mysql 2048 Apr 3 17:44 yeyz.MYI

其中ibd文件是innodb的表數(shù)據(jù)文件,而frm文件是innodb的表結(jié)構(gòu)文件,mysiam存儲引擎的表中,frm是表結(jié)構(gòu),MYI文件是索引文件,而MYD文件是數(shù)據(jù)文件,從這里也可以看出,innodb存儲引擎的索引和數(shù)據(jù)是在一起的,而Myisam存儲引擎索引和數(shù)據(jù)是分開的。

需要注意的是,這個frm文件和ibd文件都是不能直接打開的。

考慮這樣一種需求,數(shù)據(jù)庫需要快速恢復(fù)一個表中的數(shù)據(jù),而這個表所在的庫的數(shù)據(jù)量非常大,恢復(fù)起來可能耗費的時間也比較長,那么全庫恢復(fù)肯定不是最佳的選擇。那這種情況下怎么辦呢?我們可以使用frm文件盒ibd文件來對數(shù)據(jù)進(jìn)行恢復(fù)。下面我們分析分析這個過程。

frm文件恢復(fù)表結(jié)構(gòu)

當(dāng)然,表結(jié)構(gòu)需要使用frm文件來恢復(fù)。我們第一反應(yīng)想到的是,可以把這兩個文件直接拷貝到一個新的數(shù)據(jù)庫實例中,然后直接啟動實例,這樣可以么?當(dāng)然是不行的。侄兒要是能行,估計DBA都可以下崗了。哈哈,廢話不多說,來看操作過程。

首先,我們創(chuàng)建一個新的實例專門用來恢復(fù)數(shù)據(jù),如果你使用線上的某一臺機(jī)器來執(zhí)行恢復(fù),那你必須承擔(dān)數(shù)據(jù)庫重啟的風(fēng)險以及DML阻塞的風(fēng)險,所以最好的方法還是使用一臺專門的實例來進(jìn)行恢復(fù)。那么我們?nèi)绾螐膄rm文件中拿到我們想要的表結(jié)構(gòu)呢?

我拿線上的一個記錄慢日志的表舉個例子,為了寫著方便,表名稱我寫成了'aaa',這個表的結(jié)構(gòu)是這樣的:

mysql--root@localhost:test_recover 12:08:43>>show create table aaaG*************************** 1. row *************************** Table: aaaCreate Table: CREATE TABLE `aaa` ( `maintain_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT ’自增列’, `slowquery_filename` varchar(50) DEFAULT NULL COMMENT ’慢日志文件名’, `slowquery_path` varchar(150) DEFAULT NULL COMMENT ’慢日志全路徑’, `slowquery_process` tinyint(20) unsigned NOT NULL DEFAULT ’0’ COMMENT ’慢日志是否被解析’, `slowquery_uploadtime` datetime DEFAULT CURRENT_TIMESTAMP, `slowquery_analyzetime` date DEFAULT NULL COMMENT ’慢日志解析時間’, `slowquery_starttime` date DEFAULT NULL, `slowquery_endtime` date DEFAULT NULL, `instance_ip` varchar(15) DEFAULT NULL COMMENT ’慢日志IP地址’, `instance_port` int(11) DEFAULT NULL COMMENT ’慢日志端口號地址’, PRIMARY KEY (`maintain_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf81 row in set, 1 warning (0.01 sec)

要從frm文件中得到這樣的一個表,我們要做的步驟如下:

1、在實例上創(chuàng)建一個同名的表aaa,由于我們不知道這個表的結(jié)構(gòu),我們可以給它設(shè)定只有一個字段id,也就是

create table aaa (id int);

我們知道,這個時候會在對應(yīng)的data目錄下生成新的aaa.frm和aaa.ibd文件,然后我們使用我們備份的aaa.frm來替代之前的aaa.frm,然后重啟數(shù)據(jù)庫。

是的,你沒有看錯,我們使用備份的表結(jié)構(gòu)文件來替代它生成的表結(jié)構(gòu)文件。

2.看看重啟之后錯誤日志輸出的結(jié)果吧,如下:

2019-03-22T03:17:28.652390Z 16 [Warning] InnoDB: Table test_recover/store_goods_price contains 1 user defined columns in InnoDB, but 12 columns in MySQL. Please check INFORMATION_SCHEMA.INNODB_SYS_COLUMNS and http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting.html for how to resolve the issue.2019-04-02T07:56:31.558461Z 41 [Warning] InnoDB: Table test_recover/dv_control contains 1 user defined columns in InnoDB, but 14 columns in MySQL. Please check INFORMATION_SCHEMA.INNODB_SYS_COLUMNS and http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting.html for how to resolve the issue.2019-05-23T03:14:10.161122Z 92 [Warning] InnoDB: Table test_recover/aaa contains 1 user defined columns in InnoDB, but 10 columns in MySQL. Please check INFORMATION_SCHEMA.INNODB_SYS_COLUMNS and http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting.html for how to resolve the issue.

可以看到,10-12行的錯誤日志里面提示我們這個表aaa只包含1個字段,但是frm中包含10個字段,字段的數(shù)量不符。

這和我們預(yù)料的結(jié)果符合,因為我們在創(chuàng)建表aaa的時候,只給了他1個字段id,而我們要恢復(fù)的aaa表有10個字段,肯定是無法從frm中讀取的。此時你可能很容易就能想到,如果我們把這個aaa表的字段調(diào)成10個,那么最終的結(jié)果是什么呢?

3.將aaa表的字段數(shù)量升級成10個,然后重新拷貝frm文件,修改配置文件中的參數(shù)innodb_force_recovery=6,我們看看最終的結(jié)果:

mysql--root:(none) 12:04:20>>use test_recover;Database changedmysql--root:test_recover 12:04:25>>create table aaa (id1 int,id2 int,id3 int,id4 int,id5 int,id6 int,id7 int,id8 int,id9 int,id10 int);Query OK, 0 rows affected (0.03 sec)mysql--root@localhost:test_recover 12:05:08>>show create table aaaG*************************** 1. row *************************** Table: aaaCreate Table: CREATE TABLE `aaa` ( `id1` int(11) DEFAULT NULL, `id2` int(11) DEFAULT NULL, `id3` int(11) DEFAULT NULL, `id4` int(11) DEFAULT NULL, `id5` int(11) DEFAULT NULL, `id6` int(11) DEFAULT NULL, `id7` int(11) DEFAULT NULL, `id8` int(11) DEFAULT NULL, `id9` int(11) DEFAULT NULL, `id10` int(11) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf81 row in set (0.00 sec)

然后我們重啟實例,再次查看表aaa,可以看到結(jié)果如下:

mysql--root:test_recover 12:08:43>>show create table aaaG*************************** 1. row *************************** Table: aaaCreate Table: CREATE TABLE `aaa` ( `maintain_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT ’自增列’, `slowquery_filename` varchar(50) DEFAULT NULL COMMENT ’慢日志文件名’, `slowquery_path` varchar(150) DEFAULT NULL COMMENT ’慢日志全路徑’, `slowquery_process` tinyint(20) unsigned NOT NULL DEFAULT ’0’ COMMENT ’慢日志是否被解析’, `slowquery_uploadtime` datetime DEFAULT CURRENT_TIMESTAMP, `slowquery_analyzetime` date DEFAULT NULL COMMENT ’慢日志解析時間’, `slowquery_starttime` date DEFAULT NULL, `slowquery_endtime` date DEFAULT NULL, `instance_ip` varchar(15) DEFAULT NULL COMMENT ’慢日志IP地址’, `instance_port` int(11) DEFAULT NULL COMMENT ’慢日志端口號地址’, PRIMARY KEY (`maintain_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf81 row in set, 1 warning (0.01 sec)

可以看到,我們想要的表結(jié)構(gòu)已經(jīng)從frm文件中恢復(fù)出來了,需要注意的是,這個過程中我們并沒有使用ibd文件。

總結(jié)一下利用frm文件恢復(fù)表結(jié)構(gòu)的步驟:

1、首先創(chuàng)建一個同名的表,然后啟動實例

2、使用備份的frm文件替代生成的frm文件,重啟實例

3、查看錯誤日志,從錯誤日志中獲取到備份的frm文件中的字段數(shù)量m

4、重新創(chuàng)建同名表,保證字段數(shù)量為m,與備份表保持一致,然后重新拷貝備份的frm文件到對應(yīng)目錄

5、修改實例的配置文件中的參數(shù)innodb_force_recovery=6,然后重啟數(shù)據(jù)庫,就可以看到對應(yīng)的表結(jié)構(gòu)創(chuàng)建語句,我們把它保存下來,下一步恢復(fù)數(shù)據(jù)的時候要用。這一步相當(dāng)重要

6、將參數(shù)innodb_force_recovery=6注釋掉,重新使用默認(rèn)的值,然后重啟數(shù)據(jù)庫,準(zhǔn)備恢復(fù)表數(shù)據(jù)。

至此,表結(jié)構(gòu)恢復(fù)完畢。

解釋一下innodb_force_recovery參數(shù),這個參數(shù)的最大值是6,在該等級下,僅支持一部分查詢功能,DML都不支持,從名稱就可以看出來,這是在一些強(qiáng)行恢復(fù)的場景下才會使用的參數(shù),一般情況下這個參數(shù)可以不要,使用默認(rèn)值就行。有興趣更深了解的同學(xué)可以參考官方文檔。

ibd文件恢復(fù)表數(shù)據(jù)

上一步執(zhí)行完成之后,我們已經(jīng)獲取了對應(yīng)的表結(jié)構(gòu),現(xiàn)在我們看看如何恢復(fù)表數(shù)據(jù)。

恢復(fù)表數(shù)據(jù)的方法比較簡單,大體步驟如下:

1、利用我們上一步中獲取的建表語句,重新創(chuàng)建一張表,然后執(zhí)行:

flush table aaa for export;

這個語法是將表里面的數(shù)據(jù)落盤,并獲取該表的鎖,為后面恢復(fù)做好準(zhǔn)備。

2、然后我們使用如下語句:

alter table aaa discard tablespace;

這個語句會刪除當(dāng)前的ibd文件。

3、然后我們使用我們之前備份的ibd文件,將其拷貝到對應(yīng)的實例目錄下面

4、最后在將ibd文件重新加載進(jìn)來,使用如下語句:

alter table aaa import tablespace;

重啟數(shù)據(jù)庫,這樣,我們的數(shù)據(jù)就恢復(fù)成功了。

簡單總結(jié)一下

整個恢復(fù)的流程算是介紹完了,其中比較巧妙的地方就是從frm文件中獲取表結(jié)構(gòu)信息,我們使用了兩次拼湊表創(chuàng)建語句的方法,最終得到了待恢復(fù)的表的表結(jié)構(gòu),然后使用alter table discard tablespace和alter table import tablespace的方法來恢復(fù)表中的數(shù)據(jù)。整個過程看著比較復(fù)雜,其實完全可以按照步驟抽象出來一個腳本,這樣在下次恢復(fù)的時候,只需要輸入要恢復(fù)的表的名稱,就可以快速的恢復(fù)表結(jié)構(gòu)和數(shù)據(jù),不失為一種應(yīng)急的數(shù)據(jù)恢復(fù)預(yù)案。

以上就是MySQL 利用frm文件和ibd文件恢復(fù)表數(shù)據(jù)的詳細(xì)內(nèi)容,更多關(guān)于MySQL 恢復(fù)表數(shù)據(jù)的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: MySQL 數(shù)據(jù)庫
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日本不卡在线视频| 国产精品久久久久久久久免费高清| 欧美亚洲专区| 日韩在线视频精品| 清纯唯美亚洲综合一区| 97精品中文字幕| 91欧美极品| 免费人成网站在线观看欧美高清| 成人日韩av| 国产精品毛片视频| 亚洲精选久久| 99久久久久久中文字幕一区| 国产伦精品一区二区三区千人斩 | 先锋影音久久久| 国产精品久久乐| 亚洲一区二区毛片| 岛国av免费在线观看| 国产视频网站一区二区三区| 欧美aa国产视频| 午夜天堂精品久久久久| 精品国产美女a久久9999| 亚洲精品国产偷自在线观看| 欧美午夜不卡| 国产日韩三级| 狠狠爱成人网| 国产一区二区三区四区五区| 综合一区在线| 性色一区二区| 一区在线观看| 欧美久久天堂| 日韩成人三级| 国产精品久久久久久久免费观看| 91成人在线| 欧美一区=区三区| 国产一区二区久久久久| 亚洲男女av一区二区| 亚洲精品午夜av福利久久蜜桃| 理论片午夜视频在线观看| 日本精品国产| 日韩精品a在线观看91| 国产精品极品| 国产h片在线观看| 日韩av网站在线观看| 在线精品福利| 亚州av一区| 日韩av中文字幕一区| 亚洲三级观看| 欧美一区久久久| 日韩国产91| 国产一区观看| 欧美国产91| 日本精品在线播放| 久久要要av| 国产91一区| 亚洲va中文在线播放免费| 99精品一区| 激情国产在线| 少妇精品导航| 在线国产一区| 蜜桃91丨九色丨蝌蚪91桃色| 午夜精品福利影院| 国产精品第十页| 麻豆网站免费在线观看| 99久久亚洲精品蜜臀| 亚洲精品麻豆| 精品久久免费| 国产日韩专区| 国产精品啊啊啊| 中文字幕亚洲在线观看| 免费精品视频| 精品国产乱码久久久久久樱花| 亚洲午夜黄色| 麻豆高清免费国产一区| 日韩在线观看一区二区三区| 国产亚洲精品v| 亚洲精品永久免费视频| 婷婷综合福利| 视频一区二区国产| 日韩免费av| 成人在线免费观看91| 91精品国产自产观看在线| 亚洲精品成人| japanese国产精品| 99精品视频在线| 麻豆精品视频在线观看免费| 亚洲精品日韩久久| 亚洲香蕉久久| 日韩二区三区在线观看| 美国欧美日韩国产在线播放| 久久久久99| 日韩成人高清| 欧美天堂视频| 伊人久久大香伊蕉在人线观看热v| 激情婷婷综合| 丝袜美腿成人在线| 一区二区日韩免费看| 亚洲一区二区三区中文字幕在线观看| 日韩精品第一| 黄色aa久久| 欧美成人a交片免费看| av在线日韩| 免费日韩视频| 日韩av三区| 综合日韩av| 免费国产亚洲视频| 日韩国产欧美一区二区三区| 精品日本视频| 亚洲自拍另类| 日本午夜精品视频在线观看| 日韩精品成人| 欧洲一级精品| 日本亚洲三级在线| 成人羞羞在线观看网站| 精品1区2区3区4区| 婷婷综合成人| 日本а中文在线天堂| 久久要要av| 国产调教精品| 免费在线观看成人| 欧美好骚综合网| 日韩不卡手机在线v区| 麻豆视频在线观看免费网站黄 | 午夜精品福利影院| 精品国产欧美日韩| 亚洲主播在线| 高清不卡一区| 五月激激激综合网色播| 日韩二区在线观看| 国产精品免费精品自在线观看| 91精品国产自产在线观看永久∴ | 亚洲综合精品四区| 五月天av在线| 日韩和欧美的一区| 久久精品国产一区二区| 久久亚洲风情| 国产精品一区毛片| 日韩在线卡一卡二| 日韩电影免费网站| 精品视频网站| 国产日韩高清一区二区三区在线| 日韩免费福利视频| 国产成人免费视频网站视频社区| 欧美亚洲一级| 97久久亚洲| 日本在线观看不卡视频| 在线精品视频一区| 婷婷精品久久久久久久久久不卡| 国产中文一区| 人人精品亚洲| 国产精品地址| 日本午夜精品视频在线观看| 亚洲精品自拍| 久久免费视频66| 亚洲va中文在线播放免费| 精精国产xxxx视频在线播放| 伊人精品一区| 亚洲一区二区成人| 国产亚洲精aa在线看| 婷婷综合福利| 国产精品亲子伦av一区二区三区| 日本强好片久久久久久aaa| 日韩av一区二区三区四区| 亚洲一二av| 欧美一级二区| 日韩精品免费一区二区在线观看 | 激情国产在线| 国产精品毛片视频| 国产亚洲在线| 国产精品亚洲欧美一级在线| 国内不卡的一区二区三区中文字幕| 亚洲天堂一区二区| 在线免费观看亚洲| 日韩高清电影一区| 丁香六月综合| 久久99伊人| 日本天堂一区| 精品一区在线| 中文字幕av一区二区三区人 | 91精品啪在线观看国产18| 国产韩日影视精品| 美女精品视频在线| 清纯唯美亚洲综合一区| 91九色精品| 国产日韩精品视频一区二区三区| 久久精品国产99国产| 激情久久中文字幕| 麻豆国产91在线播放| 亚洲深夜福利| 中文另类视频| 精品淫伦v久久水蜜桃| 国产日韩一区二区三区在线| 国产精品毛片在线看| 日韩欧美少妇| 免费av一区| 日韩国产网站| 精品国产欧美日韩一区二区三区| 日韩成人午夜精品| 久久先锋影音| 在线看片日韩| 91精品1区|