工作失误了怎么办?别先写检讨:从 GitLab 删库 300GB 到 Knight Capital 45 分钟亏 4.4 亿美元,我总结的 30 分钟止损步骤
我以前在上一家公司做活动运营,把“满 199 减 20”配成了“满 19.9 减 20”。 上线 12 分钟,后台订单从每分钟 3 单跳到 170 单。 我第一反应不是拉群,是盯着屏幕想:要不先改回来,假装没发生? 后来我承认,这个念头比失误本身更危险。 因为工作失误里,最贵的往往不是错误,是隐瞒和延迟。
先说三个能查到的真实事故,别以为只有小公司会翻车。 2017 年 1 月 31 日,GitLab 一名工程师在疲惫状态下操作,误删了 db1.cluster.gitlab.com 上的 /var/opt/gitlab/postgresql/data 目录,约 300GB 数据库没了。 更扎心的是,他们有 5 种备份方式,当时 4 种失效,最后只从 6 小时前的快照恢复,丢了约 6 小时数据。 2012 年 8 月 1 日,Knight Capital 部署新代码,8 台服务器里 7 台更新成功,1 台还跑旧代码,结果 45 分钟亏掉 4.4 亿美元。 2017 年 2 月 28 日,AWS S3 在 us-east-1 区域因为一条输入错误的命令,重启了大量索引和放置子系统,宕机约 4 小时,半个互联网跟着抽风。 这些不是“某个人粗心”的故事,是系统缺少防呆、缺少灰度和缺少可观测性的故事。
我想给一个不太讨喜的观点:工作失误不是态度问题,至少不首先是。 小失误看个人习惯,大事故看系统设计,这是两套处理逻辑。 如果你把大事故当成“写检讨、扣绩效、当众道歉”就能解决,那下一次还会来。 对比一下:道歉是情绪动作,止损是工程动作;追责是事后动作,恢复是现场动作。 现场动作搞反顺序,团队就会花 3 小时吵架,花 5 分钟改配置。
我自己后来总结了一套“先活下来,再讲道理”的顺序。 0 到 30 分钟,只做五件事:停止自动重试、保留现场、拉应急群、指定一个临时负责人、对外说事实不说原因。 停止自动重试很重要,很多事故不是第一下打死的,是脚本每 30 秒重试一次打死的。 保留现场包括截图、导出日志、记录最后一次变更时间、别急着删聊天记录。 临时负责人不需要是领导,但必须能拍板:回滚还是降级,限流还是切流量。 对外话术先写三句:影响是什么、我们正在做什么、下一次更新在几点。
30 到 120 分钟,进入恢复阶段。 能回滚就回滚,不能回滚就降级,不能降级就限流,不能限流就切备用链路。 P0 故障我建议 5 分钟内响应,P1 是 30 分钟,P2 是 2 小时,这个分级要提前写进值班手册。 不要一边救火一边写长篇复盘,人在压力下写出来的东西,常常是自我辩护。 我见过一个团队,数据库主从延迟 40 分钟,大家先花 25 分钟讨论“谁的责任”,结果延迟拖到 2 小时。 后来他们改了规则:事故现场只问三个问题——影响面多大、止血了没、还需要谁。
2 到 24 小时,才是写时间线的时候。 时间线只写事实:几点几分谁做了什么,系统返回什么,监控什么时候报警,谁在几点几分说了什么。 不要写“他粗心”“他不负责任”这种形容词,形容词会让复盘变成批斗。 24 到 72 小时,再做根因分析,至少追问 5 层,但别为了凑 5 层硬编。 比如“删库”第一层是命令输错,第二层是生产环境没有二次确认,第三层是备份恢复没演练,第四层是变更权限过大,第五层是值班疲劳没人复核。 找到能改的那一层,改流程、改工具、改权限,而不是只改人。
那工作失误后要不要主动承认?要,但别只会说“对不起,我错了”。 更好的模板是:事实 + 影响 + 已做动作 + 需要支持 + 防复发计划。 比如:我在 14:03 执行了错误配置,影响支付回调约 18 分钟,已回滚并验证,需要 DBA 帮我核对 14:00 到 14:30 的数据,今晚会加二次确认和灰度发布。 对比一下,只道歉是把情绪丢给团队,带方案是把控制权拿回来。 当然,如果公司文化就是找人背锅,你也要留好证据:变更单、审批记录、聊天记录、监控截图,这不是心机,是职业自保。
最后给你一份防呆清单,能落地的那种。 生产删除操作加二次确认,并且延迟 30 秒执行,别小看这 30 秒,够一个人从手滑里醒过来。 变更前必须验证备份可恢复,不是只看“备份成功”的绿灯。 新配置先放 1% 流量跑 10 分钟,再放 10%,最后全量,别一上来就 100%。 核心变更要双人复核,值班连续时长尽量不超过 12 小时,疲惫时人的错误率不是线性上升,是直接跳崖。 组织最好有“失误预算”:每月允许 1 次 P2 小失误,但同一根因出现 2 次,就必须改流程。 真正的高手不是不犯错,是让错误变得便宜、可发现、可恢复。 别把复盘开成道歉大会,开成改工具、改权限、改检查清单的会,才算没白疼一次。