MySql從刪庫到跑路 那年我真的差點跑路了

2021-09-11 20:41:26 字數 4464 閱讀 7952

人生大起大落落落落落落,實在是太刺激了,下面這真是乙個悲傷的故事。

那年公司 erp 系統剛進行公升級。

因為公司陸續上了 mes 和 pdm 系統。為了加快整個公司資訊化平台的統一,請了個第三方公司來做中間介面。

然後故事開始了。

某乙個晚上,第三方人員問我要 erp 的 sa 密碼。

我很警惕:「你要幹嘛?」

「我測試一下中間表。」

「有沒有寫表的操作?」

「沒有,只有讀表的操作。」

於是我放心的給了 sa 密碼。給了 vpn 許可權通道。放她進來了。

十分鐘後……

她帶著哭腔打**來(是的,對方做測試的是個 93 年的萌妹子。)

「吳哥哥,伺服器中毒了。。。。」

我當時還在逛果殼呢,一聽她說我伺服器中毒了,我表示無比淡定。還以大哥的經驗教訓了一頓她。

「叫你不要往我伺服器傳外掛程式嘛,這次幫你解決一下,下次不准了喲。」

我認為是小 case 呢,不就中毒了嘛,系統往回滾一天就好了。

然後悲劇的事情就出現了,遠端進不去,於是我就去機房本地登入,居然也進不去。

我不死心,強制重啟,居然還是進不去。我的伺服器系統就這樣崩了。。。

好在那幾天在做開發,系統沒有啟用,於是我和我的老闆匯報了這個情況:

「老大,我們伺服器系統崩了。」

「哦,那就搞好它讓它別崩。」 果然是霸道總裁啊。

當時資料和應用伺服器我都是分開跑的,所以應用伺服器奔潰了,我覺得也沒多大事,就重新做系統吧。於是我重新做了個系統,然後喊萌妹子上來搭平台。

「小劉啊,你可害慘我了,乙個下午給你重做伺服器系統了,我基礎環境都配置好了,你上來搭平台吧。」

萌妹子那是無比的歉意啊,又是答應請我吃飯又是答應請我看電影的。我都想系統再崩潰一次了。

按理說這樣應該是沒問題了,就在我走出機房,在外面抽了根菸,45 度仰望了一下天空,聯想了一下和萌妹子點個 9分熟的牛排,在喝一口二鍋頭這樣浪漫的晚餐的時候。**來了。

來**的是萌妹子的老闆。

「小吳,我想找一下 information.db 和 mfmedia.db 這兩個總表沒找到,你給我找一下。」

我都蒙了,從來沒人問過我這樣的問題,難道她老闆不是 it 行業的。

「資料庫檔案都在目錄樹里啊,自己去找啊。」

「沒有。」

於是我登上伺服器一看,我傻了。所有的表都空了,所有的表都靜靜的躺在那,但是裡面都空了。。。

不可能啊,我資料庫是放在另外一台伺服器上的,怎麼可能會沒有了。

於是我問萌妹子:「***,你到底做了什麼操作啊,為毛我資料庫都沒了。」

萌妹子說:「我啥也沒幹啊,只是按照步驟一路點 yes。」

我才想起來,在第一次配置基礎環境的時候,建賬套會提示是否初始環境,如果點是了,資料庫就會被初始化,然後這位萌妹子傻傻的點了是。

「你知道不知道你幹了什麼,公司 06 年到現在所有的資料,財務的,**鏈的,進銷存的全部都在這台伺服器裡,200 多個 g資料,因為你乙個是,全沒了。」

萌妹子也嚇蒙了,話都說不出來了。

沒辦法,我再給我老闆打**。

「老闆,有個好訊息,有個壞訊息。」

「直接說壞的。」 我就喜歡我們老闆這麼直接。

「恩。。恩。。那個。。就是那個。erp 的資料沒了。」

「哦,那就找回來。」 老闆還是那麼的霸氣。我特麼都要愛上他了。

「老闆,我想你沒明白這個的嚴重性。erp 資料沒了,從 06 年開始的都沒了,這意味著就算找回來,整理所有的表,排錯也需要 3天左右時間,到時候所有的生產都要暫時停止。如果找不回來,我們可能就要倒閉了。」

我忽然有種掌握天下蒼生的感覺。。。

對面沉默了 5 秒後,爆吼了一句:「吳 xx,你給我滾到我辦公室來!!」

中間和老闆手握手談心,被老闆親切慰問的細節跳過不表。

當時公司高層對資料安全還沒有那麼重視,之前預算做的專案,我已經做了備份的計畫書,一直沒被審批下來,現在估計悔得腸子都清了。

於是我開始漫長的資料恢復之旅。

我之前已經做了個本地備份的計畫,每天晚上會備份一次。我把希望都放在了它身上。等我把備份的資料庫附件上去,發現時間居然都是兩個星期之前的。

而且還有一些新錶都沒有,我聯絡對方,對方告知研發人員兩個星期前做測試的時候把備份計畫關了。。。

我心裡萬頭草泥馬奔騰而過。

最後沒有辦法,把老伺服器又翻了出來,翻出之前的老資料,開始轉換。

期間老闆給我簡訊:「資料恢復進行的怎麼樣了呢。」

「報告,正在穩步進行中,按照目前的狀況,可恢復的可能性超過 90%。」 別問我 90% 怎麼算出來的,我就是哄他才這樣說的。

「唉,真是心急呀,睡都睡不著。小吳呀,當初要是聽你的,上了備份該多好呀。」 現在知道後悔了,哼哼。

「老大別擔心,我會搞定的。」 是的,作為一位負責的員工,我就是這麼讓老大心安。

