前言

  从事互联网开发这几年,参与了许多项目的架构分析,数据库设计,改过的bug不计其数,写过的sql数以万计,从未出现重大纰漏,但常在河边走,哪有不湿鞋,就在五一假期的头一天,我干了职业生涯中最愚蠢,也是最刺激的一件事:执行update的时候忘了添加where条件,结果更新了整张表(系统最重要的一张表)的时间字段。。。

项目背景介绍

  简单介绍一下项目背景:大家可以把其理解为一个文章检索系统,前台用户端通过输入日期、关键字以及文章类型可以查询出对应的文章内容并查看:

  后台管理端可以通过多维度对现有的文章进行维护(使用过我开发的代码生成器的朋友一定对下面的界面很眼熟,没错,后台(包括界面)百分之90的代码都是我拿它生成的):

要命的update

  当时整个系统的开发工作全都压在了我一个人的身上,而且工期很紧,只有不到一周的时间就要上线,临危受命,只能硬扛。

  系统前台使用人群主要为企业的财务人员并且使用的时间比较分散;后台使用人群为内部管理员(只有两位);每年新添加的文章数大概两三千左右的样子。综合考虑下来,基本不会有什么并发量,数据量也不大,缓存是没必要了,搜索引擎更是大材小用,所以为了快,便采用SpringBoot+MySql的方式进行开发。

  最终,项目如期完成,来到了最后的线上部署阶段,当时是4月30号下午三点左右,在检查数据的时候,我发现了一条格式有误的日期数据,于是在navicat执行了这条sql,这正是灾难的开始:

update article set addtime = '2019-07-26 00'

  。。。NO,wait!!执行完毕之后,我意识到大事不妙,企图rollback,然并卵,navicat是自动提交的。。。,由于使用的是测试环境,也没有对数据库做任何备份。。。心中一万匹草泥马飘过,冷静,我要冷静,现在要做的是把数据恢复到之前的样子,也就是把数据回退到执行这条sql之前最近的时间点。

  我开始在网上查阅相关资料,发现开启binlog是数据恢复的前提,如果没有开启,不好意思,常规办法不可恢复!

  当时我脑瓜嗡嗡的,如果没有开启binlog,那就真的凉凉了,我紧张的连接到远程服务器,cd到mysql的安装目录,内心不断祈祷:一定要有啊!一定要有啊!别搞我!

  。。。当我看到var文件夹下的mysql-bin.000002文件时,长舒一口气,还有的救,老天果然还是眷念我的。

  剩下的操作就简单了,根据网上的信息进行汇总,得出执行以下命令便可获得指定数据库指定时间段内所有的sql语句:

/usr/local/mysql/bin/mysqlbinlog
/usr/local/mysql/var/mysql-bin.000002
# 指定数据库名称,注意是数据库,不是表
--database=xxx
# 起始时间
--start-datetime='2020-04-26 00:00:00'
# 结束时间
--stop-datetime='2020-04-30 15:00:00' > backup.sql

  为了保险起见,我备份了mysql目录下的所有文件,然后执行了以上命令,结果意外的顺利,当前目录下生成了backup.sql文件。

  然后我drop掉命令中指定的database,执行backup.sql脚本,一行行OK闪过,持续了十秒左右的样子戛然而止,期间没有报错,感觉可以,有戏!在navicat中刷新,打开article表,谢天谢地,数据恢复了:

  最后,项目成功部署上线,一个update引发的惨案也就此悄无声息的画上了句号。

结语

  通过此次事件,让我明白了备份的重要性,俗话说得好:有备无患。其次,在执行update,delete语句时,一定要记得开启事务,这样一旦出了问题可以rollback!

附:喜欢的朋友可以关注公众号 “螺旋编程极客” 第一时间获取最新内容更新!

