周二下午2点47分,一个下划线让47000个活跃用户会话瞬间归零。从手冷到心跳加速,再到8分钟后全员无事发生——这不是灾难片剧本,是Medium工程师Rahul的实际周二。
0.03秒的"Query OK",50,000行数据人间蒸发
耳机里放着歌,咖啡还温着。Rahul正在清理旧备份表,标准的运维日常。
他敲下删除命令,等待那个熟悉的反馈。屏幕弹出:Query OK, 0 rows affected (0.03 sec)
等等——备份表明明有5万行,怎么是0行?
手开始发冷。那种"出事了但大脑还没跟上"的滞后感,每个工程师都懂。0.03秒前,他删的不是备份表。是生产库。
47,000个活跃会话,在线用户、购物车、未保存的文档,全挂在那个被误删的数据库上。
8分钟生死时速:没有备份预案,只有肌肉记忆
Rahul没按"先汇报再开会"的流程走。他直接拉了三个同事进语音,同时手指已经在键盘上飞。
第一步:确认误删范围。不是整个实例,是一个关键表——谢天谢地。
第二步:冻结写入。把相关微服务切到只读模式,防止新数据覆盖旧数据块。这一步慢了,恢复就彻底没戏。
第三步:从二进制日志(binlog)里捞数据。MySQL的binlog记录了每一次数据变更,相当于数据库的"黑匣子"。Rahul用mysqlbinlog工具定位到2:47:00到2:47:30的时间窗口,把误删前的INSERT/UPDATE记录全部导出。
第四步:重建表结构,重放日志。不是简单回滚——那会把用户这半小时的新操作也抹掉。而是精确提取误删前的快照,再手动合并这半小时的增量。
8分17秒后,监控面板上的活跃会话曲线重新抬头。没有用户投诉,没有客服爆线,Slack群里只有一条消息:「数据库抖动已恢复,正在观察。」
那个下划线:命名规范是怎么变成杀人凶器的
事后复盘,Rahul在内部文档里贴了两张表名截图:
users_backup_2024 —— 备份表,该删的
users_backup_2024_prod —— 生产表的临时备份,不该删的
他当时想删的是第一张。Tab补全时,光标停在了第二张。
这个命名陷阱太常见了:_prod后缀不是"生产环境专用"的意思,是三个月前某次紧急修复时,同事随手加的临时标记。没人更新文档,没人清理,它就躺在那里等一个下午2点47分。
Rahul的教训写得很直接:「我们花了80%时间讨论高可用架构,却没人管Tab键的杀伤力。」
灾难恢复的真正成本:不是工具,是决策带宽
这次8分钟救援能成功,靠的不是某个神器,是三件事的叠加:
binlog开着,且保留周期7天——很多团队为了省磁盘,只开3天或干脆不开。
Rahul本人有权限直接操作生产环境,没等层层审批——这在很多公司是大忌,但那次如果等审批,数据块早被新写入覆盖了。
团队有"先冻结再汇报"的默契——不是写在纸上的流程,是之前两次小事故练出来的肌肉记忆。
「换句话说,」Rahul在文章里用了这个词,「你买的不是备份工具,是出事时有人敢拍板、能拍板的组织习惯。」
那个没写出来的数字
文章结尾,Rahul提了一个细节:恢复完成后,他盯着监控面板看了47分钟,直到确认那条曲线完全平稳。
47分钟,正好是他误删的数据行数除以1000。
这个数字他没写进标题,没写进总结,只出现在倒数第二段。像是给自己留的暗号。
你上次检查公司的binlog保留周期,是什么时候?
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.