MySQL誤刪數(shù)據(jù)救命指南:必收藏
首先看下MySQL誤刪數(shù)據(jù)排名最前的幾種是:
1.誤刪文件
2.誤刪庫、表
3.錯誤全表刪除 / 更新
4.升級操作失誤
都來看看你***過幾個,hoho。
簡單說下我親手造的一個大事故吧。
那大概是一個春暖花開的季節(jié),我的內(nèi)心是激動澎湃的,因為已經(jīng)安排了休假計劃。在這前幾天,已經(jīng)把一個新項目的數(shù)據(jù)庫環(huán)境都部署好了,包括自動化備份。
等我美美的出去玩的時候,悲劇發(fā)生了,業(yè)務要求進行數(shù)據(jù)回滾,但發(fā)現(xiàn)備份文件不可用,原因是 備份時指定的字符集和表字符集不一致。我勒個擦,原來該項目采用新的字符集,但是我沒有認真檢查確認并修改備份腳本,結(jié)果導致備份失效。***,因為這個事,當季度績效結(jié)果被降檔,boss也為此背鍋~
好吧,回到正題,先說幾點我平時預防誤操作導致文件/數(shù)據(jù)丟失不成熟的建議:
1.欲刪除文件時,將rm命令改成mv,可在系統(tǒng)層面將rm命令做個alias(或參考 Windows / Mac OSX做法,刪除文件時先進回收站)。
刪除數(shù)據(jù)庫、表時,不要用drop命令,而是rename到一個專用歸檔庫里;
2.刪除表中數(shù)據(jù)時,不要直接用delete或truncate命令,尤其是truncate命令,目前不支持事務,無法回滾。
3.用delete命令刪除數(shù)據(jù)時,應當先顯式開啟事務,這樣誤操作時,還有機會進行回滾。
4.要大批量刪除數(shù)據(jù)時,可以將這些數(shù)據(jù)insert...select到一個新表,確認無誤后再刪除。或者反其道行之,把要保留的數(shù)據(jù)寫到新表,然后將表重命名對掉。
5.執(zhí)行重要命令之前,先準備好相關(guān)命令,再三確認無誤才之行,對于新鳥而言,***請你的boss坐你旁邊鎮(zhèn)場幾次,否則極有可能會連累大家~
以上幾條,也是我自己奉行的原則。總之,要時刻保持對線上生產(chǎn)環(huán)境的敬畏之心。雖說現(xiàn)在大部分操作可以靠平臺來完成了,但平臺也不是***的,不也發(fā)生過平臺本身的缺陷造成數(shù)據(jù)丟失、代碼回滾、部署失誤等事故嘛,我就不點名了。
做好備份,不管是物理備份還是邏輯備份!
做好備份,不管是物理備份還是邏輯備份!
做好備份,不管是物理備份還是邏輯備份!
重要的事情說三遍都不嫌多。
說完預防措施,我們再說萬一發(fā)生誤操作時,怎么以最快速度進行補救。 我們分別列舉幾種常見的情況:
1.執(zhí)行DROP DATABASE / DROP TABLE命令誤刪庫表,如果碰巧采用共享表空間模式的話,還有恢復的機會。如果沒有,請直接從備份文件恢復吧。神馬,你連備份文件都沒有?那麻煩退出DBA屆吧,一個連備份都懶得做的人,不配成為DBA的。
2.接上,采用共享表空間模式下,誤刪后立刻殺掉(kill -9)mysql相關(guān)進程(mysqld_safe、mysqld),然后嘗試從ibdataX文件中恢復數(shù)據(jù)。
3.誤刪除正在運行中的MySQL表ibd或ibdataX文件。請立即申請對該實例進行維護,當然,不是指把實例關(guān)閉,而是把業(yè)務暫停,或者把該實例從線上環(huán)境摘除,不再寫入新數(shù)據(jù),然后利用linux系統(tǒng)的proc文件特點,把該ibd文件從內(nèi)存中拷出來,再進行恢復,因為此時mysqld實例在內(nèi)存中是保持打開該文件的,切記這時不要把mysqld實例關(guān)閉了。
4.接上,把復制出來的ibdataX或ibd文件拷貝回datadir后,重啟mysqld進入recovery模式,innodb_force_recovery 選項從 0 - 6 逐級測試,直至能備份出(整個實例或單表的)所有數(shù)據(jù)后,再重建實例(或單表),恢復數(shù)據(jù)。
5.未開啟事務模式下,執(zhí)行delete誤刪數(shù)據(jù)。意識到后立即將mysqld(以及mysqld_safe)進程殺掉(kill -9),不要任何猶豫,然后再用工具將表空間數(shù)據(jù)讀取出來。因為執(zhí)行delete刪除后,實際數(shù)據(jù)并沒被物理清除,只是先打上deleted-mark標簽,后續(xù)再統(tǒng)一清理,因此還有時間差。
5.執(zhí)行truncate誤清整表。如果沒使用共享表空間模式的話,基本別想了,走備份恢復+binlog吧。
6.執(zhí)行不帶where條件的update,或者update錯數(shù)據(jù)。也別費勁了,走備份恢復+binlog吧。





























