5

我有一个实时数据库,其中删除了一些数据,我需要恢复这些数据。我有一个该数据库的最新副本,该副本已在另一台机器上恢复。自备份以来,对实时数据库进行了不相关的更改,因此我不想通过完全恢复来清除实时数据库。

我需要的数据很小——只有十几行——但是这十几行每一行都有几行来自其他表的外键,而这几行有上帝知道有多少行外键指向它们,所以它会手工恢复很复杂。

理想情况下,我能够告诉数据库的备份副本选择我需要的十几个行,以及它们所依赖的所有内容的传递闭包,以及依赖它们的所有内容,然后只导出这些数据,然后我可以导入实时数据库而不触及任何其他内容。

在这里采取的最佳方法是什么?谢谢。

大家都提到过 sp_generate_inserts。使用它时,如何防止身份列搞砸一切?你只是打开 IDENTITY INSERT 吗?

4

3 回答 3

1

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

我将备份恢复到第二台服务器并进行查询以获取所需的信息,然后构建一个脚本来插入数据sp_generate_inserts,然后对每个具有关系行的表重复此操作。

总的来说,我在另外 2 个表中只有大约 10 条带有关系数据的主记录。我只花了大约一个小时就将一切恢复原状。

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

于 2009-05-29T15:19:56.843 回答
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())
            )
于 2009-05-29T15:29:07.137 回答
0

SQL Server Management Studio for SQL Server 2008 允许您将表数据导出为插入语句。请参阅http://www.kodyaz.com/articles/sql-server-script-data-with-generate-script-wizard.aspx。这种方法缺乏 sp_generate_inserts 的一些灵活性(例如,您不能指定 WHERE 子句来过滤表中的行),但可能更可靠,因为它是产品的一部分。

于 2010-05-29T18:46:49.787 回答