不小心刪除了公司數(shù)據(jù)庫,是什么樣一種體驗(yàn)?
人生大起大落落落落落落,實(shí)在是太刺激了,下面這真是一個(gè)悲傷的故事。
那年公司 ERP 系統(tǒng)剛進(jìn)行升級(jí)。
因?yàn)楣娟懤m(xù)上了 MES 和 PDM 系統(tǒng)。為了加快整個(gè)公司信息化平臺(tái)的統(tǒng)一,請(qǐng)了個(gè)第三方公司來做中間接口。
然后故事開始了。
某一個(gè)晚上,第三方人員問我要 ERP 的 SA 密碼。
我很警惕:“你要干嘛?”
“我測試一下中間表。”
“有沒有寫表的操作?”
“沒有,只有讀表的操作。”
于是我放心的給了 SA 密碼。給了 VPN 權(quán)限通道。放她進(jìn)來了。
十分鐘后…..
她帶著哭腔打電話來(是的,對(duì)方做測試的是個(gè) 93 年的萌妹子。)
“吳哥哥,服務(wù)器中毒了。。。。”
我當(dāng)時(shí)還在逛果殼呢,一聽她說我服務(wù)器中毒了,我表示無比淡定。還以大哥的經(jīng)驗(yàn)教訓(xùn)了一頓她。
“叫你不要往我服務(wù)器傳插件嘛,這次幫你解決一下,下次不準(zhǔn)了喲。”
我認(rèn)為是小 case 呢,不就中毒了嘛,系統(tǒng)往回滾一天就好了。
然后悲劇的事情就出現(xiàn)了,遠(yuǎn)程進(jìn)不去,于是我就去機(jī)房本地登錄,居然也進(jìn)不去。
我不死心,強(qiáng)制重啟,居然還是進(jìn)不去。我的服務(wù)器系統(tǒng)就這樣崩了。。。
好在那幾天在做開發(fā),系統(tǒng)沒有啟用,于是我和我的老板匯報(bào)了這個(gè)情況:
“老大,我們服務(wù)器系統(tǒng)崩了。”
“哦,那就搞好它讓它別崩。” 果然是霸道總裁啊。
當(dāng)時(shí)數(shù)據(jù)和應(yīng)用服務(wù)器我都是分開跑的,所以應(yīng)用服務(wù)器奔潰了,我覺得也沒多大事,就重新做系統(tǒng)吧。于是我重新做了個(gè)系統(tǒng),然后喊萌妹子上來搭平臺(tái)。
“小劉啊,你可害慘我了,一個(gè)下午給你重做服務(wù)器系統(tǒng)了,我基礎(chǔ)環(huán)境都配置好了,你上來搭平臺(tái)吧。”
萌妹子那是無比的歉意啊,又是答應(yīng)請(qǐng)我吃飯又是答應(yīng)請(qǐng)我看電影的。我都想系統(tǒng)再崩潰一次了。
按理說這樣應(yīng)該是沒問題了,就在我走出機(jī)房,在外面抽了根煙,45 度仰望了一下天空,聯(lián)想了一下和萌妹子點(diǎn)個(gè) 9 分熟的牛排,在喝一口二鍋頭這樣浪漫的晚餐的時(shí)候。電話來了。
來電話的是萌妹子的老板。
“小吳,我想找一下 information.db 和 mfmedia.db 這兩個(gè)總表沒找到,你給我找一下。”
我都蒙了,從來沒人問過我這樣的問題,難道她老板不是 IT 行業(yè)的。
“數(shù)據(jù)庫文件都在目錄樹里啊,自己去找啊。”
“沒有。”
于是我登上服務(wù)器一看,我傻了。所有的表都空了,所有的表都靜靜的躺在那,但是里面都空了。。。
不可能啊,我數(shù)據(jù)庫是放在另外一臺(tái)服務(wù)器上的,怎么可能會(huì)沒有了。
于是我問萌妹子:“XXX,你到底做了什么操作啊,為毛我數(shù)據(jù)庫都沒了。”
萌妹子說:“我啥也沒干啊,只是按照步驟一路點(diǎn) YES。”
我才想起來,在第一次配置基礎(chǔ)環(huán)境的時(shí)候,建賬套會(huì)提示是否初始環(huán)境,如果點(diǎn)是了,數(shù)據(jù)庫就會(huì)被初始化,然后這位萌妹子傻傻的點(diǎn)了是。
“你知道不知道你干了什么,公司 06 年到現(xiàn)在所有的數(shù)據(jù),財(cái)務(wù)的,供應(yīng)鏈的,進(jìn)銷存的全部都在這臺(tái)服務(wù)器里,200 多個(gè) G 數(shù)據(jù),因?yàn)槟阋粋€(gè)是,全沒了。”
萌妹子也嚇蒙了,話都說不出來了。
沒辦法,我再給我老板打電話。
“老板,有個(gè)好消息,有個(gè)壞消息。”
“直接說壞的。” 我就喜歡我們老板這么直接。
“恩。。恩。。那個(gè)。。就是那個(gè)。ERP 的數(shù)據(jù)沒了。”
“哦,那就找回來。” 老板還是那么的霸氣。我特么都要愛上他了。
“老板,我想你沒明白這個(gè)的嚴(yán)重性。ERP 數(shù)據(jù)沒了,從 06 年開始的都沒了,這意味著就算找回來,整理所有的表,排錯(cuò)也需要 3 天左右時(shí)間,到時(shí)候所有的生產(chǎn)都要暫時(shí)停止。如果找不回來,我們可能就要倒閉了。”
我忽然有種掌握天下蒼生的感覺。。。
對(duì)面沉默了 5 秒后,爆吼了一句:“吳 XX,你給我滾到我辦公室來!!”
中間和老板手握手談心,被老板親切慰問的細(xì)節(jié)跳過不表。
當(dāng)時(shí)公司高層對(duì)數(shù)據(jù)安全還沒有那么重視,之前預(yù)算做的項(xiàng)目,我已經(jīng)做了備份的計(jì)劃書,一直沒被審批下來,現(xiàn)在估計(jì)悔得腸子都清了。
于是我開始漫長的數(shù)據(jù)恢復(fù)之旅。
我之前已經(jīng)做了個(gè)本地備份的計(jì)劃,每天晚上會(huì)備份一次。我把希望都放在了它身上。等我把備份的數(shù)據(jù)庫附件上去,發(fā)現(xiàn)時(shí)間居然都是兩個(gè)星期之前的。
而且還有一些新表都沒有,我聯(lián)系對(duì)方,對(duì)方告知研發(fā)人員兩個(gè)星期前做測試的時(shí)候把備份計(jì)劃關(guān)了。。。
我心里萬頭草泥馬奔騰而過。
最后沒有辦法,把老服務(wù)器又翻了出來,翻出之前的老數(shù)據(jù),開始轉(zhuǎn)換。
期間老板給我短信:“數(shù)據(jù)恢復(fù)進(jìn)行的怎么樣了呢。”
“報(bào)告,正在穩(wěn)步進(jìn)行中,按照目前的狀況,可恢復(fù)的可能性超過 90%。” 別問我 90% 怎么算出來的,我就是哄他才這樣說的。
“唉,真是心急呀,睡都睡不著。小吳呀,當(dāng)初要是聽你的,上了備份該多好呀。” 現(xiàn)在知道后悔了,哼哼。
“老大別擔(dān)心,我會(huì)搞定的。” 是的,作為一位負(fù)責(zé)的員工,我就是這么讓老大心安。
“恩,那就交給你了哦,熬夜少抽點(diǎn)煙哦。” 哎呀,瞬間覺得我老大萌萌噠有沒有。
這里花了我一個(gè)晚上加一個(gè)白天。
數(shù)據(jù)轉(zhuǎn)換好了,還有一些時(shí)間差的數(shù)據(jù)沒法找到。于是通知各個(gè)部門,找單據(jù),開始往里面補(bǔ)單子,一條一條的按照業(yè)務(wù)流程補(bǔ)進(jìn)去。
為了協(xié)同更方便,在會(huì)議室加設(shè)了幾十臺(tái)電腦集體辦公。。。
在大家一片怨聲載道中,三天時(shí)間,終于把數(shù)據(jù)恢復(fù)了過來。三天內(nèi)我沒離開機(jī)房超過 10 米,吃喝拉撒都在機(jī)房,不對(duì),拉撒不在。
這件事情造成的后果:
1. 大部分員工放假三天,我加班三天三夜。
2. 本來很愛我的大部分員工因?yàn)閱螕?jù)事件,集體轉(zhuǎn)為黑我恨我了。
3. 公司立馬批了我的計(jì)劃,冷備,熱備,異地容災(zāi),全部上全了。
4.我揮刀自宮,自己罰了自己,扣除了自己一個(gè)月工資。
5.老板到現(xiàn)在還是在懷疑請(qǐng)的那家公司已經(jīng)被我們競爭對(duì)手收買,是故意來破壞我們的。
6.萌妹子拉黑了我。
這真是個(gè)悲傷的故事。
看完了這個(gè)悲傷的故事,我們要回歸理性,MySQL 數(shù)據(jù)庫誤刪除后怎么辦?
在日常運(yùn)維工作中,對(duì)于數(shù)據(jù)庫的備份是至關(guān)重要的!數(shù)據(jù)庫對(duì)于網(wǎng)站的重要性使得我們對(duì) MySQL 數(shù)據(jù)庫的管理不容有失!
然而是人總難免會(huì)犯錯(cuò)誤,說不定哪天大腦短路了,誤操作把數(shù)據(jù)庫給刪除了,怎么辦?下面,就 MySQL 數(shù)據(jù)庫誤刪除后的恢復(fù)方案進(jìn)行說明。
工作場景
MySQL 數(shù)據(jù)庫每晚 12:00 自動(dòng)完全備份。
某天早上上班,9 點(diǎn)的時(shí)候,一同事犯暈 drop 了一個(gè)數(shù)據(jù)庫!
需要緊急恢復(fù)!可利用備份的數(shù)據(jù)文件以及增量的 binlog 文件進(jìn)行數(shù)據(jù)恢復(fù)。
數(shù)據(jù)恢復(fù)思路
利用全備的 SQL 文件中記錄的 CHANGE MASTER 語句,binlog 文件及其位置點(diǎn)信息,找出 binlog 文件中增量的那部分。
用 MySQLbinlog 命令將上述的 binlog 文件導(dǎo)出為 SQL 文件,并剔除其中的 drop 語句。
通過全備文件和增量 binlog 文件的導(dǎo)出 SQL 文件,就可以恢復(fù)到完整的數(shù)據(jù)。
實(shí)例說明
首先,要確保 MySQL 開啟了 binlog 日志功能。在 /etc/my.cnf 文件里的 [mysqld] 區(qū)塊添加,如下圖,然后重啟 MySQL 服務(wù)。
1.在 ops 庫下創(chuàng)建一張表 customers
2.現(xiàn)在進(jìn)行全備份
參數(shù)說明:
-B:指定數(shù)據(jù)庫
-F:刷新日志
-R:備份存儲(chǔ)過程等
-x:鎖表
–master-data:在備份語句里添加 CHANGE MASTER 語句以及 binlog 文件及位置點(diǎn)信息
3.再次插入數(shù)據(jù)
4.此時(shí)誤操作,刪除了 test 數(shù)據(jù)庫
此時(shí),全備之后到誤操作時(shí)刻之間,用戶寫入的數(shù)據(jù)在 binlog 中,需要恢復(fù)出來!
5.查看全備之后新增的 binlog 文件
這是全備時(shí)刻的 binlog 文件位置,即 mysql-bin.000002 的 106 行,因此在該文件之前的 binlog 文件中的數(shù)據(jù)都已經(jīng)包含在這個(gè)全備的 SQL 文件中了。
6.移動(dòng) binlog 文件,并導(dǎo)出為 SQL 文件
剔除其中的 drop 語句,查看 MySQL 的數(shù)據(jù)存放目錄,由下面可知是在 /var/lib/mysql 下,將 binlog 文件導(dǎo)出 SQL 文件,并 vim 編輯它刪除其中的 drop 語句。
注意:在恢復(fù)全備數(shù)據(jù)之前必須將該 binlog 文件移出,否則恢復(fù)過程中,會(huì)繼續(xù)寫入語句到 binlog,最終導(dǎo)致增量恢復(fù)數(shù)據(jù)部分變得比較混亂。
7.恢復(fù)數(shù)據(jù)
查看數(shù)據(jù)庫,看看 ops 庫在不在。
此時(shí)恢復(fù)了全備時(shí)刻的數(shù)據(jù)。接著,使用 002bin.sql 文件恢復(fù)全備時(shí)刻到刪除數(shù)據(jù)庫之間,新增的數(shù)據(jù)。
再次查看數(shù)據(jù)庫,發(fā)現(xiàn)全備份到刪除數(shù)據(jù)庫之間的那部分?jǐn)?shù)據(jù)也恢復(fù)了!!
以上就是 MySQL 數(shù)據(jù)庫增量數(shù)據(jù)恢復(fù)的實(shí)例過程!
最后,總結(jié)幾點(diǎn):
本案例適用于人為 SQL 語句造成的誤操作或者沒有主從復(fù)制等的熱備情況宕機(jī)時(shí)的修復(fù)。
恢復(fù)條件為 MySQL 要開啟 binlog 日志功能,并且要全備和增量的所有數(shù)據(jù)。
恢復(fù)時(shí)建議對(duì)外停止更新,即禁止更新數(shù)據(jù)庫。
先恢復(fù)全量,然后把全備時(shí)刻點(diǎn)以后的增量日志,按順序恢復(fù)成 SQL 文件,然后把文件中有問題的 SQL 語句刪除(也可通過時(shí)間和位置點(diǎn)),再恢復(fù)到數(shù)據(jù)庫。