相關資訊
本類常用軟件
-
福建農(nóng)村信用社手機銀行客戶端下載下載量:584204
-
Windows優(yōu)化大師下載量:416898
-
90美女秀(視頻聊天軟件)下載量:366961
-
廣西農(nóng)村信用社手機銀行客戶端下載下載量:365699
-
快播手機版下載量:325855
本文是從 I Accidentally Deleted All Our Data 這篇文章翻譯而來。
昨天,我和在Famigo公司的同事Cody 和 Shaun 一起去參加 MongoDallas 研討會。我們在幾個月前聽說了這個會議,感到去這個會議將會是次有趣的活動。我們公司幾乎所有的東西都是存儲在MongoDB里的,Cody會在這個會議上做一次演講介紹我們的使用情況。
會議辦的非常好,進行的過程中沒有出什么意外情況。(跟上次活動一樣,10gen公司給會議提供了大量的飲料。)午餐期間,我們跟 GameStop公司的幾個家伙侃大山。其中有個人問我們在正式環(huán)境服務器上做過的最糟的一件事情是什么。我想不出什么,但Cody給大家講了一個他在以 前的崗位上的一個故事。是他把完全重寫的代碼放到服務器上后,整個環(huán)境立即崩潰了。
可結(jié)果卻是,我在下午實現(xiàn)了我對生產(chǎn)環(huán)境犯下的最大的錯誤。
午餐之前,在兩個演講之間,我檢查了一下我們的服務器,看看是否一切正常。我發(fā)現(xiàn)了一個異常,跟保持唯一數(shù)據(jù)值有關。我們的API中的一個競爭關系的條件語句導致了數(shù)據(jù)庫中的兩個賬戶保存了相同的email地址,但每個賬戶的email地址必須是唯一的。
我迅速的定位了問題,在我們的缺陷跟蹤系統(tǒng)了添加了一條記錄,描述了問題的原因,以及產(chǎn)生沖突的賬戶。我刪除了這個賬戶,因為它沒有跟任何數(shù)據(jù)關聯(lián),我們的客戶在下次登錄時,系統(tǒng)會自動初始化一條記錄。
然后,我繼續(xù)查找,看看數(shù)據(jù)庫中是否還有其它產(chǎn)生沖突的賬戶。我循環(huán)數(shù)據(jù)庫里的每個賬戶,依次保持它們(沒有做任何改變);有問題的數(shù)據(jù)會在保持時拋出異常信息。我在Python的交互shell里編碼,所以當時的代碼并沒有保留下來,但它們大概是這樣的:
from mongoengine import connect
from models import Family
connect('the-production-database')
for family in Family.objects:
family.save()
代碼執(zhí)行完并沒有出現(xiàn)異常,于是我關掉了筆記本,把注意力重新放到會議上。幾個小時后,Cody收到了大量的報告服務器響應變慢的郵件。他迅速的打開了筆記本,我在旁邊看著他的屏幕。當我看到這一幕時,幾乎誘發(fā)了我的心臟。
>>> Family.objects.count()
38
這數(shù)量少了好幾個數(shù)量級!我們極度不安,從會議廳里溜了出去。
事情很快就明白了,我們的帳戶信息,而且只是帳戶信息,被弄丟了。我查看新近出現(xiàn)的賬戶信息,把它們加入的時間和我最后一次提交操作的時間對比。它們不可思議的接近。
不幸的是,我的屏幕會話沒有足夠的回滾信息來讓我看看今天早些時間究竟做了什么。因為我是在交互式shell里執(zhí)行的,我找不到任何歷史記錄。最大可能的猜測,我應該是干了類似這樣的事情:
for family in Family.objects:
family.delete()
我暈倒!執(zhí)行save 和 delete 操作都不會返回任何信息,所以在看著帳戶信息在屏幕上滾動時沒有發(fā)現(xiàn)任何的異常。(我并不確認究竟是怎么回事,但這是最簡單的解釋。奧坎氏簡化論在這里打倒了我的自負。)
會場的網(wǎng)速很差勁,而且找不到電源插座,于是我們收拾起東西,匆忙的想找一家附近咖啡館。結(jié)果發(fā)現(xiàn),達拉斯市中心所有的咖啡館下午4點鐘全關門了。幸運的是,它們提供24小時的免費wifi,于是我們就在一家星巴克外面安營扎寨,開始了工作。
(達拉斯這個地方要比我們預想的冷的多。當我們離開奧斯汀時,那里是華氏80度,陽光明媚。而在達拉斯,這里一直40度,陰天,有風。我們?nèi)齻穿著T恤、牛仔褲的人擠在筆記本前,希望能在凍僵前盡快解決問題。)
這周早期,我們有個數(shù)據(jù)庫備份,我們把它導入到了我們的開發(fā)環(huán)境中,Cody把它恢復到了一個獨立的數(shù)據(jù)庫里。我寫了一個腳本,把丟失的賬戶信息一一從一個數(shù)據(jù)庫導入另一個數(shù)據(jù)庫。很幸運,進行的很順利,所有的信息都恢復了。
剩下還有一些要做的事情,要檢查所有對這些數(shù)據(jù)的引用都指向了正確的地方,但最重要的大火是已經(jīng)被撲滅了。11月17號,它一直保留下來,成為了我們的備份宣傳日。