记一次真实的线上事故:一个update引发的惨案!
前言
从事互联网开发这几年,参与了许多项目的架构分析,数据库设计,改过的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引发的惨案!的更多相关文章
- 由定时脚本错误以及Elasticsearch配置错误引发的Flink线上事故
近期接手离职同事项目,突然遇到线上事故,Flink无法正常聚合数据生成指标. 以下是详细的排查过程: 问题复现 清晨,运维报告Flink数据分析模块无法正常生成指标数据. 赶紧登陆Flink所在机器, ...
- 记一次线上事故的JVM内存学习
今天线上的hadoop集群崩溃了,现象是namenode一直在GC,长时间无法正常服务.最后运维大神各种倒腾内存,GC稳定后,服务正常.虽说全程在打酱油,但是也跟着学习不少的东西. 第一个问题:为什么 ...
- RabbitMQ 线上事故!慌的一批,脑袋一片空白。。。
前言 那天我和同事一起吃完晚饭回公司加班,然后就群里就有人@我说xxx商户说收不到推送,一开始觉得没啥.我第一反应是不是极光没注册上,就让客服通知商户,重新登录下试试.这边打开极光推送的后台进行检查. ...
- ThreadLocal引起的一次线上事故
> 线上用户存储数据后查看提示无权限 前言 不知道什么时候年轻的我曾一度认为Java没啥难度,没有我实现不了的需求,没有我解不了的bug 直到我遇到至今难忘的一个bug . 线上用户存储数据后查 ...
- java运维: 一次线上问题排查所引发的思考
本文转载自 crossoverJie 的b博客 https://www.cnblogs.com/crossoverJie/p/9282065.html 前言 之前或多或少分享过一些内存模型.对象创建之 ...
- Jedis线上的一个小坑:Redis有并发访问的数据错乱的问题
问题现象: 业务数据有错乱,A的一些数据有好几个都是B的数据 这些业务数据在保存在Redis缓存中,怀疑是并发情况下Jedis错乱的问题 原因分析: JedisUtil里面在使用完Jedis 后释放资 ...
- 记录线上APP一个排序比较引发的崩溃 Comparison method violates its general contract!
最近在做产品需求的时候上线了一个新的产品需求,给用户多了一种新的排序排序规则,更加方便用户找到自己想要的东西.新版本发布后,QA 给我发了一个 线上崩溃 bug 链接,具体内容如下: 看到上面的链接, ...
- 记一次惨痛的线上bug
讲述背景,刚入职新公司2个月的时候,接手一个红包系统.资历尚浅,对业务也不是很熟悉.公司开发新的平台,需要使用红包功能来进行推广,按照产品的需求,进行开发...然而,问题就出在这里,红包接口比较陈旧, ...
- 一次线上事故,让我对MySql的时间戳存char(10)还是int(10)有了全新的认识
美好的周五 周五的早晨,一切都是那么美好. 然鹅,10点多的时候,运营小哥哥突然告诉我后台打不开了,我怀着一颗"有什么大不了的,估计又是(S)(B)不会连wifi"的心情,自信的打 ...
随机推荐
- 使用Maven Archetype创建Java项目模板
1.over view 简而言之,Archetype是一个Maven项目模板工具包.原型被定义为一种原始的模式或模型,所有其他同类的东西都是从中产生的.当我们试图提供一个提供生成Maven项目的一致方 ...
- json.dumps() 和 json.loads()
转载: https://blog.csdn.net/qinglingls/article/details/96476368
- 24 接口 Interface
/** Java语言的继承是单一继承,一个子类只能有一个父类(一个儿子只能有一个亲爹)* Java语言给我们提供了一种机制,用于处理继承单一的局限性的,接口* 接口:接口是一个比抽象类还抽象的类,接口 ...
- pgsql中的行锁
pgsql中的行锁 前言 用户可见的锁 regular Lock 行级别 FOR UPDATE FOR NO KEY UPDATE FOR SHARE FOR KEY SHARE 测试下加锁之后的数据 ...
- 基于mui的H5套壳APP开发web框架分享
前言 创建一个main主页面,只有主页面有头部.尾部,中间内容嵌入iframe内容子页面,如果在当前页面进行跳转操作,也是在iframe中进行跳转,而如果点击尾部按钮切换模块.页面,那就切换ifram ...
- Java读源码之ReentrantLock(2)
前言 本文是 ReentrantLock 源码的第二篇,第一篇主要介绍了公平锁非公平锁正常的加锁解锁流程,虽然表达能力有限不知道有没有讲清楚,本着不太监的原则,本文填补下第一篇中挖的坑. Java读源 ...
- python输出中文乱码
首选项-浏览插件目录-USER文件夹 找到编译环境设置,编译方式为UTF-8编码 { "cmd": ["c:/Python36/python.exe",&quo ...
- 数据类型、运算符、Scanner的使用
一.常见的基本数据类型 数值型 byte(最小,2字节) short(4字节) int (默认 8字节) long(16字节) 浮点型 f ...
- vs 类型定义及语句,随机数
1 类型定义: 1)小数: 类型 变量名 赋值 decimal d : d=1.2m float ...
- 文字检测模型EAST应用详解 ckpt pb的tf加载,opencv加载
参考链接:https://github.com/argman/EAST (项目来源) https://github.com/opencv/opencv/issues/12491 (遇到的问题) ...