记一次生产事故:一年的数据被删除了

news/2025/1/12 20:04:14/文章来源:https://www.cnblogs.com/zhulu/p/18650560

故事开始

 快要下班了,心情是这样的。

 

 突然电话响了,一看电话号码是项目甲方负责人的号码

 

 

 菊花一紧,难道出什么问题了,硬着头皮接通了电话。

 

 

@####@,你们程序怎么回事 ,某个业务的数据界面一条都查询不到了。。。。。

 

我们马上排查一下,看看那什么情况(心理活动:尼玛,尼玛,我怎么知道啊)???

 

莫慌,先搞条SQL到数据库查一把
 
 
阿弥陀佛,祈祷只是查询条件的问题。

 

 

哦豁、哦豁、数据库里也没了,用户做了一年的任务数据都没了,我尼玛!!!!

 

甲方要求今天必须恢复数据,什么问题导致的你们后面自己排查去。

 

好好好,是是是

 

(恢复数据不都是小菜一碟的事毕竟我们数据库每天凌晨有定时全量备份,也开了binlog日志的,哈哈,这难不倒我)

恢复数据没问题啊

binlog里面把删除语句找出来,逆向改成插入语句不就恢复了,这事不就欧了。

 

说干就干,先让公司现场运维同事帮忙把binlog拷贝出来

 

开始搞binlog,通过命令: mysqlbinlog --no-defaults -vv --base64-output=decode-rows --start-datetime='2024-12-30 16:49:35' --stop-datetime='2024-12-30 17:00:00'  mysql-bin.000103 >outsql1.sql;找出对应时间点的语句删除。

 

 

 


找到删除语句还是很顺利,但是

binlog 中的删除语句只有被删除数据的ID,没有删除数据的详细数据,tmd 这怎么搞(后面再说原因,先恢复数据要紧)

 

没办法只能拷贝全量备份文件了

 

问题又来了,公司运维说科技运维说拷贝不出来,文件太大了要拷贝1个小时(备份源文件 7G)
 
 
打工人今天注定是无法按时下班了
 
跟现场一顿沟通 tmd 发现竟然没有压缩,压缩了一下,瞬间缩水了很多,终于拷贝出来了
 
你以为拷贝出来就没问题了嘛?
 
最开始想简单了,想的就是把全量备份还原到本地,然后在本地把对应业务丢失数据的表搞成脚本恢复到生产上就完事了
 
MD,但是一顿操作发现,7G的数据全量还原到本地也tmd太太太慢了。还原了1个小时才还原不到10%,这不是到明天早上都不一定能还原完
 
7G的文件,就别想用普通的编辑软件打开了,肯定是不行的。
 
没办法,只能2条腿走路,先让它慢慢还原着,然后再去找找看有没有其他办法可以从7G的这个文件里把需要的数据筛出来
 
一顿Google 、度娘加ChatGPT后发现通过 mysqldump -u root -p mydatabase > mydatabase_backup.sql 备份的文件,不管一个表有多少数据,备份文件中都只会生成了一条插入语句
 
再通过这个命令: cat testdb_all.sql |grep -E ‘INSERT INTO `personchangeinfo`’ > personchangeinfo1.sql 就可以从全量备份文件中找出并生成一个新文件
 
通过实测是可从 7G的文件里面找出具体的某张表的插入语句的,这样就好办了,不用还原整改备份,可以单表进行还原,节省了一大把时间。(tmd 今晚应该不用熬通宵了)
 
到了这一步至少可以先恢复到丢失数据当天凌晨的数据了,凌晨之后的的数据好像无能为力了(不知道各位大神有没有什么好办法?),硬着头皮给现场项目方打电话汇报结果。
 
一看时间已经晚上11点了,MD天选的打工人。
 

说明:

数据丢失的原因:程序缺陷导致,一个平常不用的功能,刚好年底了用到了

binlog里面为啥只有删除数据的ID没有详情:因为Binlog 格式设置的是“Mixed”

总结:

1、设Binlog模式要慎重,还得的按照自己项目实际情况去设置 binlog 类型,不然可能会对恢复数据造成麻烦。

