您的位置:首页 > 其它

一次误删数据的恢复过程

2010-01-15 20:12 369 查看
昨天犯了有史以来最大的错误,就是误删了一个大表其中30万条记录。由于很多程序都依赖于这个表,所以很快就有好几个用户向我反映了情况。

我急忙寻找方案,希望有简便的方法恢复数据,可是没有。后来我发现有好几个地方都推荐Log Explorer这个软件,可以读取SQL Server日志,恢复删除的数据。于是我顾不上支持正版了,立马搜索,结果在chinaz上面找到了“特别版”,在服务器上安装,运行。

程序要求我输入sa的密码,我输入以后,它自动建立一个新数据库,然后让我选择要连接的日志,或者同时可以连接数据库备份(不过我顾不上这个功能)。连接Online Log以后,便可以点击View Log了,或者可以实时跟踪数据库的操作日志(Real-time Monitor)。

View Log的功能显示了好几天以前的日志一直到最新的操作记录,而且每组事务用不同的背景色来区分,一目了然。找到了我误删数据的那组事务以后,就在这组事务上右键选择恢复整组事务。然而,毕竟它不可能强大到和rollback那样(因为rollback实现原理完全不一样啊),30万的数据量的恢复方法是:程序根据每条删除的数据生成insert语句,放在一个.sql文件中,让用户自己到ssms(2000么就是查询分析器)去运行这个文件。杯具啊!它在生成到一半的时候弹出错误框了。我一看桌面已经有一个recovery.sql了,就拿去运行,结果运行到一半ssms说没有足够的内存(服务器内存2G)。更可怕的是,这个文件已经196MB了,我用notepad++打开,竟然还只有7万条insert语句!于是这个方案放弃。

后来依然决定:拿今天早上的数据库备份先恢复到一个新数据库里去,再把新库里这个表的数据复制到我的库里,然后再到Log Explorer里找到那组事务,不恢复全部,只恢复当天生成的新记录。(就是说,备份是1/14号8点的,我恢复以后,再用Log Explorer单独只找8点以后的数据,恢复)

实践证明这是可行的,感谢Log Explorer的强大(虽然要恢复一个事务中的部分记录,需要一条条选中恢复,不能多选,搞了我15分钟,手酸死,恢复后竟然部分中文还有乱码,而且只乱第一个字)。

唯一郁闷的是我恢复数据库就搞了半天,原来要恢复差异备份的话,在恢复完全备份的时候必须选择停用数据库。然后恢复差异备份的时候就可以选择保持数据库可用了。

这次的经验教训我会一直记住的:首先每周完全备份每日差异备份是必须的,然后一定要记得begin tran,否则总有一天真有苦头吃
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: