前几天,我自己服务器,100多万条数据被误删,没用delete,没用truncate,没用drop,什么命令都没用数据却不翼而飞,当时数据丢失时候我浑然不知,直到我查询的时候,才发现数据全没了,而且发现数据全没了的时候,我也并未想起我做过什么删除操作,这次数据误删有一定偶然性,现在分享下这次误删的骚操作经过,并总结一些教训。

1、第一步

线上数据库里面有张表aaa,里面有100万条数据,我用Navicat导出该表的SQL文件,中间由于网络原因断网,最后只从线上导出了18万条数据,并存到了桌面为aaa.sql文件,因为是朋友要这些数据,对数据量没多大要求,18万条数据的aaa.sql就给他了,一共2.3GB

2、第二步

朋友用Navicate去运行我这个SQL文件加载存储数据,很长时间没加载上,我就尝试自己也开始加载了,为了加载时候不把原始数据表aaa覆盖,我这里将aaa.sql文件命名为了aaa222.sql

3、第三步

然后我在当前数据库用了Navicate执行aaa222.sql,执行了几秒没问题,可以正常加载,我就取消那个加载数据弹窗了,跟我朋友说可以正常加载没问题

事情的经过就是这样,以上操作看似正常,如果此时你没看出来我aaa表的110万条数据在我执行第三步开始就已经没了的话,那今天这篇文章,对你来说,可能会有一些收获。

其实说起来也很简单,主要还是自己平时没太注意sql文件里面都有什么内容,虽然我把aaa.sql文件重命名为aaa222.sql,但是我仅仅是换了个文件名,而里面的SQL语句,却并没有改变,sql文件其实里面就是一系列sql语句,下面的sql文件代码也可以很清晰的看到,在执行SQL文件的时候,首先进行了drop操作,如果有aaa表,则删除,后面我虽然过了一会才取消执行,但是18万条数据,2.3GB,也不是几秒钟能存进表里的,最终导致我第三步操作后,表里面只有几十条数据,其他100万条数据全没了

DROP TABLE IF EXISTS `aaa`;
CREATE TABLE `aaa` (
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL,
`c` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of aaa
-- ----------------------------
INSERT INTO `aaa` VALUES ('1', '2', '3');
INSERT INTO `aaa` VALUES ('1', '2', '3');

好吧,数据没了就没了,那总有备份吧,我想起来周末时候在阿里云进行过创建快照,数据应该能找到,然而,快照我当时确实创建了,却是为了升级服务器,咨询了阿里工作人员得知,升级服务器后,快照将被销毁!

没救了,只能再花近1个月的时间重新去构造这100万条数据了!!!

总结经验教训:

本次误删有一定偶然性,一般情况下,你遇到我这种误删情况的几率很小,更不会像我这样,不但误删了,而且数据没备份还找不回来了

1、我在导出数据时候只导出18万条,没有全量导出,也算是我没有充分备份数据

2、我在执行aaa222.sql的时候,还是在原来的数据库执行的,但凡我换个数据库,也不会出现误删情况

3、不了解sql文件的内部代码是先删除操作,所以,以后如果你进行执行SQL文件时候,一定要先想清楚,你要执行的sql文件创建的表会不会和别的表有冲突,以免误删

4、数据一定要备份备份备份!!!阿里云服务器的话,升级服务器前,更要备份数据!!!