删除SQLServer2005历史数据之工作小结

 懿古今   2017-02-20 08:41:38 发布  随笔日记

上周六折腾了大半天都没有把领导交代的任务完成,结果就是周日就自己到公司继续加班,继续删除某系统的历史数据,最后终于在上周日中午全部完成,那一刻的心情非常开心,而且颇有成就感。今天就特意动动手记录一下心得,以此提醒自己以后凡事要多动动脑子,事前想一想比直接埋头苦干效率更好,这个就是所谓的『磨刀不误砍柴工』吧。

删除SQLServer2005历史数据之工作小结 - 第1张 - 懿古今(www.yigujin.cn)

任务描述

删除公司某系统2016年10月份以前的所有数据。这个系统是从08年投入使用,也就是说需要删除08年至16年9月份之间的所有数据。

系统背景

这套系统据说是08年的时候某大学教授带领学生完成的作品,然后买给我们,而我们公司就一直使用至今,从未升级过,从08年交付那一刻起,一直到现在都没有交过任何的维护费用,所以对于这套系统可以说是一无所知,只知道是asp.net+ sql server 2005。

这套系统不升级也无所谓,最最关键的是这套系统的后台相当简陋,只有几个选项的设置及用户管理。换句话就是说这套系统的95%以上的项目数据都不能在后台直接删除,想要删除数据就只能直接操作数据库删除。而且这套系统没有任何的文档说明,数据库里面也有几十张表,部分表的数据更是达到百万级别。

数据删除过程

第一阶段:直接人工删除

删除SQLServer2005历史数据之工作小结 - 第2张 - 懿古今(www.yigujin.cn)

在解决了『目录名无效』问题之后就可以打开sql server 2005数据库表了,然后我就没有多想,逐一打开这套系统的数据库表,发现有日期字段的,就直接把日期在2016年10月份以前的所有数据人工删除。如果一次选择几条数据删除倒是很快,但是选择超过3000条以上的数据再删除就慢如蜗牛,如果选择更多数据,直接卡死。

那一刻看着几百万条数据,如果按这个人工删除数据的速度,不吃不喝都要干好几天呢。那时候就直接度娘“百万级数据如何批量删除”,发现有很多结果,说来说去好像也就那么几种方法,分别是truncate 、delete与drop方法,可惜我因为不熟悉数据库,所以一直都不敢尝试。本想用SQL的删除语句来删除,看到度娘中有很多人说delete操作会被完整记录到日志里,它需要大量空间和时间,那时候以为用delete语句也是很慢的,一直都没有去尝试过。

第二阶段:电话求助朋友

删除SQLServer2005历史数据之工作小结 - 第3张 - 懿古今(www.yigujin.cn)

既然人工删除这么慢,而且自己又拿不准用什么方法来批量删除数据,最后只能电话求助一个经常折腾微软数据库的朋友。知道我的意思后他直接建议用delete语句删除就可以了,不用折腾这么复杂。既然专业的朋友都这么建议了,然后我马上就找其中一个数据表来试验,没想到删除几千几万的数据果然速度很快,与人工删除效率相比,就好比公交车与地铁速度一样,相差甚远。

不过在用delete语句删除的过程中,为了防止一次性删除太多数据卡死,就按数据库表、按年份逐一分批删除,最后把所有有日期字段的数据库的历史数据都删除了,可惜在登录这套系统验证时,竟然某些项目还是能看到历史数据,那一刻心里的崩溃的。

既然还有项目能看到历史数据,就说明这个数据库里面的数据还没有删除,然后又把这套系统的数据库里面的数据表都反复翻看,可惜还是看不出问题出在哪里?心中有一个想法就是可能这些数据存放在没有日期字段的数据库表中,但是无法判断是哪些数据。

第三阶段:思路转变解决问题

既然数据库搞不定,当时就想到直接修改这套系统的日期控件,让它只能选择2016年10月份及之后的日期,那样应该同样达到领导的目的吧。可惜后来研究这个日期控件js和这套系统的代码,还是搞不定。对于自己不擅长的东西,只能果断放弃,还是转回数据库继续研究。

删除SQLServer2005历史数据之工作小结 - 第4张 - 懿古今(www.yigujin.cn)

在反复翻看数据表的时候,发现有一个数据表竟然有几十万条记录,说明这个数据表很可疑,但是看了半天都没有发现这个数据表的字段分别代表什么意思,也没有日期字段。后来发现这个表的某个字段的数值都非常大,达到6-7位数字之多,而且后面大多都是0结尾,查看了这个字段拓展属性之后才发现竟然是分钟数,而且是从2000年起的分钟数。到这一刻,我才明白过来,这个字段其实也是日期字段,只是开发者有意隐藏起来而已。

