sqlserver2005中,失误清空了一张数据表的数据,恢复办法!求高手解答

解决方案 »

  1.   

    drop database studentdb1,a,b,c,d
    --创建一个测试数据库create database testdb
    go--备份测试数据库
    backup database testdb to disk='e:\testdb.bak' with format
    go
      
    --使当前数据库处于当前使用状态
    use testdb 
    go--创建测试表create table test_table
    (sno int )
    go--延时1秒钟,再进行后面的操作(这是由于SQL Server的时间精度最大为百分之三秒,
      --不延时的话,可能会导致还原到时间点的操作失败) WAITFOR   DELAY   '00:00:01 ' 
    GO 
    --假设现在误删了上面创建的测试表drop table test_table
    go--保存删除时间
    select dt=getdate() into #
    goselect * from #  --查看该表下的内容--后来发现上述表不应该删除,要恢复过来--下面演示恢复该表的过程--首先备份事务日志(使用事务日志才能还原到指定的地点)
    backup log testdb to disk='e:\testdb_log.bak' with format
    go--接下来,我们要先还原完全备份(还原日志必须在还原完全备份的基础上进行) restore database testdb from disk='e:\testdb.bak' with replace,norecovery
    go--将事务日志还原到删除操作前(这里的时间对应上面的删除时间,并比删除时间略早 
    DECLARE   @dt   datetime 
    SELECT   @dt=DATEADD(ms,-60,dt)   FROM   #     --获取比表被删除的时间略早的时间 
    RESTORE   LOG   testdb   FROM   DISK= 'e:\testdb_log.bak '   WITH   RECOVERY,STOPAT=@dt 
    GO 
    select * from test_table 
    以上我做了一遍,但最后没有恢复删除的数据表!我想是不是我的时间上的间距设置问题!大神们帮我看看!
      

  2.   

    你创建的是TEMP表啊,TEMP表数据是保存在TEMPDB的,所以你备份的数据库是不会保护这个数据的。如果你创建的不是临时表是可以找回数据的。
      

  3.   

    LZ代码恢复的思路是正确的,
    建议
    1.将延时时间加长,如5秒.
    2.SELECT @dt=DATEADD(ms,-60,dt) FROM #  --获取比表被删除的时间略早的时间 
      --> 这里dateadd()参数2的值应该等于 -1000*延时秒数, 60太小了.注意这里不是60进制的,1s=1000ms.
      

  4.   


    你的意思-60表示的不是往前60s啊而是60ms对吧,上面的问题我解决了,谢谢哈!我把dateadd第二个参数改为-60000,提示回滚数据太靠前,我改为-10000就可以了,我就是想问下,SELECT @dt=DATEADD(ms,-60,dt) FROM #  --获取比表被删除的时间略早的时间 
    这个时间间距有没有什么规则,比如离删除表之间的时间应该控制在什么时间段内,有没有规定的有效回复时间!