一、前奏
写这篇文章主要是周四晚上我们的数据库出了问题,然后结果那天晚上我弄到凌晨两点半才把数据恢复,这让我想起了15年在上一家公司也是出现的数据库事故问题,但是这一次的让我考虑的角度更加的不一样吧。
二、15年mysql挂掉问题
15年我还在广州的上一家公司,记得每次发布都是在凌晨零点发布,因为我们公司有搭建git的私服,所以我们的代码都是放到git上的,部署也是很简单的,本地合并后,提交代码,然后在服务器上(当时没有做集群,只是配置了nginx)使用几个命令就搞定了,首先停掉tomcat,然后执行下面命令:
git pull origin master
mvn install -Dmaven.test.skip=true
然后在启动tomcat就搞定。而且当时的运维主要在平台的部门,所以我们这些服务器都是我们自己来安装,搭建,部署等。在周四晚上零点发布的时候,按照往常的方式来操作,启动完成后,打开网站,可以运行,然后打开手机app,开始都没问题,但是一分钟不到,app开始报错,尝试了下后台也是一样开始报错,最后原因都是数据库查询不到数据等原因,然后我们尝试重启了数据库,发现数据库重启失败了,这可就蛋疼了,然后根据数据重启报错原因,在网上开始找解决方案,但是因为是数据库问题,所以在处理之前我们先把数据库的相关文件进行了备份操作,然后开始按照网上的方案进行处理,但是最后的结果还是重启失败,最后没办法只能把问题向上反应到总监那里,最后cto都知道了事故,就找平台的运维同事帮忙处理这个问题,运维的同时找到说服务器上有一些特别的命令,但是并不是我们的输入的命令,最后发现数据库的数据有丢失,有的表竟然还没有数据,还好这些没有数据的表是权限和配置文件的表,这些有备份文件没问题,但是主要是用户数据丢失,订单数据的丢失,最后按照mysql文件下的一些文件恢复,可是还是丢失了几天的数据,这对于我们来说已经算事非常严重的事故了,说白了,用户数据就是金钱,最后找到数据库数据丢失的原因大概猜测是因为我们把某个文件放到了Linux下/tmp目录下,这个目录在某个时间会定时的清理,可是之前已经运行了一年没有问题,突然出现的问题,这次事故后,我们这边的相应措施也开始建立起来,做定时本分,读写分离,并且操作权限的限制等等。
经历了这样的事情,在之后的涉及到手动修改数据库的时候我都会先备份数据,然后在进行相关的操作,在操作生产的数据,谨慎和严谨是必须的。
三、存储过程造成数据异常
上周四吧,由于空间问题,dba移动了相关oracle数据库位置,结果造成之前的Dblink的连接失败,然后造成大概已经跑了5年的存储过程出现问题,11月份基本没有执行成功过,最后问题反馈到会员这里,需要跟进处理,找到问题根源后,dba修改相应的Dblink地址,然后我们手动指定时间执行存储过程,相应的数据没有发现异常情况,然后就等到某日存储过程定时自己执行,在某天定时执行后,快到下班了,相关人员每天抽查数据,发现数据预警了,然后开始排查数据,发现是把很早很早的数据又执行了一遍,这个存储过程是用来奖励积分的,就这样,有的人积分全部重新奖励了一遍,积分就是金钱呀,这个损失可就大了,那么我们首先想到的就是要恢复数据,可是恢复数据,恢复哪些数据,哪些表,都还需要从存储过程中获取,都是需要时间了,所以此时就想把整个网站,app的使用积分的功能给关掉,可是问了支付的同时才知道,积分的使用控制竟然还在各个业务线,这个从业务的角度来说应该是不合理的,支付竟然不能控制积分使用的开关。所以没办法只能硬着头皮看存储过程了,然后再查询数据,该修改的修改,该删除的删除,做这些之前,数据的本分那时必须的,所以就这样,一步步的来,每个人加了几分的,我们需要减去,然后更新几分明细,总积分等,最后删除相关的奖励积分纪录,最后我们还要查询在我们这期间,有没有人使用这笔奖励的积分,最后查询还真查询到了有数据,但是最后对比发现是使用自己的积分,算是没有造成损失,由于前一天太晚,第二天下午上班,然后来了公司就开始找问题根源,出事故报告,解决方案等。
对于这一次的问题,我更多的想到的是我们的业务设计的不合理性,在这样的时候,如果能关闭积分的使用,对于数据处理是非常有必要的,但是我们的却没有。所以业务的考虑一定要全面,拓展型,开放型等。
四、有关业务的思考
今年来深圳面试的时候,因为我之前是做充电桩的,所以面试的时候聊的都是充电桩的问题,记得遇到一个面试官问我:"对于我们的数据,怎么来产生效益"。其实这个问题把我给问过了,这个效益我就不明白了,用户用充电桩给车充电,充电费用算事效益,可这个太简单直白了,那么我们获取的数据还能怎么产生效益了,最后面试完,我问面试官之前的这个问题是怎么考虑的,面试官回答说:"充电产生的数据,某一个充电点每天有多少辆车充电,或者说哪些车型的车充电(如果现在没有车型,以后是否可以在设计的时候加进去),这些数据我们是否可以卖给哪些开修理店的或者洗车店的,使用频率高的地方,在这附近开相应的汽车店是否很合理",其实对于这个问题,我真的是没有想到这方面。所以这就是一个思维拓展的方面了,思想考虑的不够多,太过去局限,所以在这方面自己还需要多想,多思考,也许这就是数据与发散性思维了。
五、浩语
__
__ _ ____ __| |__ _____ ___
\ \/ \/ / | \ | \\__ \ / _ \
\ /| | / Y \/ __ \( <_> )
\/\_/ |____/|___| (____ /\____/
\/ \/
走在自己的路上,遇到要遇到的人,经历要经历的事,这才是我们需要面对的。