工作突发状况怎么处理?一次生产库误删事故的 20 分钟救急记录

🔑 关键词:工作突发状况,职场应急,生产事故处理,危机沟通,项目救急

📖 摘要:用一次真实的生产库误删事故,讲工作突发状况下怎么先止血、怎么对外同步、怎么用备份和 binlog 在 20 分钟内恢复,附可复用步骤和参数。

事情发生在周五 17:42,离客户演示还有 18 分钟

那天我在一家 20 多人的 SaaS 公司,title 是内容运营,但因为项目缺人,也管一部分上线清单。 客户是华东一家连锁餐饮,约了 18:00 看后台报表,老板下午刚在群里说“这单丢了大家年终奖都别想了”。 17:42,测试同学在飞书群里发了一张截图:订单表查不到了,后台首页 500。 17:43,我打开监控,Grafana 上 MySQL 连接数从 80 掉到 12,QPS 从 340 掉到 0,报警短信连响三声。 我第一反应不是敲命令,是先把手机静音,深呼吸,在纸上写了三行:影响谁、最晚几点、能坏到什么程度。

图片

先别当英雄,先当调度员

网上很多教程会说“先冷静,再定位,再解决”。这话没错,但太滑了。 真到现场,冷静是奢侈品。我见过同事一上来就 restart 服务,结果把现场日志冲了;也见过 leader 先追责,半小时后还没人拉群。 我这次反着来:先拉一个 6 人小群,只放能拍板的人、能碰库的人、能对外说话的人。 17:46,群里第一条消息不是“谁干的”,而是“现在对外统一说系统正在维护,预计 18:20 恢复,每 10 分钟同步一次”。 这一步看起来不技术,但它把客户、销售、老板的焦虑锁在一个可预期的框里。

图片

恢复过程比电影无聊,但每个数字都要对

我让后端老李先确认是不是误删。他查了 binlog:SHOW BINARY LOGS;,最近一个 binlog 是 mysql-bin.000219,大小 1.2G。 17:49,我们用 mysqlbinlog --start-datetime='2024-05-17 17:30:00' --stop-datetime='2024-05-17 17:45:00' /var/lib/mysql/mysql-bin.000219 > /tmp/recover.sql 导出可疑区间。 17:53,DBA 把生产库切成只读,SET GLOBAL read_only=ON;,避免新写入把恢复窗口搅乱。 17:57,在预发库先重放 /tmp/recover.sql,发现有一条 DELETE FROM orders WHERE created_at < '2024-05-01'; 被误执行,影响 3,842 行。 18:03,跳过那条 delete,用备份 + binlog 增量恢复到 17:44 的状态,校验 SELECT COUNT(*) FROM orders; 返回 128,417,和事故前监控快照只差 6 行。 18:07,主库恢复读写,接口错误率从 87% 降到 0.3%,后台首页能打开。 18:12,销售在客户群发了一句:系统已恢复,演示可以正常开始。 18:31,客户看完报表,问了两个问题,没提这次事故。我坐在工位上,后背全是汗。

图片

我的独立观点:突发状况不是技术题,是时间差管理

很多人把突发状况当成“技术问题”,但我后来越想越觉得,它更像“时间管理 + 预期管理”。 技术方案决定能不能修好,沟通节奏决定别人会不会在你修好之前先炸。 常见做法是:先内部复盘、先找责任人、先写事故报告。我的做法是:先对外给一个粗糙但确定的时间点,再内部并行定位。 粗糙的时间点比沉默强。沉默会让所有人脑补最坏结果,而脑补通常比现实更吓人。 还有一个反直觉的点:不要追求 100% 恢复。那次我们丢了 6 行数据,是 17:44 到 17:46 之间的两条测试订单和四条重复写入。 如果为了这 6 行把恢复时间拖到 19:00,客户可能早就走了。先恢复 99.99%,再补那 0.01%。

图片

可复用清单:下次出事,照这个顺序抄

我现在电脑里有一个 incident.md,每次出事直接复制。你可以照着自己的业务改。 第一步,10 分钟内确认三件事:影响面(多少用户/订单/金额)、最晚恢复时间(客户会议/结算/发版)、可接受的坏结果(丢 1 小时数据还是全停)。 第二步,拉群只放 5-7 人,设一个“对外发言人”,其他人闭嘴干活。群公告写清:当前状态、下次同步时间、需要谁配合。 第三步,技术侧先止血再根治:切只读、限流、回滚、切流量、降级非核心功能。常用命令要提前写在 runbook 里,别现搜。 第四步,恢复后做 15 分钟“热复盘”,只记时间线、动作、结果,不追责。24 小时后再开正式复盘。 第五步,把这次事故变成 checklist:谁在 5 分钟内能拿到 DB 权限、备份最近一次成功时间、binlog 保留几天、客户联系人电话。 这些参数比“保持冷静”有用。冷静不是喊出来的,是你知道下一步点哪里。

图片

最后说点不正确的

我以前特别迷信“能力强的人能救火”。现在我觉得,工作里的突发状况,拼的不是谁最会救火,而是谁能在着火时让其他人不往火里扔油。 如果你也遇到过类似的事,别只写“服务器崩了”。把时间、影响行数、恢复命令、同步话术记下来,下一次你会快很多。 至少我现在再看到 500,不会先骂人,会先看表。 这篇不是标准答案,只是我一次真实的、带汗味的处理记录。

图片

🏷️ 标签: