小计生产数据库事故--缺少where的update

简介: -------------------------------------------------------------------------------------正文------------------------------------------------------------------------------------对待生产数据库上的操作要严肃,谨慎。
-------------------------------------------------------------------------------------正文------------------------------------------------------------------------------------
对待生产数据库上的操作要严肃,谨慎。
问题发生的具体情况:update tb1的脚本中, 有一条update语句没有where条件
问题造成的影响:tb1属于非业务核心表, 主要作用为信息存储,接近200W的数据全部被update

第一时间得知这个消息之后,首先确认这个表数据错误产生的影响,和业务人员沟通以后确认这个表相关的后续功能还没有开发完成,暂时没有业务查询
然后考虑数据恢复的手段;
大方向来说,这种事故的处理方法主要有两个:1.从冷备/热备里面抽取这一张表的数据,然后还原到生产库,再由业务重新生成后续的数据;2.回滚掉这个update语句;
PS:另外的一个比较便利的办法,就是第一时间停掉延时从库的IO thread,然后从延时从库里面找到这张表再视情况恢复数据,当然,前提是有延时从库

方法1:很常规的方法,具体到实施的阶段,考虑了两种方式,
A.把生产库的tb1改名,然后从备份中导出tb1的数据插入到生产库;
B.从备份库上读出需要恢复的列数据,然后利用update批量改回去;
优缺点:
都要依靠备份数据进行恢复,光是通过备份文件重建库就会消耗不短的时间
建库以后方法A可以更快的恢复数据,但是进行大批量的数据插入的时候,有可能会产生单个长时间的事务,影响到主从同步;
方法B的思路类似于事务回滚,只不过是这个回滚的语句是根据备库的数据拼装起来的,恢复数据的时间相对于A要长很多;
这两个方法都有一个共通的问题,那就是从备份时间点到出问题的这一段时间,产生的数据都需要业务人员重新生成;

方法2:数据库的binlog处于ROW模式的时候,通过mysql的binlog解析工具, 可以解析出回滚语句,在库上面重新执行这些语句就可以了;
当数据库的规模达到一定程度的时候,重新建库会花费非常多的时间,在条件允许的情况下,利用binlog解析出回滚语句会是一种比较快捷的办法;

实际使用的办法:
实际采用的是方法1的B方式,相对来说耗时间比较长,采用这个方法的很重要的原因在于:这个表相关的后续功能还没有开发完成,暂时没有业务查询
在这种大前提下,进行数据恢复的首要关注的指标:停/影响业务的时间不再和数据恢复时间相关,而是变成了进行数据恢复的时候不要影响到生产库;
当然也不能因为是圣诞节就扔这里不管跑掉了_(:з」∠)_;
所以采用方法1的B,重建备份库以后,用SQL语句组装了update语句,然后挂了一个后台脚本在跑,实际上花了很多时间;

如果这是业务相关的表的话,一个多小时基本上可以算是严重的生产事故了_(:з」∠)_(万幸是个暂时不怎么用的表

为什么不用其他的方法:
方法1的A:可能会产生单个长时间的事务,影响主从同步;
方法2:这个库部署在XX云平台上,虽然binlog使用ROW格式的,但是看不到数据库服务器,碰不到binlog,只能放弃;
目录
相关文章
|
6月前
|
关系型数据库 MySQL 数据库
轻松入门MySQL:精准查询,巧用WHERE与HAVING,数据库查询如虎添翼(7)
轻松入门MySQL:精准查询,巧用WHERE与HAVING,数据库查询如虎添翼(7)
139 0
|
6月前
|
数据库 OceanBase 索引
在OceanBase数据库中,REPLACE INTO和insert update在效率上可能有所不同
【2月更文挑战第30天】在OceanBase数据库中,REPLACE INTO和insert update在效率上可能有所不同
378 1
|
Oracle 关系型数据库 数据库
Oracle生产数据库insert插入较慢分析过程和解决办法
Oracle生产数据库insert插入较慢分析过程和解决办法
443 0
|
关系型数据库 MySQL 数据库
对于mysql数据库delect from,truncate table,drop table, update操作的时候如何选择
对于mysql数据库delect from,truncate table,drop table, update操作的时候如何选择
197 2
|
2月前
|
SQL 关系型数据库 MySQL
ThinkPHP6 连接使用数据库,增删改查,find,select,save,insert,insertAll,insertGetId,delete,update方法的用法
本文介绍了在ThinkPHP6框架中如何连接和使用数据库进行增删改查操作。内容包括配置数据库连接信息、使用Db类进行原生MySQL查询、find方法查询单个数据、select方法查询数据集、save方法添加数据、insertAll方法批量添加数据、insertGetId方法添加数据并返回自增主键、delete方法删除数据和update方法更新数据。此外,还说明了如何通过数据库配置文件进行数据库连接信息的配置,并强调了在使用Db类时需要先将其引入。
ThinkPHP6 连接使用数据库,增删改查,find,select,save,insert,insertAll,insertGetId,delete,update方法的用法
|
6月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之数据库执行的是UPDATE操作,那么Flink监听到的类型是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
3月前
|
SQL 关系型数据库 数据库
关系型数据库SQL server UPDATE 语句
【8月更文挑战第3天】
72 10
|
3月前
|
监控 数据可视化 前端开发
基于python django生产数据与计划大屏,可链接数据库
本文介绍了一个基于Python Django框架开发的生产数据与计划大屏系统,该系统能够实时采集和展示生产数据,支持数据可视化和实时更新,以提高生产监控的效率和质量。
|
5月前
|
SQL 关系型数据库 Java
有大批量的数据导入到数据库,规则是数据库有相应主键的就update没有就insert怎么做效率快
有大批量的数据导入到数据库,规则是数据库有相应主键的就update没有就insert怎么做效率快
106 1
|
5月前
|
供应链 物联网 分布式数据库
区块链技术作为一种新兴的分布式数据库技术,正逐渐改变着我们的生产和生活方式。而智能合约作为区块链技术的重要应用之一
【6月更文挑战第10天】本文探讨了区块链技术与智能合约的界限及其带来的挑战。区块链,以其不可篡改性和安全性,已广泛应用于金融、供应链和物联网等领域。智能合约作为区块链的关键应用,实现了自动、安全和不可篡改的合约执行。然而,技术上的扩展性、性能问题和安全漏洞,以及法律监管的困境,构成了当前的主要挑战。尽管如此,随着技术进步和应用场景的拓宽,区块链与智能合约有望在未来发挥更大潜力。
100 0