记一次真实的线上事故:一个update引发的惨案!的更多相关文章

  1. 由定时脚本错误以及Elasticsearch配置错误引发的Flink线上事故

    近期接手离职同事项目,突然遇到线上事故,Flink无法正常聚合数据生成指标. 以下是详细的排查过程: 问题复现 清晨,运维报告Flink数据分析模块无法正常生成指标数据. 赶紧登陆Flink所在机器, ...

  2. 记一次线上事故的JVM内存学习

    今天线上的hadoop集群崩溃了,现象是namenode一直在GC,长时间无法正常服务.最后运维大神各种倒腾内存,GC稳定后,服务正常.虽说全程在打酱油,但是也跟着学习不少的东西. 第一个问题:为什么 ...

  3. RabbitMQ 线上事故!慌的一批,脑袋一片空白。。。

    前言 那天我和同事一起吃完晚饭回公司加班,然后就群里就有人@我说xxx商户说收不到推送,一开始觉得没啥.我第一反应是不是极光没注册上,就让客服通知商户,重新登录下试试.这边打开极光推送的后台进行检查. ...

  4. ThreadLocal引起的一次线上事故

    > 线上用户存储数据后查看提示无权限 前言 不知道什么时候年轻的我曾一度认为Java没啥难度,没有我实现不了的需求,没有我解不了的bug 直到我遇到至今难忘的一个bug . 线上用户存储数据后查 ...

  5. java运维: 一次线上问题排查所引发的思考

    本文转载自 crossoverJie 的b博客 https://www.cnblogs.com/crossoverJie/p/9282065.html 前言 之前或多或少分享过一些内存模型.对象创建之 ...

  6. Jedis线上的一个小坑:Redis有并发访问的数据错乱的问题

    问题现象: 业务数据有错乱,A的一些数据有好几个都是B的数据 这些业务数据在保存在Redis缓存中,怀疑是并发情况下Jedis错乱的问题 原因分析: JedisUtil里面在使用完Jedis 后释放资 ...

  7. 记录线上APP一个排序比较引发的崩溃 Comparison method violates its general contract!

    最近在做产品需求的时候上线了一个新的产品需求,给用户多了一种新的排序排序规则,更加方便用户找到自己想要的东西.新版本发布后,QA 给我发了一个 线上崩溃 bug 链接,具体内容如下: 看到上面的链接, ...

  8. 记一次惨痛的线上bug

    讲述背景,刚入职新公司2个月的时候,接手一个红包系统.资历尚浅,对业务也不是很熟悉.公司开发新的平台,需要使用红包功能来进行推广,按照产品的需求,进行开发...然而,问题就出在这里,红包接口比较陈旧, ...

  9. 一次线上事故,让我对MySql的时间戳存char(10)还是int(10)有了全新的认识

    美好的周五 周五的早晨,一切都是那么美好. 然鹅,10点多的时候,运营小哥哥突然告诉我后台打不开了,我怀着一颗"有什么大不了的,估计又是(S)(B)不会连wifi"的心情,自信的打 ...

随机推荐

  1. 【C#】写一个支持多人聊天的TCP程序

    碎碎念 先谈谈我们要实现的效果:客户端可以选择要聊天的对象,或者直接广播消息(类似QQ的私聊和群消息) 那么,该如何实现呢? 首先明确的是,要分客户端和服务器端两个部分(废话) 客户端:选择要发送的对 ...

  2. 谨慎使用keySet:对于HashMap的2种遍历方式比较

    HashMap存储的是键值对,所以一般情况下其遍历同List及Set应该有所不同. 但java巧妙的将HashMap的键值对作为一个整体对象(java.util.Map.Entry)进行处理,这优化了 ...

  3. 数据结构和算法(Golang实现)(14)常见数据结构-栈和队列

    栈和队列 一.栈 Stack 和队列 Queue 我们日常生活中,都需要将物品排列,或者安排事情的先后顺序.更通俗地讲,我们买东西时,人太多的情况下,我们要排队,排队也有先后顺序,有些人早了点来,排完 ...

  4. iOS技能 - 最新美团、百度、腾讯、头条、阿里 面试题目记录

    关于面试题,可能没那么多时间来总结答案,有什么需要讨论的地方欢迎大家指教.主要记录一下准备过程,和面试的一些总结,希望能帮助到正在面试或者将要面试的同学吧. 美团 一面 1.简历上写的项目问了一遍,然 ...

  5. CentOS8.1.1911正式发布!

    前阵子,CentOS官方宣布:CentOS8.1.1911正式发布!已经安装CentOS8.0的朋友,可以执行yum update更新(笔者更新了2次),体验下新版本!如是新安装,可以从官方网站下载h ...

  6. 哈密顿绕行世界问题 HDU2181

    题目大意都比较简单,用vector存一下图,然后爆搜就可以了. #include<bits/stdc++.h> using namespace std; ; vector<]; bo ...

  7. Gatling脚本编写技巧篇(二)

    脚本示例: import io.gatling.core.Predef._ import io.gatling.http.Predef._ import scala.concurrent.durati ...

  8. 详解 DatagramSocket类

    (请观看本人博文 -- <详解 网络编程>) DatagramSocket 概述: 这类代表一个发送和接收数据包的插座. 该类是遵循 UDP协议 实现的一个Socket类. 数据报套接字发 ...

  9. ESI web学习记录

    Ezbypass 解出 放在php新特性的文章最后了,利用json反序列化脚本绕过disable_functions来get flag Ezupload 没解出 登陆页面查看源代码发现,备份文件泄露. ...

  10. weblogic漏洞(一)----CVE-2017-10271

    WebLogic XMLDecoder反序列化漏洞(CVE-2017-10271) 0x01 漏洞原因: Weblogic的WLS Security组件对外提供webservice服务,其中使用了XM ...