# 一名工程師刪除了 GitLab 的生產數據庫。300 GB。

Published: 2026-09-10

2017 年 1 月 31 日，世界標準時間 23:27：一名 GitLab 工程師在漫長夜晚的尾聲，與一個損壞的副本奮鬥，結果移除了 db1 上的 PostgreSQL 數據目錄，而不是 db2。db1 是主要數據庫。GitLab.com 大約 300 GB 的數據庫在一兩秒鐘內消失了，而且五個備份和複製機制中，沒有一個在正常運作。事後分析：從垃圾郵件激增到錯誤的主機名，為什麼 pg\_basebackup 看起來卡住了，為什麼 pg\_dump 一直在靜默失敗（9.2 二進制文件在 9.6 數據庫上運行，失敗電子郵件被 DMARC 退回），YouTube 現場直播的從 6 小時前的測試快照恢復 18 小時的過程，以及誰真正該受責備。對響應的判決：SHIP IT。

Canonical: https://thedailydiff.dev/zh-HK/video/2026-09-10-gitlab-rm-rf/

## 本影片涵蓋的內容

- 2017 年 1 月 31 日：在主要數據目錄上運行 rm -Rvf；約 300 GB 被移除，剩下 4.5 GB
- 五個備份全部失敗：S3 存儲桶為空（pg\_dump 版本不匹配），數據庫上沒有 Azure 快照，副本被清除，每日 LVM 複製沒有網絡鉤子
- 2 月 1 日，世界標準時間 18:00：GitLab.com 從一個 6 小時前的手動快照恢復；實時文檔，實時流媒體，附帶修復列表的無責事後分析

## 翻譯的文字記錄

從英文原文旁白翻譯。可用的音頻和字幕由 YouTube 控制。

0:00 GitLab 的一名工程師在錯誤的數據庫服務器上運行 rm -rf， 數百 GB 的 GitLab.com 在一兩秒內消失， 大約是讀取一個主機名所需的時間。 2017 年 1 月 31 日，晚上 11 點 27 分， UTC。GitLab 發推稱其不小心刪除了生產數據， 向互聯網公開其事件記錄，並在 YouTube 上直播恢復過程， 成為該平台上第二熱門的直播。 第二天，書面記錄：五種備份技術中，

0:25 沒有一種能可靠運作。 它是如何發生的，為什麼會發生，以及誰真正該受責備。 這是 The Daily Diff，事後分析。 下午 5 點 20 分：一名工程師對生產數據進行快照， 以測試測試環境中的負載平衡器。 晚上 7 點：垃圾郵件猛烈攻擊數據庫，加上一個硬刪除 GitLab 員工的任務， 因為一名惡意用戶舉報濫用。 晚上 11 點：副本遠遠落後，主要數據庫已丟棄了

0:48 它需要的日誌；唯一的解決方案是清除副本並再次複製主要數據庫。 pg\_basebackup 停滯不前，沒有任何輸出。 它實際上在靜靜地等待主要數據庫；沒人知道這一點， 操作手冊中也沒有說明。 這位本打算在 11 點下班的工程師，認為空的數據目錄 是問題所在，並將其移除。 在 db1 上。主要數據庫。 他一兩秒後才注意到；在大約三百 GB 中，

1:11 還剩下 4.5 GB。備份方面。 一：每日 pg\_dump 到 S3。 存儲桶是空的。 cron 作業在沒有數據庫的應用服務器上運行，因此該程序包選擇了 用於 9.6 數據庫的 PostgreSQL 9.2 二進制文件，失敗，並發送了 失敗郵件，但因缺少 DMARC 而被退回。 二：Azure 磁盤快照，已為文件服務器啟用， 但未為數據庫啟用。

1:32 三：副本，一小時前故意清除。 四：每日快照，24 小時前，所有網絡鉤子都被 測試環境同步移除。五：下午 5 點 20 分的手動快照，用於不相關的測試。 這一個成功了。 恢復意味著以每秒 60 兆比特的速度，通過 Azure 的廉價 存儲將測試磁盤複製回生產環境：十八小時。 GitLab.com 於 2 月 1 日下午 6 點恢復， UTC，數據舊了六小時。

1:58 git blame：兩個主機名只差一個字符，以及五個從未有人 恢復過的備份系統。 不是工程師的錯。 事後分析報告由首席執行官簽署，保持他的匿名， 將生產提示標為紅色，並為數據持久性指定了負責人， 因為在此之前它沒有負責人。 影響範圍：停機十八小時，六小時數據丟失， 大約五千個項目，五千條評論，

2:18 七百個新用戶，以及五千人觀看進度條。 Hacker News 給實時文檔 1,162 分，並引用了一句 話給他們：五個備份中，沒有一個可用。 判決，事後分析：SHIP IT，關於響應。 他們公開處理事件，歸咎於流程，並發布了帶有問題編號的修復列表。 星期一行動：恢復備份。 如果你從未恢復過它，那麼你並沒有備份。 在評論中，或發送到 thedaily.diff.dev，

2:42 把你仍然不允許談論的事件發給我。 這就是今天的 The Daily Diff。 我是 Axrisi 的 Niko。 負責任地合併。 負責任地合併。

## 來源

- [GitLab, "Postmortem of database outage of January 31" (Feb 10, 2017)](https://about.gitlab.com/blog/postmortem-of-database-outage-of-january-31/) — about.gitlab.com
- [GitLab, "GitLab.com database incident" (Feb 1, 2017)](https://about.gitlab.com/blog/gitlab-dot-com-database-incident/) — about.gitlab.com
- [@gitlabstatus, "We accidentally deleted production data…"](https://twitter.com/gitlabstatus/status/826591961444384768) — twitter.com
- [@gitlabstatus, emergency maintenance notice](https://twitter.com/gitlabstatus/status/826572933304827904) — twitter.com
- [Hacker News, "GitLab Database Incident – Live Report" (1,162 points, 598 comments)](https://news.ycombinator.com/item?id=13537052) — news.ycombinator.com
- [Hacker News, the postmortem thread (377 points)](https://news.ycombinator.com/item?id=13619714) — news.ycombinator.com
