前言
??從事互聯(lián)網(wǎng)開發(fā)這幾年黍少,參與了許多項目的架構(gòu)分析,數(shù)據(jù)庫設(shè)計处面,改過的bug不計其數(shù)厂置,寫過的sql數(shù)以萬計,從未出現(xiàn)重大紕漏魂角,但常在河邊走昵济,哪有不濕鞋,就在五一假期的頭一天野揪,我干了職業(yè)生涯中最愚蠢访忿,也是最刺激的一件事:執(zhí)行update的時候忘了添加where條件,結(jié)果更新了整張表(系統(tǒng)最重要的一張表)的時間字段斯稳。海铆。。
項目背景介紹
??簡單介紹一下項目背景:大家可以把其理解為一個文章檢索系統(tǒng)挣惰,前臺用戶端通過輸入日期卧斟、關(guān)鍵字以及文章類型可以查詢出對應(yīng)的文章內(nèi)容并查看:
??后臺管理端可以通過多維度對現(xiàn)有的文章進行維護(使用過我開發(fā)的代碼生成器的朋友一定對下面的界面很眼熟,沒錯通熄,后臺(包括界面)百分之90的代碼都是我拿它生成的):
要命的update
??當(dāng)時整個系統(tǒng)的開發(fā)工作全都壓在了我一個人的身上唆涝,而且工期很緊,只有不到一周的時間就要上線唇辨,臨危受命廊酣,只能硬扛。
??系統(tǒng)前臺使用人群主要為企業(yè)的財務(wù)人員并且使用的時間比較分散赏枚;后臺使用人群為內(nèi)部管理員(只有兩位)亡驰;每年新添加的文章數(shù)大概兩三千左右的樣子。綜合考慮下來饿幅,基本不會有什么并發(fā)量凡辱,數(shù)據(jù)量也不大,緩存是沒必要了栗恩,搜索引擎更是大材小用透乾,所以為了快,便采用SpringBoot+MySql的方式進行開發(fā)磕秤。
??最終乳乌,項目如期完成,來到了最后的線上部署階段市咆,當(dāng)時是4月30號下午三點左右汉操,在檢查數(shù)據(jù)的時候,我發(fā)現(xiàn)了一條格式有誤的日期數(shù)據(jù)蒙兰,于是在navicat執(zhí)行了這條sql磷瘤,這正是災(zāi)難的開始:
update article set addtime = '2019-07-26 00'
??芒篷。。采缚。NO针炉,wait!仰担!執(zhí)行完畢之后糊识,我意識到大事不妙,企圖rollback摔蓝,然并卵,navicat是自動提交的愉耙。贮尉。。朴沿,由于使用的是測試環(huán)境猜谚,也沒有對數(shù)據(jù)庫做任何備份。赌渣。魏铅。心中一萬匹草泥馬飄過,冷靜坚芜,我要冷靜览芳,現(xiàn)在要做的是把數(shù)據(jù)恢復(fù)到之前的樣子,也就是把數(shù)據(jù)回退到執(zhí)行這條sql之前最近的時間點鸿竖。
??我開始在網(wǎng)上查閱相關(guān)資料沧竟,發(fā)現(xiàn)開啟binlog是數(shù)據(jù)恢復(fù)的前提,如果沒有開啟缚忧,不好意思悟泵,常規(guī)辦法不可恢復(fù)!
??當(dāng)時我腦瓜嗡嗡的闪水,如果沒有開啟binlog糕非,那就真的涼涼了,我緊張的連接到遠程服務(wù)器球榆,cd到mysql的安裝目錄朽肥,內(nèi)心不斷祈禱:一定要有啊芜果!一定要有熬铣省!別搞我右钾!
??蚁吝。旱爆。。當(dāng)我看到var文件夾下的mysql-bin.000002文件時窘茁,長舒一口氣怀伦,還有的救,老天果然還是眷念我的山林。
??剩下的操作就簡單了房待,根據(jù)網(wǎng)上的信息進行匯總,得出執(zhí)行以下命令便可獲得指定數(shù)據(jù)庫指定時間段內(nèi)所有的sql語句:
/usr/local/mysql/bin/mysqlbinlog
/usr/local/mysql/var/mysql-bin.000002
# 指定數(shù)據(jù)庫名稱驼抹,注意是數(shù)據(jù)庫桑孩,不是表
--database=xxx
# 起始時間
--start-datetime='2020-04-26 00:00:00'
# 結(jié)束時間
--stop-datetime='2020-04-30 15:00:00' > backup.sql
??為了保險起見,我備份了mysql目錄下的所有文件框冀,然后執(zhí)行了以上命令流椒,結(jié)果意外的順利,當(dāng)前目錄下生成了backup.sql文件明也。
??然后我drop掉命令中指定的database宣虾,執(zhí)行backup.sql腳本,一行行OK閃過温数,持續(xù)了十秒左右的樣子戛然而止绣硝,期間沒有報錯,感覺可以撑刺,有戲鹉胖!在navicat中刷新,打開article表猜煮,謝天謝地次员,數(shù)據(jù)恢復(fù)了:
??最后,項目成功部署上線王带,一個update引發(fā)的慘案也就此悄無聲息的畫上了句號淑蔚。
結(jié)語
??通過此次事件,讓我明白了備份的重要性愕撰,俗話說得好:有備無患刹衫。其次,在執(zhí)行update搞挣,delete語句時带迟,一定要記得開啟事務(wù),這樣一旦出了問題可以rollback囱桨!
附:喜歡的朋友可以關(guān)注公眾號 “螺旋編程極客” 第一時間獲取最新內(nèi)容更新仓犬!