前言

  从事互联网开发这几年,参与了许多项目的架构分析,数据库设计,改过的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语言实现顺序栈以及栈的特点

    什么是栈? 同顺序表和链表一样,栈也是用来存储逻辑关系为 "一对一" 数据的线性存储结构,如下图所示. 从上图我们看到,栈存储结构与之前所学的线性存储结构有所差异,这缘于栈对数据 ...

  2. java 中类为啥要序列化

    java里为什么要序列化?http://zhidao.baidu.com/link?url=7_wAQ8eAl28vcJPE5OKM5Y0Bo4aINNQokHhRmI9XPszEoTO5QF-gNb ...

  3. Pandownload作者被抓之后

    近日,pandownload作者被抓,可以说是圈内的大事件,被抓之后, Pandownload 已经是打不开,用不了了 就在我为此感到惋惜的时候,竟然有出来个shengdownload 先来一块看看这 ...

  4. 【Tool】IDEA 连接数据库

    窗口 View - DataBase 右侧的窗口弹出,点加号选择数据库 没有装载驱动包,提示下载 可以选择老版本的驱动,或者新版的 老版本驱动只需要填入数据库,账户和密码即可测试链接,显示连接成功 新 ...

  5. JAVA—HashMap

    一些关于hashmap的学习笔记 1.HashMap底层实现原理 在JDK1.7中HashMap是以数组加链表的形式组成的,在JDK1.8之后新增了红黑树的组成结构,当链表大于8并且容量大于64时,链 ...

  6. 8行代码帮你python建立UDP通信

    首先我们要搭建一个UDP通信,首先我们就要知道什么UDP: UDP用户数据报传输协议,它位于TCP/IP协议的传输层,是一种无连接的协议,它发送的报文不能确定是否完整地到达了另外一端.UDP广泛应用于 ...

  7. Bi-shoe and Phi-shoe LightOJ - 1370

    欧拉函数. 欧拉函数打表模板: #define maxn 3000010 int p[maxn]; void oula(){ int i,j; ; i<=maxn; i++) p[i]=i; ; ...

  8. Chrome插件安利!可以一键导出微信读书笔记|支持Markdown等三种格式

    众所周知,微信读书App 是一款非常优秀的阅读类App ,周围也有不少人在用.虽然工作比较忙.但是也没少在上面看书做笔记. 美中不足的是,目前微信读书虽然支持笔记导出,但是提供的是将笔记复制到剪切板, ...

  9. IN612 IN612L蓝牙5.0 SoC芯片替换NRF52832/NRF52840

    IN612L是美国公司INPLAY的SOC产品系列之一,具有多模协同2.4G无线协议栈,支持2.4G私有协议栈以及蓝牙5.0全协议栈的SOC芯片.如2mbps高数据速率模式,125kbps/500kb ...

  10. 资料整理:python接口类

    1开发原则(七大原则) 一:开放封闭原则 二:接口隔离原则(将不同接口对象一一展现出来,分别调用各自的接口,完成各自的功能) 三:依赖倒置原则 高级模块不能依赖低级模块,可以依赖抽象 规范的定义: 高 ...