線上數(shù)據(jù)被回滾兩次我都做了哪些不正確的操作

來自公#眾#號(hào):新世界雜貨鋪

程序猿最大的悲哀是什么!

經(jīng)歷了這兩次事故后,筆者覺得最大的悲哀莫過于半夜打電話給DBA請(qǐng)求幫忙恢復(fù)數(shù)據(jù)。程序猿和PM之間的戰(zhàn)斗往往還有來有回,而筆者碰上DBA之后撒会,那可真是求人辦事,怎么慫怎么來师妙,只要DBA大爺高興诵肛!

為了以后盡量少跪舔DBA大爺,筆者將親身經(jīng)歷的兩次事故記錄下來以提醒自己默穴。

第一次數(shù)據(jù)回滾

PM是需求的生產(chǎn)者怔檩,程序猿是需求的消費(fèi)者,這二者就是典型的生產(chǎn)者與消費(fèi)者模型蓄诽。因此本次事故的根因還是PM提出了需求薛训,故筆者認(rèn)為只要PM不再提需求就不再有事故。

唉仑氛!快醒醒乙埃,別做夢(mèng)了!

image

回到事故的本身锯岖,筆者先描述一下當(dāng)時(shí)的背景。

PM有大量的數(shù)據(jù)需要緊急更新到線上出吹。這需求有多緊急呢遇伞?PM要繞過QA驗(yàn)證,直接在線上先用少量數(shù)據(jù)進(jìn)行測(cè)試,少量數(shù)據(jù)驗(yàn)證通過后就更新所有剩余的數(shù)據(jù)跳芳。

結(jié)合筆者所在公司的業(yè)務(wù)場(chǎng)景孽水,筆者按照以下步驟完成了本次數(shù)據(jù)更新测柠。

1轰胁、將需要更新的數(shù)據(jù)使用mysqldump進(jìn)行備份赃阀。

mysqldump --replace -f --single-transaction -t \
-h hostname -u user -P 3936 -p dbname tablename  \
--where="id in (1,2,3)"  > tablename.sql

2懂缕、開發(fā)一個(gè)腳本直接調(diào)用線上已有更新數(shù)據(jù)的接口(開發(fā)時(shí)筆者已經(jīng)在測(cè)試環(huán)境自測(cè))。

3、在線上先更新少量數(shù)據(jù)子库,并更新修改數(shù)據(jù)部分的緩存,PM對(duì)少量數(shù)據(jù)進(jìn)行驗(yàn)證脖捻。

4、PM確認(rèn)該部分?jǐn)?shù)據(jù)驗(yàn)證通過后,開始對(duì)剩余數(shù)據(jù)進(jìn)行線上更新操作率寡。

初看上面的步驟好像沒什么大問題,但實(shí)際結(jié)果卻是狠狠地打了筆者的臉。下面庙楚,筆者就好好掰扯掰扯到底是哪些原因造成了本次事故酪捡。

1、更新接口邏輯沒有理清楚纳账,導(dǎo)致線上數(shù)據(jù)更新錯(cuò)誤逛薇。

該接口是一個(gè)比較老的服務(wù)且相關(guān)文檔少,筆者因?yàn)闆]有梳理清楚所有邏輯疏虫,調(diào)用接口時(shí)部分?jǐn)?shù)據(jù)參數(shù)傳遞有誤金刁,導(dǎo)致線上數(shù)據(jù)更新錯(cuò)誤帅涂。

2、更新接口實(shí)現(xiàn)有問題尤蛮,調(diào)用服務(wù)后媳友,刪除了關(guān)聯(lián)表的數(shù)據(jù),所以需要恢復(fù)产捞。

如果只是上述第一個(gè)問題醇锚,筆者自己備份的replace into語句就可完成數(shù)據(jù)的恢復(fù),但很明顯問題不止于此坯临。當(dāng)事故發(fā)生后筆者開始對(duì)該服務(wù)邏輯進(jìn)行二次梳理焊唬,發(fā)現(xiàn)此接口對(duì)主表的關(guān)聯(lián)表也進(jìn)行了更新而且更新邏輯為先刪除關(guān)聯(lián)數(shù)據(jù)然后插入新的關(guān)聯(lián)數(shù)據(jù)。只是如此倒也罷了看靠,關(guān)鍵是該接口的實(shí)現(xiàn)者將所有請(qǐng)求參數(shù)作為一個(gè)關(guān)聯(lián)數(shù)組并將此關(guān)聯(lián)數(shù)組傳遞給所有函數(shù)赶促。好家伙,各個(gè)具有不同業(yè)務(wù)功能的函數(shù)傳遞的參數(shù)都是一樣的挟炬,這導(dǎo)致筆者第一次梳理邏輯時(shí)無法完全理清楚各個(gè)業(yè)務(wù)函數(shù)真實(shí)需要的數(shù)據(jù)到底是什么鸥滨。