binlog 有三种格式:

    • Statement(Statement-Based Replication,SBR):每一条会修改数据的 SQL 都会记录在 binlog 中。
    • Row(Row-Based Replication,RBR):不记录 SQL 语句上下文信息,仅保存哪条记录被修改。
    • Mixed(Mixed-Based Replication,MBR):Statement 和 Row 的混合体。 

Statement

Statement 模式只记录执行的 SQL,不需要记录每一行数据的变化,因此极大的减少了 binlog 的日志量,避免了大量的 IO 操作,提升了系统的性能。(比如update user set name="张三" where id >1 and id <10000,假设被修改的数据有2000条,那么Row的日志量就是2000条,而Statement只是这条sql语句一条日志而已,所以Statement的日志量相对Row会少很多)

但是,正是由于 Statement 模式只记录 SQL,而如果一些 SQL 中 包含了函数,那么可能会出现执行结果不一致的情况。比如说 uuid() 函数,每次执行的时候都会生成一个随机字符串,在 master 中记录了 uuid,当同步到 slave 之后,再次执行,就得到另外一个结果了。

所以使用 Statement 格式会出现一些数据一致性问题。

Row

从 MySQL5.1.5 版本开始,binlog 引入了 Row 格式,Row 格式不记录 SQL 语句上下文相关信息,仅仅只需要记录某一条记录被修改成什么样子了。

Row 格式的日志内容会非常清楚地记录下每一行数据修改的细节,这样就不会出现 Statement 中存在的那种数据无法被正常复制的情况。

不过 Row 格式也有一个很大的问题,那就是日志量太大了,特别是批量 update、整表 delete、alter 表等操作,由于要记录每一行数据的变化,此时会产生大量的日志,大量的日志也会带来 IO 性能问题。

此外,新版的MySQL中对row级别也做了一些优化,当表结构发生变化的时候,会记录语句而不是逐行记录。

Mixed

从 MySQL5.1.8 版开始,MySQL 又推出了 Mixed 格式,这种格式实际上就是 Statement 与 Row 的结合。

在 Mixed 模式下,系统会自动判断 该 用 Statement 还是 Row:一般的语句修改使用 Statement 格式保存 binlog;对于一些 Statement 无法准确完成主从复制的操作,则采用 Row 格式保存 binlog。

Mixed 模式中,MySQL 会根据执行的每一条具体的 SQL 语句来区别对待记录的日志格式,也就是在 Statement 和 Row 之间选择一种。

 

根据这次经历发现 Mixed 某些语句下是不会记录数据详情的,我们这次的删除语句就是Delete FROM Table where ID IN (ID1,ID2),IN里面有很多ID,大量ID时 Mixed 模式下binlog是不会记录每行数据的详情地,真是血的教训换来的经验 。
 

2、全量备份是必要的,这次就靠全量备份活过来了,binlog的增量备份也是很必要的可以尽量减少数据丢失,但是要注意binlog的模式设置。 

3、cat testdb_all.sql |grep -E ‘INSERT INTO `personchangeinfo`’ > personchangeinfo1.sql ; 这个命令很实用,可以从大文件里面查找匹配内容并输出到新文件 

4、用mysqldump 备份的文件,压缩比很可观的,别忘了压缩。

 
 
 

 

 
 

 

 

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/868320.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Azure App Service】对App Service中CPU指标数据中系统占用部分(System CPU)的解释

问题描述 在使用Azure App Service服务时,对于它的CPU占比,从App Service Plan级别可以查看整个实例(vm)资源的CPU占比,而如果在具体的一个App Service服务中,则只能查看到当前应用所消耗的CPU时间,如果需要计算它的占比:需要使用公式【 CPU Time / (CPU核数 * 60 )】估算…

2024秋季学期 光学期末复习笔记

累了,懒得写文案了参考资料 [1] 赵凯华, 钟锡华. 光学(重排本)[M]. 北京大学出版社, 2017.10. [2] 崔宏滨, 李永平, 康学亮. 光学(第二版)[M]. 科学出版社, 2015.7. [3] 王安廷. 光学课程PPT[Z]. 中国科学技术大学, 2024. 干涉衍射偏振

