假设两个库名分别为dbold(原备份的),dbnew(现在使用的),要恢复数据的表名为tb,执行以下脚本:use dbnew go set identity_insert tb on go declare @s varchar(8000) select @s=isnull(@s+',','')+quotename(name) from syscolumns where id=object_id('tb') exec('insert tb('+@s+') select * from dbold.dbo.tb t where not exists(select 1 from tb where id=t.id)') go set identity_insert tb off go
用log explorer看删除了什么数据,就加入那些数据
Log Explorer 三方工具即可解决
具体表结构具体分析,要注意insert的顺序的,如果有约束等等。
如果数据真的这么重要,那就用备份再还原出另一个库,然后将两个库进行比较。 比较数据的工具,我用过 toad for sqlserver,效果很好
结贴! 我发现我的log文件只有几百k,用Log Explorer查看不到日志,所以作罢了。 htl258的方法是可行的,代码有一点点小问题,@s的值是按字段名排序的,所以后面不能直接select * ,我把正确的贴出来,希望对大家在以后遇到类似问题有所帮助,还有就是稍微麻烦点,先要找到被删除的表名。我用sqlDiff查看的,然后每个表写一段代码。use WacDB2 go set identity_insert ClientList on go declare @s varchar(8000) select @s=isnull(@s+',','')+quotename(name) from syscolumns where id=object_id('ClientList') exec('insert ClientList('+@s+') select '+@s+' from WacDB3.dbo.ClientList t where not exists(select 1 from ClientList where id=t.id)') go set identity_insert ClientList off go
原因是多个表的多条数据被删,是因为删除了几条客户数据,所以相关的发货数据、拜访记录等都被删除。
有没有可能对比两个数据库,比如在2010//5/4 12:00前缺失的记录自动恢复?
go
set identity_insert tb on
go
declare @s varchar(8000)
select @s=isnull(@s+',','')+quotename(name) from syscolumns where id=object_id('tb')
exec('insert tb('+@s+') select * from dbold.dbo.tb t where not exists(select 1 from tb where id=t.id)')
go
set identity_insert tb off
go
比较数据的工具,我用过 toad for sqlserver,效果很好
我发现我的log文件只有几百k,用Log Explorer查看不到日志,所以作罢了。
htl258的方法是可行的,代码有一点点小问题,@s的值是按字段名排序的,所以后面不能直接select * ,我把正确的贴出来,希望对大家在以后遇到类似问题有所帮助,还有就是稍微麻烦点,先要找到被删除的表名。我用sqlDiff查看的,然后每个表写一段代码。use WacDB2
go
set identity_insert ClientList on
go
declare @s varchar(8000)
select @s=isnull(@s+',','')+quotename(name) from syscolumns where id=object_id('ClientList')
exec('insert ClientList('+@s+') select '+@s+' from WacDB3.dbo.ClientList t where not exists(select 1 from ClientList where id=t.id)')
go
set identity_insert ClientList off
go