關(guān)聯(lián)數(shù)據(jù)被刪除筆者也沒有備份,最后只好跪舔DBA大大幫忙進(jìn)行數(shù)據(jù)回滾谤祖。

警告?:代碼不清晰婿滓,程序猿淚兩行!

3粥喜、未經(jīng)過QA的保證凸主,就直接在線上測(cè)試。

筆者自己雖然在測(cè)試環(huán)境進(jìn)行了簡(jiǎn)單測(cè)試额湘,但是程序猿的本職還是開發(fā)不能耗費(fèi)過多的精力去完成QA的工作卿吐,而PM很明顯也不夠?qū)I(yè),這才在質(zhì)量保證環(huán)節(jié)出了錯(cuò)并擴(kuò)大了線上的錯(cuò)誤范圍锋华。

4嗡官、測(cè)試時(shí)未在無緩存環(huán)境下進(jìn)行驗(yàn)證。

初始供置,PM對(duì)少量數(shù)據(jù)的驗(yàn)證結(jié)果是沒有問題的谨湘,但是當(dāng)所有數(shù)據(jù)更新完成后緩存已經(jīng)開始逐步重建绽快,數(shù)據(jù)有誤和數(shù)據(jù)被刪的問題就開始暴露了芥丧。這是因?yàn)楣P者只更新了PM想要驗(yàn)證的數(shù)據(jù)的緩存,卻沒更新關(guān)聯(lián)數(shù)據(jù)部分的緩存坊罢,因此只有等這部分緩存自然失效問題才逐漸顯現(xiàn)续担。

后續(xù)

DBA對(duì)數(shù)據(jù)進(jìn)行回滾后,批量更新數(shù)據(jù)還得繼續(xù)盎詈ⅰ物遇!狠心的PM愣是逼著筆者大半夜修好問題繼續(xù)驗(yàn)證,唯一值得高興的可能就是這次僅更新少量數(shù)據(jù)第二天繼續(xù)更新剩余數(shù)據(jù)。最后询兴,筆者修好問題并成功地更新完全部數(shù)據(jù)乃沙。

第二次數(shù)據(jù)回滾

PM又又又提出批量更新數(shù)據(jù)的需求了,不過這次筆者信心滿滿诗舰,畢竟這次需求和第一次需求幾乎一樣警儒,唯一的區(qū)別是PM指定部分?jǐn)?shù)據(jù)不需要更新(這部分PM給到的數(shù)據(jù)是有問題的,所以不更新)眶根。

但是人怎么可能不犯錯(cuò)呢蜀铲,筆者忘記了部分?jǐn)?shù)據(jù)不需要更新這個(gè)點(diǎn),最后正確的和不正確的數(shù)據(jù)都更新至線上属百。萬萬沒想到记劝,經(jīng)歷了第一次數(shù)據(jù)回滾之后還能遭遇第二次數(shù)據(jù)回滾,筆者心態(tài)是真的崩了族扰。

image

事情已經(jīng)發(fā)生厌丑,筆者也只能想辦法解決了,下面是筆者基于實(shí)際業(yè)務(wù)場(chǎng)景想到的兩個(gè)數(shù)據(jù)恢復(fù)方案:

方案一

1别伏、先通過數(shù)據(jù)ID確認(rèn)哪些數(shù)據(jù)需要修復(fù)(筆者在執(zhí)行腳本時(shí)記錄了數(shù)據(jù)ID的log日志)蹄衷。

2、解析備份SQL中需要恢復(fù)的數(shù)據(jù)并拼接為新的恢復(fù)SQL厘肮。

3愧口、調(diào)用服務(wù)刪除新增的數(shù)據(jù)(數(shù)據(jù)更新接口在修改數(shù)據(jù)的同時(shí)會(huì)新增其他關(guān)聯(lián)表的數(shù)據(jù))。

4类茂、執(zhí)行步驟2中生成的SQL恢復(fù)數(shù)據(jù)耍属。

方案二

