包含兩個(gè)主要的場(chǎng)景: 1、drop table后的恢復(fù) 2,、truncate table后的恢復(fù) 正文: 我們都知道,,MySQL Server都很多存儲(chǔ)引擎,并不是每種都可以進(jìn)行異常情況之下都恢復(fù),,比如drop table/tuncate table/delete table/update table /drop database又或者是ibdata文件損壞之類(lèi)的,。用的最多的就是Myisam和innodb存儲(chǔ)引擎。目前基本上都是5.5+版本了,,我想幾乎沒(méi)有人再去使用Myisam了吧,。我這里所測(cè)試都5.6,5.7版本中默認(rèn)都存儲(chǔ)引擎已經(jīng)是Innodb了,。因此這里我以Innodb引擎為例子進(jìn)行說(shuō)明,。 這里我們首先來(lái)測(cè)試innodb_file_per_table為off的情況,即表結(jié)構(gòu)和數(shù)據(jù)存在同一個(gè)文件中,。這里我分別測(cè)試了表存在主鍵和不存在主鍵的情況,,供參考。 innodb_file_per_table參數(shù)為off(有主鍵的情況) 1創(chuàng)建測(cè)試表 2備份表結(jié)構(gòu)
3刪除表
4掃描數(shù)據(jù)文件 5創(chuàng)建用于恢復(fù)的數(shù)據(jù)字典 6查詢(xún)需要恢復(fù)表的信息 7確認(rèn)數(shù)據(jù)page中數(shù)據(jù)是否存在 8抽取page中的數(shù)據(jù) 9加載數(shù)據(jù)到數(shù)據(jù)庫(kù) 我們可以看到,順利完成了drop table的恢復(fù),,而且數(shù)據(jù)完好無(wú)損,。實(shí)際上我這里還同時(shí)測(cè)試了無(wú)主鍵的情況,經(jīng)過(guò)測(cè)試都類(lèi)似,,可以進(jìn)行完美的恢復(fù),。這里不再累述。 首先這里我要利用undrop_for_innodb 這個(gè)開(kāi)源工具包(當(dāng)然需要編譯),目前該工具已經(jīng)在2017年1月宣布閉源了,,而且開(kāi)始收費(fèi),。但是我們?nèi)匀婚_(kāi)源使用之前都開(kāi)源工具包。另外這里可以告訴大家,,不久的將來(lái),,odu 也會(huì)支持MySQL. 如下是我的truncate table 測(cè)試過(guò)程: 1創(chuàng)建測(cè)試表 2備份表結(jié)構(gòu)
3truncate table
4獲取數(shù)據(jù)字典 5掃描邏輯卷 6創(chuàng)建數(shù)據(jù)字典表 該工具包提供的recover_dictionary腳本會(huì)創(chuàng)建一個(gè)test數(shù)據(jù)庫(kù),并創(chuàng)建一些數(shù)據(jù)字典表供恢復(fù)查詢(xún)使用,。同時(shí)也會(huì)在當(dāng)前目錄創(chuàng)建dictionary目錄,,該目錄下會(huì)存放數(shù)據(jù)字典信息。 7查詢(xún)需要恢復(fù)的表的index_id信息 可以看到被truncate的表的index_id 為178,,我們應(yīng)該進(jìn)一步從178 的page中獲取數(shù)據(jù),。 8確認(rèn)數(shù)據(jù)是否存在 9抽取page中的數(shù)據(jù) 抽取數(shù)據(jù)之前,必須提前準(zhǔn)備好表的表結(jié)構(gòu),,由于這里是truncate,,因此表結(jié)構(gòu)是存在的,很容易獲取,。我這里是測(cè)試,,所以之前就備份了結(jié)構(gòu)。 那么如果是drop table 呢,? 實(shí)際上我們也可以通過(guò)該工具來(lái)恢復(fù)表結(jié)構(gòu),。 10加載數(shù)據(jù)到mysql server 11驗(yàn)證數(shù)據(jù) 我們可以看到,被truncate 掉的數(shù)據(jù)被成功恢復(fù)了回來(lái),。 這里我測(cè)試的truncate table的場(chǎng)景,,其實(shí)對(duì)于drop table、delete table 恢復(fù)方法均類(lèi)似(已測(cè)試過(guò)),。另外,,對(duì)于更為嚴(yán)重的drop database 其實(shí)也是可以進(jìn)行恢復(fù)的。 當(dāng)然,,對(duì)于實(shí)際的生產(chǎn)庫(kù)來(lái)講,,數(shù)據(jù)不一定能夠恢復(fù),因?yàn)橛锌赡鼙桓采w而導(dǎo)致數(shù)據(jù)恢復(fù)不全,。MySQL 對(duì)于空間的重用機(jī)制與Oracle 有很大區(qū)別,,對(duì)于Oracle 而言,如果是delete的數(shù)據(jù),還是很難被覆蓋掉的,,對(duì)于drop 和truncate 則領(lǐng)導(dǎo)別論,。然而MySQL則有所不同,MySQL 默認(rèn)會(huì)啟動(dòng)一些purge 進(jìn)程來(lái)進(jìn)行空間重用,,這是MySQL 5.6的情況: 在MySQL 5.7 版本中更為坑爹,,MySQL 默認(rèn)會(huì)啟動(dòng)4個(gè)purge 線(xiàn)程,因此很容易就會(huì)導(dǎo)致空間被重用,,最終導(dǎo)致數(shù)據(jù)無(wú)法恢復(fù),,如下是MySQL 5.7的purge相關(guān)參數(shù): 因此,一旦你遭遇turncate table/drop table/delete /drop database等情況,,建議立刻停止服務(wù)或者停止數(shù)據(jù)庫(kù),,保留現(xiàn)場(chǎng),以防止環(huán)境進(jìn)一步惡化,,最終導(dǎo)致數(shù)據(jù)無(wú)法恢復(fù)的情況出現(xiàn),。 云和恩墨,匯集了國(guó)內(nèi)專(zhuān)業(yè)的Oracle,、MySQL等數(shù)據(jù)恢復(fù)專(zhuān)家,愿為你的數(shù)據(jù)庫(kù)保駕護(hù)航,!了解云和恩墨的數(shù)據(jù)恢復(fù)服務(wù):Recovery 福利 在本文評(píng)論區(qū)留下你真知灼見(jiàn)/心得體悟,,并在9月27號(hào)中午12點(diǎn)成為點(diǎn)贊數(shù)超過(guò)50的前2名,即可獲得《Effective MySQL之備份與恢復(fù)》,! ORA-600 2662 錯(cuò)誤的SCN增進(jìn)應(yīng)對(duì) 一則強(qiáng)行關(guān)庫(kù)引發(fā)的蝴蝶效應(yīng) |
|
來(lái)自: 數(shù)據(jù)和云 > 《待分類(lèi)》