记一次程序 Bug 导致数据删除的恢复过程

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
RDS PostgreSQL Serverless,0.5-4RCU 50GB 3个月
推荐场景:
对影评进行热评分析
简介: 使用RDS、DMS进行数据恢复实践

场景

数据库中有张企业表,这个表里的删除字段 isdelete 给了默认值0,但开发在处理代码时编写的插入语句中带了这个 isdelete 字段,并且给了 Null 值,导致用户填写企业信息时失败,从而导致更新用户关联企业时这个用户的企业被更新为 Null。

与此同时后台操作人员又进行了一个操作,这个操作的大致步骤是,按照这个用户的所在企业查询相关用户并进行删除,但由于这个用户的企业是 Null 同时查询处理是个通用的方法对 Null 处理进行了跳过,最终导致查询结果是所有用户,接着令人恐怖的一幕发生了,这张表中的所有用户都被删除。

发现这个问题后,我的第一想法是,因为这张数据表的写入并不多,可以先按照更新时间来进行数据恢复,然而由于这张表历史比较久远,当时并没有对这个表的更新时间字段做变更自动更新,导致这个方法行不通。所以只能通过 binlog 来恢复。

基于数据库使用的是阿里云的 RDS 所以恢复过程还是比较顺畅的。

操作

1、创建数据追踪工单

选择对应的数据库、数据表,输入被误删的数据表表名,追踪类型选择更新,再根据报异常的时间设置时间范围。

生成后在工单详情可看到该时间范围内的变更数据记录,在变更时间列发现大量数据都在同一个时间范围内出现更新,因为该表的更新频次很低,所以我们可以根据这个变更时间来确定恢复数据的范围。

点击上图中的查看详情,可以看到具体变更的字段是哪些:

由此即可确定误删数据了。

2、修复数据

在工单内点击导出回滚脚本,然后根据脚本进行数据回滚。以下简单举例下脚本的内容:

UPDATE `database`.`table` SET `id`=5510 ,
  #...此处省略若干表中的字段... 
  `isdelete`=0 WHERE  (`id`=5510);

回滚的脚本就是按照数据表中的主键来将数据恢复到修改之前的样子,从上面的语句可以看到,在恢复的语句中已经将 isdelete 这个字段设置为 0 了。这个语句中还会包含其他的字段,此处我在恢复数据时,并没有将其他字段也放到 update 语句中,只做了 isdelete 字段的恢复。

使用修改后的 SQL 提交数据变更工单即可将数据恢复。

总结

1、线上问题处理思路

碰到线上问题,我们应该第一时间去用最快并且质量有保障的办法解决问题,然后再追查原因,定责。比如本次事故中,优先恢复数据,再确定产生问题的原因,解决 bug 并发布。

  • 确定出现问题的时间
  • 根据业务的情况,确定数据恢复方案
  • 根据问题时间查找接口访问日志,确定问题接口
  • 由问题接口确认业务影响的范围,改正问题

2、开发设计思路

  • 数据表的创建时间、更新时间、是否删除字段设置为插入默认值,更新时间为根据当前时间戳更新

  • 设计到数据删除的代码,需要做严格的校验,当数量超过一定范围时需要进行提示阻断
  • 开发在开发环境调试时,应该做数据 sql 自检查
目录
打赏
0
0
0
0
124
分享
相关文章
RT-DETR改进策略【模型轻量化】| 替换骨干网络为EfficientNet v2,加速训练,快速收敛
RT-DETR改进策略【模型轻量化】| 替换骨干网络为EfficientNet v2,加速训练,快速收敛
96 1
seata回滚问题之全局异常如何解决
Seata是一款开源的分布式事务解决方案,旨在提供高效且无缝的分布式事务服务;在集成和使用Seata过程中,开发者可能会遇到不同的异常问题,本合集针对Seata常见异常进行系统整理,为开发者提供详细的问题分析和解决方案,助力高效解决分布式事务中的难题。
1723 79
使用explain优化慢查询的业务场景分析
`EXPLAIN` SQL 命令用于分析查询执行计划,揭示数据库如何处理查询,包括索引使用、扫描方式等。通过分析 `EXPLAIN` 输出,可优化查询性能,例如检查全表扫描、索引利用等。案例展示了如何通过 `EXPLAIN` 优化订单和学生课程查询,通过添加索引、子查询过滤等方式减少处理行数,提高效率。
297 3
使用explain优化慢查询的业务场景分析
MySQL索引18连问,谁能顶住
MySQL索引18问概览: 1. 索引是提升查询速度的数据结构,如书的目录。 2. 索引类型包括B+tree、Hash、Full-text、R-Tree等,B+tree擅长范围查询,Hash擅长等值比较。 3. 主键索引唯一且不可为空,每表只能一个;唯一索引允许唯一值,可为空。 4. 聚簇索引数据与索引顺序一致,非聚簇索引存储指针。
418 0
MySQL索引18连问,谁能顶住
MySQL的优化利器⭐️索引条件下推,千万数据下性能提升273%🚀
以小白的视角探究MySQL索引条件下推ICP的优化,其中包括server层与存储引擎层如何交互、索引、回表、ICP等内容
MySQL的优化利器⭐️索引条件下推,千万数据下性能提升273%🚀
【YOLOv8改进-论文笔记】SCConv :即插即用的空间和通道重建卷积
该文介绍了一种针对卷积神经网络(CNN)的改进方法,名为SCConv,旨在减少计算冗余并提升特征学习效率。SCConv包含空间重构单元(SRU)和通道重构单元(CRU),分别处理空间和通道冗余。SRU利用分离-重构策略抑制空间冗余,而CRU通过分割-变换-融合策略减少通道冗余。SCConv可直接插入现有CNN架构中,实验结果显示,整合SCConv的模型能在降低复杂性和计算成本的同时保持或提高性能。此外,文章还展示了如何在YOLOv8中应用SCConv。
【MySQL】一文了解MySQL的基础架构及各个组件的作用
不管是开运、运维、测试,都或多或少的要接触MySQL,了解MySQL的基础架构及各个组件之间的关系,有助于我们更加深入的理解MySQL
1046 6
【MySQL】一文了解MySQL的基础架构及各个组件的作用
C语言中的字符串常量及其处理技术
C语言中的字符串常量及其处理技术
417 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问