如何从SQL Server数据库备份中恢复部分数据?

5
我有一个实时数据库,其中一些数据被删除了,我需要恢复这些数据。我有一个非常新的备份副本已经在另一台机器上恢复了。与备份之后进行了无关的更改,因此我不想使用完整的恢复覆盖实时数据库。
我需要的数据很少 - 只有十几行 - 但是这十几行每行都有来自其他表的两行具有外键依赖关系,这些两行有许多行具有指向它们的外键,所以手动恢复将变得很复杂。
理想情况下,我希望能够告诉备份副本的数据库选择我需要的那十几行数据,以及它们所依赖的一切,以及依赖于它们的一切,并仅导出该数据,然后将其导入实时数据库,而不会对其他任何内容进行操作。
在这里采取什么样的最佳方法?谢谢。
每个人都提到了sp_generate_inserts。在使用它时,如何防止Identity列弄乱一切?您只需打开IDENTITY INSERT吗?
3个回答

1

你必须手动恢复。sp_generate_inserts 适用于新数据。但是对于更新数据,我会这样做:

SELECT 'Update YourTable '
    +'SET Column1='+COALESCE(''''+CONVERT(varchar,Column1Name)+'''','NULL')
    +', Column2='+COALESCE(''''+CONVERT(varchar,Column2Name)+'''','NULL')
    +' WHERE Key='+COALESCE(''''+CONVERT(varchar,KeyColumn)+'''','NULL') FROM backupserver.databasename.owner.YourTable

你也可以这样创建插入语句,但是sp_generate_inserts更好。注意那些标识列的值,并祝你好运(我以前遇到过这个问题,知道你现在的处境)。

有用的查询:

--find out if there are missing rows, and which ones
SELECT
    b.key,c.key
    from backupserver.databasename.owner.YourTable b
        LEFT OUTER JOIN YourTable                  c ON b.key=c.key
    WHERE c.Key is NULL

--find differences
SELECT
    b.key,c.key
    from YourTable                                                c 
        LEFT OUTER JOIN backupserver.databasename.owner.YourTable b ON c.key=b.key
    WHERE  b.Key is not null
        AND (   ISNULL(c.column1,-9999)     != ISNULL(b.column1,-9999)
             OR ISNULL(c.column2,'~')       != ISNULL(b.column2,'~')
             OR ISNULL(c.column2,GETDATE()) != ISNULL(b.column2,GETDATE())
            )

1

我以前遇到过类似的情况,但是我发现手动操作对我来说效果最好。

我将备份恢复到了第二个服务器上,并执行了所需的查询以获取所需的信息,然后构建了一个脚本来插入数据 sp_generate_inserts,接着为具有关系行的每个表重复此步骤。

总共我只有大约10个带有2个其他表中关系数据的主记录。花费了我约一个小时的时间把一切都恢复到原来的状态。

更新回答你关于sp_generate_inserts的问题,只要指定@owner='dbo',它就会为您设置identity insert为ON,然后在脚本结束时将其关闭。


我成功了。sp_generate_inserts很有帮助,但是在有大量列和nvarchar列的表上会失败(正如它所说)。而且,你的WHERE子句限制为128个字符。因此,对于每个表,我基本上都必须手动完成至少一件事情。 - Greg Smalter

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接