Python 基础知识 之 选择(分支)结构 + 模式匹配结构(match)

选择结构按照条件选择执行不同的代码段1. 单分支结构if语法结构执行流程:如果表达式的值为True,就执行语句块,如果表达式的值为False,就跳过语句块,继续执行下面的语句 ⭐注意: ⭐⭐⭐表达式后面的冒号; 缩进,python中通过缩进来控制程序逻辑示例;# 1. 判断是否中奖 n…

中考英语优秀范文-热点话题-传统文化-003 Chinese Tea 中国茶

1 写作要求 第三次法国国际友好交流学校线上论坛拟于下周五举行。本期论坛的主题为“茶文化”,作为论坛特邀嘉宾,请你写一篇文章,向国际友好交流学校介绍中国的特色茶饮和中国茶文化。 内容包括: 1 茶的历史(中国人种茶、饮茶已有4000多年的历史)和种类(绿茶、红茶、乌龙…

Hetao P3804 Cut 题解 [ 蓝 ] [ AC 自动机 ] [ 差分 ]

AC 自动机简单题。Cut:AC 自动机简单题。思路 看见多个模式串以及求前缀,很显然能想到构建一个 AC 自动机。 那么在用 \(T\) 查询时,当前指针的深度就是该位置的最长前缀匹配长度。这个在字典树 insert 的时候就能求出来。 求出每一位的最长前缀后,因为这些部分都不能作为分…

Lec 14 文件系统与设备

Lec 14 文件系统与设备License 本内容版权归上海交通大学并行与分布式系统研究所所有 使用者可以将全部或部分本内容免费用于非商业用途 使用者在使用全部或部分本内容时请注明来源 资料来自上海交通大学并行与分布式系统研究所+材料名字 对于不遵守此声明或者其他违法使用本内…

Java基础学习(七)

Java基础学习(七):异常机制 目录Java基础学习(七):异常机制概念简单分类异常体系结构异常处理机制自定义异常 本文为个人学习记录,内容学习自 狂神说Java概念异常指程序运行中出现的不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等 异常发生在程序运行期…

24. 基于项的控件

一、基于项的控件PySide6 有专门的显示数据的控件和存储数据的模型,可以显示和存储不同形式的数据。显示数据的控件分为两类,一类是基于 项(item)的控件,另一类是基于 模型(model)的控件,基于项的控件是基于模型的控件的简便类。基于项的控件把读取到的数据存储到项中,…

杂题选记

杂题选记在网上天天划水刷面经,见到 teaser 就记下来。我的想法是,把 8L 倒入 3L,把 3L 倒入 5L,把 8L 倒入 3L,把 3L 倒入 5L,这时候三个瓶子分别有 1L(8L) 2L(3L) 5L(5L) 括号里面表示瓶子最开始的容量。这时候把 1L 水倒掉,把容积为 8L 的瓶子里面的 2L 水倒到 容积为…

pytorch算子调用过程:以rand算子为例

通过pytorch的torch.profiler带调用栈采集运行过程可以看到如下信息,通过chrome://tracing查看,图上每个小条条表示一个traceEvent, json中的信息如下图所示,其中cat表示traceEvent的类型,有cpu_op,python_function等,前者表示torch的cpp代码中定义的操作,后者表示pytorc…

Wordpress更换域名后,网站显示框架和加载问题解决

最近建立了一个站点,由于先使用ip进行网站搭建,经过一段时间备案完成后,需要转成域名。直接在Wordpress后台操作后,直接导致网页框架显示异常,排版错乱,大概就是主题的框架无法加载导致的。 搞了很久,包括恢复数据库和重新建站都是这样,最终发现是伪静态的问题。 我是使…

【Weblogic T3协议】反序列化漏洞分析(上)

免责声明 此文章中所涉及的技术、思路和工具仅供网络安全学习为目的,不得以盈利为目的或非法利用,否则后果自行承担!一、前言 在初入安全的时候,就听说过weblogic的大名,当然听说的并不是weblogic如何如何好用,而是因为其漏洞出现频率实在是有点高...于是乎,便抱着学习的…