(給程式員的那些事加星標)
原創:程式員的那些事(id:iProgrammer)
“如果早上喝咖啡都還不能讓腦子清醒,那就到生產環境刪表吧!”
老讀者可能還記得我們在 2017 年 11 月發過的這個趣圖,
不過類似的技術八卦呢,最近的確發生了,而且還上新聞了,
就在 10 月 12 日,國外一個記分服務 keepthescore 在推特上發了和本文開頭一樣的趣圖,
沒過幾天,keepthescore 就出現了生產環境刪庫事件,真是一語成讖啊
這到底是一個怎么樣的瓜?
17 日 keepthescore 官博更新了一篇文章,做出了解釋,
“(當地時間)晚上 10:45 左右,幾杯紅酒下肚后,我們在生產環境無意刪庫了,超過 300.00 分及其資料瞬間灰飛煙滅,” (當事人應該瞬間醒酒了)
“不過謝天謝地,我們服務器托管商 DigitalOcean 每天會自動備份一次,經過 5 分鐘的絕望和恐慌后,我們進入了網站維護模式,并開始恢復備份,災難發生 30 分鐘后,恢復了備份資料,網站重新上線,但是 7 個小時的資料永久丟失了! ”
為什么會出現刪庫?
“誰叫你們喝酒后還寫代碼啊”,也許大家會歸咎于那幾杯紅酒,
然而,洗掉資料庫的函式是他們程式員之前清醒時撰寫的,那個函式洗掉本地資料庫,然后從頭創建所有所需的表,
17 日晚上寫代碼的時候,該函式連接到生產資料庫并擦除它,為什么會刪?他們也還沒搞明白,
下面就是引發本次刪庫災難的代碼:
def database_model_create():
"""Only works on localhost to prevent catastrophe"""
database = config.DevelopmentConfig.DB_DATABASE
user = config.DevelopmentConfig.DB_USERNAME
password = config.DevelopmentConfig.DB_PASSWORD
port = config.DevelopmentConfig.DB_PORT
local_db = PostgresqlDatabase(database=database, user=user, password=password, host='localhost', port=port)
local_db.drop_tables([Game, Player, Round, Score, Order])
local_db.create_tables([Game, Player, Round, Score, Order])
print('Initialized the local database.')
請注意,host 是硬編碼寫了 localhost 的,
這意味著它不應該連接到開發者機器之外的其他機器,不過他們在開發和生產中使用不同的密碼和用戶,他們在文中表示,“太累了,現在都想不出來為什么,”
他們從中學到了哪些教訓?
他們已經學到了:
1、有可洗掉資料庫的函式是非常危險的,永遠不能真正正確地測驗安全機制,因為想測驗就意味著要拿生產資料庫開刀,
2、必須要有能夠快速恢復的備份,
3、即使是災難也有好的一面,他們那篇博客文章引起了很多人的興趣,給大家樂趣和警醒,
涉事程式員被老板開除了么?
沒有開除,因為 keepthescore 的刪庫開發者和創始人都是同一人,名字叫 Caspar,「程式員的那些事」有理由懷疑,keepthescore 的保安、市場和運營等崗位,也是由 Caspar 在做,
Caspar 表示,這是他的一個副專案,雖然不是電廠運行的那個級別的軟體,但用戶中也有部分付費的,他表示深深的歉意,
Caspar 心態很是挺不錯的,他在博文最后把自己前幾天發的趣圖貼了出來,讓大家一起從歡樂中吸取教訓,
這種事還會再發生么?
Caspar 坦言,“我們無法百分之百保證這種事情不會再次發生,計算機實在是太復雜了,總有一天復雜的小妖精會贏,但是,我們將找出問題所在,并確保這個特定的錯誤不會再次發生,”
關于預防在生產環境出現刪庫事件,大家有什么好的建議呢?歡迎留言分享,
- EOF -
推薦閱讀 點擊標題可跳轉
1、清空服務器全部資料,微盟“刪庫”運維被判 6 年
2、又刪庫了,這次是 AI 動手的
3、刪庫!一程式員不滿被解雇報復前公司
關注「程式員的那些事」加星標,不錯過圈內事
點贊和在看就是最大的支持??
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/190952.html
標籤:java