「恩,那就交給你了哦,熬夜少抽點菸哦。」 哎呀,瞬間覺得我老大萌萌噠有沒有。

這裡花了我乙個晚上加乙個白天。

資料轉換好了,還有一些時間差的資料沒法找到。於是通知各個部門,找單據,開始往裡面補單子,一條一條的按照業務流程補進去。

為了協同更方便,在會議室加設了幾十台電腦集體辦公。。。

在大家一片怨聲載道中,三天時間,終於把資料恢復了過來。三天內我沒離開機房超過 10 公尺,吃喝拉撒都在機房,不對,拉撒不在。

這件事情造成的後果:

大部分員工放假三天,我加班三天三夜。

本來很愛我的大部分員工因為單據事件,集體轉為黑我恨我了。

公司立馬批了我的計畫,冷備,熱備,異地容災,全部上全了。

4.我揮刀自宮,自己罰了自己,扣除了自己乙個月工資。

5.老闆到現在還是在懷疑請的那家公司已經被我們競爭對手收買,是故意來破壞我們的。

6.萌妹子拉黑了我。

這真是個悲傷的故事。

看完了這個悲傷的故事,我們要回歸理性,mysql 資料庫誤刪除後怎麼辦?

在日常運維工作中,對於資料庫的備份是至關重要的!資料庫對於**的重要性使得我們對 mysql 資料庫的管理不容有失!

然而是人總難免會犯錯誤,說不定哪天大腦短路了,誤操作把資料庫給刪除了,怎麼辦?下面,就 mysql 資料庫誤刪除後的恢復方案進行說明。

工作場景

mysql 資料庫每晚 12:00 自動完全備份。

某天早上上班,9 點的時候,一同事犯暈 drop 了乙個資料庫!

需要緊急恢復!可利用備份的資料檔案以及增量的 binlog 檔案進行資料恢復。

資料恢復思路

利用全備的 sql 檔案中記錄的 change master 語句,binlog 檔案及其位置點資訊,找出 binlog 檔案中增量的那部分。

用 mysqlbinlog 命令將上述的 binlog 檔案匯出為 sql 檔案,並剔除其中的 drop 語句。

通過全備檔案和增量 binlog 檔案的匯出 sql 檔案,就可以恢復到完整的資料。

例項說明

首先,要確保 mysql 開啟了 binlog 日誌功能。在 /etc/my.cnf 檔案裡的 [mysqld] 區塊新增,如下圖,然後重啟 mysql服務。

1.在 ops 庫下建立一張表 customers

2.現在進行全備份

引數說明:

-b:指定資料庫

-f:重新整理日誌

-r:備份儲存過程等

-x:鎖表

–master-data:在備份語句裡新增 change master 語句以及 binlog 檔案及位置點資訊

3.再次插入資料

4.此時誤操作,刪除了 test 資料庫

此時,全備之後到誤操作時刻之間,使用者寫入的資料在 binlog 中,需要恢復出來!

5.檢視全備之後新增的 binlog 檔案

這是全備時刻的 binlog 檔案位置,即 mysql-bin.000002 的 106 行,因此在該檔案之前的 binlog檔案中的資料都已經包含在這個全備的 sql 檔案中了。

6.移動 binlog 檔案,並匯出為 sql 檔案

剔除其中的 drop 語句,檢視 mysql 的資料存放目錄,由下面可知是在 /var/lib/mysql 下,將 binlog 檔案匯出 sql檔案,並 vim 編輯它刪除其中的 drop 語句。

注意:在恢復全備資料之前必須將該 binlog 檔案移出,否則恢復過程中,會繼續寫入語句到 binlog,最終導致增量恢復資料部分變得比較混亂。

7.恢復資料

檢視資料庫,看看 ops 庫在不在。

此時恢復了全備時刻的資料。接著,使用 002bin.sql 檔案恢復全備時刻到刪除資料庫之間,新增的資料。

再次檢視資料庫,發現全備份到刪除資料庫之間的那部分資料也恢復了!!

以上就是 mysql 資料庫增量資料恢復的例項過程!

最後,總結幾點:

本案例適用於人為 sql 語句造成的誤操作或者沒有主從複製等的熱備情況宕機時的修復。

恢復條件為 mysql 要開啟 binlog 日誌功能,並且要全備和增量的所有資料。

恢復時建議對外停止更新,即禁止更新資料庫。

先恢復全量,然後把全備時刻點以後的增量日誌,按順序恢復成 sql 檔案,然後把檔案中有問題的 sql語句刪除(也可通過時間和位置點),再恢復到資料庫。

MySQL,從刪庫到跑路

1 刪除表中指定記錄 mariadb vincen delete from 資料表名 where 指定條件 2 同時刪除表中的記錄 mariadb vincen delete from 資料表名 where 欄位名 between 條件1 and 條件2 3 刪除表中所有的記錄 mariadb vi...

從刪庫到跑路 2

1 查詢整張表的所有資料 select from myfirst schema.pets 如果當前表的資料比較多,只想看到特定行的資料 select from pets where name shagou 在上面這個查詢語句中,可以制定任何列為條件 select species from pets ...

刪庫不必跑路,自己動手MySQL資料恢復,真香

今天專案上需要對mysql進行資料修復,通過比較各種方案和工具,準備使用binlog2sql工具進行 資料閃回 具體怎麼使用呢,安排。以恢復某個庫的某個表為例,準備兩個一模一樣地mysql,安裝上,推薦用yum rpm方式安裝,否則,配置起來能否一次性安裝成功,看運氣了。源庫 mysql 5.7.3...