记一次真实的线上事故:一个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"的心情,自信的打 ...
随机推荐
- python10
一.多进程multiprocessing multiprocessing包是Python中的多进程管理包.与threading.Thread类似,它可以利用multiprocessing.Proce ...
- 非PDC角色DC强制NTP
前一阵,公司其他部门员工告诉我,他们的系统无法通过LDAP搜索账户了 经过检查,发现该服务器的时间居然比我们的时间服务器PDC快了将近20分钟,而且该问题机器的 时间源并非PDC,而是另外一台普通DC ...
- java实现图片的上传和展示
一.注意事项: 1,该项目主要采用的是springboot+thymeleaf框架 2,代码展示的为ajax完成图片上传(如果不用ajax只需要改变相应的form表单配置即可) 二.效果实现: 1,页 ...
- AJ学IOS(12)UI之UITableView学习(上)LOL英雄联盟练习
AJ分享,必须精品 先看效果图 源代码 NYViewController的代码 #import "NYViewController.h" #import "NYHero. ...
- Linux下搭建接口自动化测试平台
前言 我们今天来学习一下在Linux下如何搭建基于HttpRunner开发的接口自动化测试平台吧! 需要在Linux上提前准备的环境(下面是本人搭建时的环境): 1,Python 3.6.8 (可参考 ...
- MySQL 5.7.18 zip 文件安装过程
安装最新MySQL:5.7.18 1.下载路径 https://dev.mysql.com/downloads/mysql/ 有账号登陆下载, 没有账号:no thanks;just start my ...
- 使用 Chrome 插件 Vimium 打造黑客浏览器
之前一直用 cVim,与 Vimium 功能类似,但是之后不在更新了,故转战到 Vimium. 简介 官网:http://vimium.github.io/ Vimium 是 Google Chrom ...
- OkHttp 优雅封装 HttpUtils 之 上传下载解密
曾经在代码里放荡不羁,如今在博文中日夜兼行,只为今天与你分享成果.如果觉得本文有用,记得关注我,我将带给你更多. 还没看过第一篇文章的欢迎移步:OkHttp 优雅封装 HttpUtils 之气海雪山初 ...
- [YII2] COOKIE的操作使用
PHPcookie的设置 setcookie('username',$data['username'],time()+3600*24*7); YII2cookie的设置 $cookies = Yii: ...
- 简谈” Top K“
Top K 快速选择和堆排序都可以求解 Kth Element 和 TopK Elements 问题. 题见215. Kth Largest Element in an Array (Medium) ...