尋求DBA大爺?shù)膸椭謴?fù)數(shù)據(jù)。

方案一可以自己恢復(fù)數(shù)據(jù)巩检,而且正確的數(shù)據(jù)會(huì)保留厚骗,但操作麻煩且恢復(fù)過程可能產(chǎn)生新的問題,所以最后還是厚顏無恥地去找DBA恢復(fù)數(shù)據(jù)兢哭。

DBA恢復(fù)數(shù)據(jù)后還給筆者發(fā)了下面恢復(fù)線上數(shù)據(jù)的SQL:

alter table table_a rename to table_a_bk_2;
alter table table_a_bk rename to table_a;

好家伙领舰,DBA暗示已經(jīng)這么明顯了嘛,筆者二話不說默默地發(fā)了一封郵件準(zhǔn)備申請(qǐng)一個(gè)具有DDL權(quán)限的賬號(hào)迟螺。筆者現(xiàn)在想的十分清楚冲秽,以后再有這種批量更新線上數(shù)據(jù)的操作一定好好全表備份數(shù)據(jù)而不是使用僅有讀權(quán)限的賬號(hào)備份replace into語句。

-- 全表備份sql語句
CREATE TABLE table_a_bk AS SELECT * FROM table_a;

總結(jié)

下面是這兩次事故發(fā)生后筆者的一些心得矩父,希望可以給大家提供參考锉桑。

1、代碼邏輯要清楚窍株,函數(shù)參數(shù)命名要語義清晰民轴。一個(gè)參數(shù)就包含了所有需要的數(shù)據(jù)是十分不正確的行為同時(shí)代碼中盡可能多些注釋攻柠。

2、對(duì)線上數(shù)據(jù)充滿敬畏后裸,操作數(shù)據(jù)時(shí)要理清楚業(yè)務(wù)邏輯瑰钮。

3、準(zhǔn)備操作線上數(shù)據(jù)前微驶,盡量先在無緩存環(huán)境下進(jìn)行數(shù)據(jù)預(yù)驗(yàn)證飞涂。

4、人都有可能會(huì)犯錯(cuò)祈搜,所以還需要QA進(jìn)行雙重保證较店。

5、筆者就是吃了緊急需求的虧才導(dǎo)致這兩次事故容燕,其他情況請(qǐng)務(wù)必按照正常流程進(jìn)行數(shù)據(jù)操作梁呈。

6、備份真的很重要蘸秘!這兩次事故后筆者認(rèn)為前文提到的全表數(shù)據(jù)備份方案相對(duì)合理且易恢復(fù)官卡。

最后,衷心希望本文能夠?qū)Ω魑蛔x者有一定的幫助

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載醋虏,如需轉(zhuǎn)載請(qǐng)通過簡(jiǎn)信或評(píng)論聯(lián)系作者寻咒。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市颈嚼,隨后出現(xiàn)的幾起案子毛秘,更是在濱河造成了極大的恐慌,老刑警劉巖阻课,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叫挟,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡限煞,警方通過查閱死者的電腦和手機(jī)抹恳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來署驻,“玉大人奋献,你說我怎么就攤上這事⊥希” “怎么了瓶蚂?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長抚官。 經(jīng)常有香客問我扬跋,道長阶捆,這世上最難降的妖魔是什么凌节? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任钦听,我火速辦了婚禮,結(jié)果婚禮上倍奢,老公的妹妹穿的比我還像新娘朴上。我一直安慰自己,他們只是感情好卒煞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布痪宰。 她就那樣靜靜地躺著,像睡著了一般畔裕。 火紅的嫁衣襯著肌膚如雪衣撬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天扮饶,我揣著相機(jī)與錄音具练,去河邊找鬼。 笑死甜无,一個(gè)胖子當(dāng)著我的面吹牛扛点,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播岂丘,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼陵究,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了奥帘?” 一聲冷哼從身側(cè)響起铜邮,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎寨蹋,沒想到半個(gè)月后牲距,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钥庇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年牍鞠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了评姨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片难述。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖吐句,靈堂內(nèi)的尸體忽然破棺而出胁后,到底是詐尸還是另有隱情,我是刑警寧澤嗦枢,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布侣诺,位于F島的核電站趴久,受9級(jí)特大地震影響搔确,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜坎吻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦您机、人聲如沸年局。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春巡揍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國打工捌木, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留彬檀,地道東北人帆啃。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像坤学,于是被迫代替她去往敵國和親疯坤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容