08.7.24 YT数据灾难简记

那天,偶在测试程序,不小心删除了Dv_Topic表
本来是想删除测试数据库中的Dv_Topic表的,没想到失手删除了正在使用的数据库的Dv_Topic
失手过程是,偶用鼠标右键点击表,选择删除,接着另一只手立刻按下了回车,虽然按下回车之后偶立刻发现了这素主数据库,但已经来不及了,回车已经按下去了
这下麻烦大了,在MSSQL2005管理器中找了一下,没有发现恢复功能,于是咨询度谷,发现一个Log Explorer for SQL,说可以根据SQL日志恢复被误删除的表。于是偶就把这东西下载回来,但是安装的时候却提示出错,看安装日志它竟然说无法打开某键值,而那个键值保存的是MSSQL安装路径。偶真是不知道它怎么会无法打开那个键值,明明是一个很普通的键值,没有权限限制的键值,竟然打不开,真囧。
没办法,这软件不能用,只好另寻他法了。
不管怎么样,偶先从一个月前的备份中回复了Dv_Topic表。
偶曾经修改了动网的程序,让Dvbbs.Execute方法把所有执行过的SQL语句都记录下来,不过因为使用了ASP的缓存,所以并不能完整记录所有执行过的SQL语句,不过记录大部分还是没有问题的。首先偶就从这些SQL日志中筛选出INSERT INTO Dv_Topic和UPDATE Dv_Topic的语句,然后把这些语句重新执行一遍,预计可以恢复大部分的主题数据。
接着偶就这么做了,不过完成以后结果并不乐观,有不少帖子的数据还是没有回来,另外主题ID的数据也对不上号,肯定是漏记录了某些INSERT的语句,导致主题ID这个自动编号字段乱了。
又要另寻出路。
想到动网的数据库设计是有很多数据冗余的,Dv_bbsx表就有不少冗余,于是偶就想到可以利用这里的冗余数据来恢复YT的帖子主题数据。
果然这方法很不错,Dv_bbsx表中记录有帖子所在主题的标题和主题ID,有了这两个信息偶就可以回复主题数据了。于是偶写了一个SQL,把丢失的主题数据列出来,接着插入到Dv_Topic表中。插入完毕以后,偶又写了一个SQL语句来更新Dv_Topic中记录的主题的回复数。这方法很管用,大部分的主题都恢复了,仅仅有极少量的帖子主题ID重复,无法回复(实际上要恢复也是可以的,不过偶懒得管这么多了,也就几张帖子而已,而且都素不重要的帖子)。美中不足的就是帖子的点击数无法恢复。

这次灾难影响还不算太大,因为大部分数据都回来了嘛。不过这事还是提醒偶们,在进行诸如此类危险的数据库操作时,千万不要使用键盘,使用鼠标是最安全的。

This entry was posted in 樱町专栏 and tagged , , . Bookmark the permalink.

11 thoughts on “08.7.24 YT数据灾难简记

    • 哎呀,还以为你之前那个HTML里面失误的代码是由谷歌拼音资格的说
      对了想起来你在Ubuntu里面
      话说最近出现了一个scim-googlepinyin,偶正在考虑要不要抛弃ibus重新投入scim的怀抱

  1. 呃,某次干啥提示我请输入“是”或“否”
    然后我打y,不行
    然后我打yes,还不行
    必须输入是或者否
    所以键盘在某些情况下也是很安全的
    推广到这种情况可以要求必须输入是否才能把焦点定位在某个按钮上。。

    • 同意的说
      上次在DNSPOD删除一条记录,就弹出一个窗口来要求我输入大写的“OK”才能删除
      这样就避免很不小心地流畅地按下了鼠标和回车造成的损失了嘛
      貌似据说你也在用谷歌拼音?

发表评论

电子邮件地址不会被公开。

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>