近日,一场由“Delete statement does not finish executing”(删除语句无法完成执行)引发的数据库故障在多家互联网企业中蔓延,导致批量数据删除操作陷入无限等待状态,部分系统甚至出现数据残留和性能严重下降。安全研究机构“云哨实验室”率先披露了这一异常现象,并警告称,故障根源可能指向数据库引擎内部锁机制与事务日志的深层冲突。
故障始末:删除命令“有去无回”
据多位受影响企业的技术负责人反馈,该故障最早于本周二下午集中爆发。运维人员在执行常规数据清理任务时,发现DELETE语句在数据库管理工具中长时间显示“运行中”状态,既未报错也未完成。即使强制终止会话并重启数据库服务,部分目标数据仍然无法被删除,新写入的记录又持续占用存储空间。
“一条删除100万条历史日志的SQL,跑了12个小时还没结束,监控显示IO等待高达95%。”某电商平台数据库管理员李明(化名)向记者描述,原定凌晨完成的维护窗口被迫延长,直接导致次日早高峰订单写入延迟。
更令运维团队头疼的是,故障并非孤立出现。在尝试回滚事务或手动清理死锁时,多个关联表出现主键冲突和索引损坏,部分查询被迫降级为全表扫描,数据库吞吐量骤降约70%。
技术溯源:锁膨胀与日志截断异常
安全研究员通过对故障现场的快照分析,发现了一个反常的锁链:一个低优先级的删除操作持有了多个页级排他锁,却迟迟不释放,导致后续所有涉及相关数据页的更新、插入操作全部排队等待。更关键的是,这些锁的持有时间远超正常值,且事务日志文件在删除语句执行期间出现了异常增长,随后又因日志备份作业被阻塞而无法截断。
“这就像一条高速公路的出口被一辆打着双闪的卡车堵死,后续车辆全部积压。”云哨实验室首席分析师王磊解释,“删除语句通常只短暂持有锁,但这里它似乎陷入了与版本清理进程的‘死循环’——每次尝试清理旧版本数据时,都被自己锁定的页面挡住。”
该团队初步判断,故障可能与数据库的“行版本控制”机制有关。在高并发删除场景下,数据库为了维护MVCC(多版本并发控制)可见性,需要保留被删除行的旧版本。当删除范围过大且版本链过长时,版本清理进程与删除操作本身形成资源竞争,最终导致锁无法释放。
波及范围:从电商到金融的“数据僵局”
截至发稿,已知至少有三家电商平台、两家在线教育平台和一家银行信用卡中心报告了类似情况。其中银行方面虽未直接暴露核心交易库,但风控模型的离线数据清洗任务被迫中断,导致新规则无法按时上线。
受影响最严重的一家电商企业不得不紧急启用备用数据库,但数据同步方案因碎片化问题仅恢复了一半的删除操作。部分用户反馈“已删除的历史订单仍在账单中可查”,引发对数据隐私合规的担忧。
官方回应与临时方案
主流数据库厂商已针对该问题发布紧急公告。其中,某商业数据库表示,这是一个“极端场景下的并发控制缺陷”,已在最新补丁中优化了版本清理的触发阈值,建议用户升级至2025年3月后的修复版本。开源社区方面,PostgreSQL核心团队确认存在类似现象,并建议用户临时采用“分批删除+精确COMMIT”策略,即避免单条DELETE语句影响超过10万行数据。
国内某头部云数据库服务商的技术人员则提示,用户可临时设置“lock_timeout”参数,让长时间未完成的删除语句主动报错,避免无限等待;同时建议检查事务日志备份频率,确保日志不会过度膨胀。
行业反思:数据清理不是小操作
“很多人觉得DELETE就是一行SQL的事,但这个事件说明,数据清理是最高危的运维操作之一。”数据库专家、前Oracle高级工程师张涛认为,此次故障暴露了行业对大规模数据删除风险的低估,“任何删除都等同于一次微型的DDL变更,必须像做索引重建那样小心。”
安全研究员王磊则从数据残留角度提出警示:“如果DELETE无法真正完成,被标记为删除的数据实际仍存储于磁盘,这对GDPR(欧盟通用数据保护条例)合规企业是巨大隐患。”他建议企业建立“先审计后删除”的自动化流程,并在高敏感场景采用物理替代方案(如回收表空间)。
截至发稿,多家数据库厂商的补丁已进入灰度测试阶段。本刊将继续关注事件进展,并提示广大技术运维人员:在正式修复前,务必对涉及百万级数据量的DELETE操作设置超时熔断,并做好全量数据库备份。