我不小心刪除了所有的資料

發表於2011-12-12

| 2011-12-12 09:22   分享: 1    

  昨天,我和在Famigo公司的同事CodyShaun 一起去參加 MongoDallas 研討會。我們在幾個月前聽說了這個會議,感到去這個會議將會是次有趣的活動。我們公司幾乎所有的東西都是儲存在MongoDB裡的,Cody會在這個會議上做一次演講介紹我們的使用情況。

  會議辦的非常好,進行的過程中沒有出什麼意外情況。(跟上次活動一樣,10gen公司給會議提供了大量的飲料。)午餐期間,我們跟 GameStop公司的幾個傢伙侃大山。其中有個人問我們在正式環境伺服器上做過的最糟的一件事情是什麼。我想不出什麼,但Cody給大家講了一個他在以 前的崗位上的一個故事。是他把完全重寫的程式碼放到伺服器上後,整個環境立即崩潰了。

  可結果卻是,我在下午實現了我對生產環境犯下的最大的錯誤。

  午餐之前,在兩個演講之間,我檢查了一下我們的伺服器,看看是否一切正常。我發現了一個異常,跟保持唯一資料值有關。我們的API中的一個競爭關係的條件語句導致了資料庫中的兩個賬戶儲存了相同的email地址,但每個賬戶的email地址必須是唯一的。

  我迅速的定位了問題,在我們的缺陷跟蹤系統了新增了一條記錄,描述了問題的原因,以及產生衝突的賬戶。我刪除了這個賬戶,因為它沒有跟任何資料關聯,我們的客戶在下次登入時,系統會自動初始化一條記錄。

  然後,我繼續查詢,看看資料庫中是否還有其它產生衝突的賬戶。我迴圈資料庫裡的每個賬戶,依次保持它們(沒有做任何改變);有問題的資料會在保持時丟擲異常資訊。我在Python的互動shell裡編碼,所以當時的程式碼並沒有保留下來,但它們大概是這樣的:

from mongoengine import connect
from models import Family
connect('the-production-database')
for family in Family.objects:
family.save()

  程式碼執行完並沒有出現異常,於是我關掉了筆記本,把注意力重新放到會議上。幾個小時後,Cody收到了大量的報告伺服器響應變慢的郵件。他迅速的開啟了筆記本,我在旁邊看著他的螢幕。當我看到這一幕時,幾乎誘發了我的心臟病:

Family.objects.count()
38

  這數量少了好幾個數量級!我們極度不安,從會議廳裡溜了出去。

  事情很快就明白了,我們的帳戶資訊,而且只是帳戶資訊,被弄丟了。我檢視新近出現的賬戶資訊,把它們加入的時間和我最後一次提交操作的時間對比。它們不可思議的接近。

  不幸的是,我的螢幕會話沒有足夠的回滾資訊來讓我看看今天早些時間究竟做了什麼。因為我是在互動式shell裡執行的,我找不到任何歷史記錄。最大可能的猜測,我應該是幹了類似這樣的事情:

for family in Family.objects:
     family.delete()

  我暈倒!執行save 和 delete 操作都不會返回任何資訊,所以在看著帳戶資訊在螢幕上滾動時沒有發現任何的異常。(我並不確認究竟是怎麼回事,但這是最簡單的解釋。奧坎氏簡化論在這裡打倒了我的自負。)

  會場的網速很差勁,而且找不到電源插座,於是我們收拾起東西,匆忙的想找一家附近咖啡館。結果發現,達拉斯市中心所有的咖啡館下午4點鐘全關門了。幸運的是,它們提供24小時的免費wifi,於是我們就在一家星巴克外面安營紮寨,開始了工作。

  (達拉斯這個地方要比我們預想的冷的多。當我們離開奧斯汀時,那裡是華氏80度,陽光明媚。而在達拉斯,這裡一直40度,陰天,有風。我們三個穿著T恤、牛仔褲的人擠在筆記本前,希望能在凍僵前儘快解決問題。)

  這周早期,我們有個資料庫備份,我們把它匯入到了我們的開發環境中,Cody把它恢復到了一個獨立的資料庫裡。我寫了一個指令碼,把丟失的賬戶資訊一一從一個資料庫匯入另一個資料庫。很幸運,進行的很順利,所有的資訊都恢復了。

  剩下還有一些要做的事情,要檢查所有對這些資料的引用都指向了正確的地方,但最重要的大火是已經被撲滅了。11月17號,它一直保留下來,成為了我們的備份宣傳日

原文:http://taylor.fausak.me/2011/11/18/i-accidentally-deleted-all-our-data/

譯文:http://www.aqee.net/i-accidentally-deleted-all-our-data/

我不小心刪除了所有的資料

相關文章