思路清晰了,直接网上找到一个『在线日期计算器』计算出2016年10月1日至2000年1月1日相差多少天,然后一天24小时,一小时60分钟,那么就可以计算出2016年10月1日距2000年1月1日的分钟数是8809920,那么通过delete语句删除这个字段小于这个8809920的所有数据即可。

再次把这个数据表的历史数据删除之后,再次登录系统验证,果然某些项目已经没有历史数据后,可惜还是有两个项目还存在历史数据,而且这个历史数据是某些天有,某些天没有。然后再次反查数据库表,可惜这次真的再也找不出有任何疑问的数据了。

在准备放弃之余想到我们玩网站的时候竟然有缓存数据,这套系统会不会也有缓存的数据?根据这个思路去翻看这套系统的源文件,没想到还真被发现了,原来这套系统的报表系统在你查看时,都会自动生成一个报表文件,数据全部都缓存在这个文件中,就算你数据库没有数字,但是你查看这个日期的报表依然可以看到数据。幸好这些缓存的报表数据都是以日期命名的,所以操作起来也很简直,直接把2016年10月以前的缓存数据全部删除。之后登录系统验证数据时,终于再也找不到任何的历史数据了。

小结

经过这次删除数据的经历,我终于明白了开发人员常说的『宁可开发一套新系统,也不想在别人的系统上继续开发』的意思。如果别人的系统都留有技术文档说明,而且代码规范,数据库命名规范等可能还可以继续开发,否则的话单是研究旧系统的数据库结构就够忙活很久了。

同样道理,就好比我们折腾WordPress主题一样,如果是自己开发的主题,想怎么增加功能、怎么折腾代码都很得心应手,单是如果是改别人的主题,特别是那种不规范的主题,往往都是感觉无从下手,不懂应该从何改起。

删除SQLServer2005历史数据之工作小结 - 第5张 - 懿古今(www.yigujin.cn)

其实,不管是在旧系统继续二次开发,还是修改别人的系统文件或主题,首先是要先弄懂文件内容、代表的含义和数据结构等等,然后再动手,这样效果才会更高。前往不要接到任务就直接埋头苦干,建议在干之前一定要先想想『如何干』才行。

不管怎样,我的任务终于完成了,就是可惜了我的周末!

本文地址:https://www.yigujin.cn/1124.html

你可能感兴趣的文章

文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 懿古今 所有,欢迎分享本文,转载请保留出处!发布此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请发邮件至[email protected],确认后马上更正、删除,谢谢!

发表评论

  1. 简单生活
    简单生活 @回复

    博主6到不行啊,工作多面手,老板要给你发奖金啊 [阴险]

  2. oldcheetah
    oldcheetah @回复

    一直没明白你到底干嘛的?it电工么?

    • 懿古今
      懿古今2017-02-20 11:34  回复

      @oldcheetah[抓狂] 从文秘文书到后勤打杂,从电工司机到网络、服务器、系统管理,从种甘蔗到收甘蔗等等都涉及到,因为公司裁员缘故,工作量暴增,收入一样 [抓狂] [抓狂] [抓狂]

  3. 姜辰
    姜辰 @回复

    我感觉博主是全方位能手~~

    • 懿古今
      懿古今2017-02-20 13:37  回复

      @姜辰[抓狂] 这个都是逼出来的,现在公司的情况就是要么干,要么滚,没办法

  4. 杭州SEO优化
    杭州SEO优化 @回复

    凡事都要动脑子

  5. Koolight
    Koolight @回复

    博主应该多低调,就是因为老板发现你什么都会做之后,就把什么都给你做了。

    • 懿古今
      懿古今2017-02-20 21:29  回复

      @Koolight[抓狂] [抓狂] [抓狂] 看来我要学会说:“NO”才行

  6. 小C博客
    小C博客 @回复

    这样最快:delete from table where rq > stat and rq < end

    • 懿古今
      懿古今2017-02-20 21:29  回复

      @小C博客后来我就是用这个方法,不过每次就删除几万条记录,分批来,如果一次性删除太多也会卡

  7. 杭州SEO优化
    杭州SEO优化 @回复

    博主你首页幻灯片多长时间更新一次呢?

  8. 马超金博客
    马超金博客 @回复

    厉害了我的哥

  9. 热腾网
    热腾网 @回复

    有能力还是单独开发的好。现在使用phpthink框架开发是主流了。

    • 懿古今
      懿古今2017-02-21 22:34  回复

      @热腾网公司都东西,没钱没任务的情况下,没有谁会去自动搞它

  10. 杭州SEO优化
    杭州SEO优化 @回复

    昨天试着操作忘记了 再来看下