2009-05-29 63 views
5

我有一个实时数据库,有一些数据从中删除,我需要这些数据。我有一个已经在另一台机器上恢复的数据库的最近副本。自备份以来,对活动数据库进行了无关的更改,因此我不想用完全恢复来清除活动数据库。如何从SQL Server数据库备份中拯救一小部分数据?

我需要的数据很小 - 只有十几行 - 但是这十几行每个都有其他表的几行,外键指向它,而那些行的行已知道有多少行有外键指向它们,所以手工恢复会很复杂。

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

这里最好的方法是什么?谢谢。

大家都提到了sp_generate_inserts。当使用这个,你如何防止身份列搞乱一切?你只是打开IDENTITY INSERT?

+0

+1,祝你好运! – 2009-05-29 15:49:09

回答

1

我以前遇到过类似的情况,但发现用手工做最适合我。

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

总共我只有大约10个关系数据在其他两个表中的主记录。我只花了大约一个小时就把所有事情都恢复了原样。

UPDATE要获得关于sp_generate_inserts的问题,只要你指定@所有者=“DBO”,它会标识插入设置为ON,然后将其设置为关闭的脚本,你结束。

+0

我成功了。 sp_generate_inserts是有帮助的,但它在具有许多具有nvarchar列的列和表的表上失败(正如它表示的那样)。而且,您的WHERE子句限制为128个字符。结果,我几乎不得不为每个表手动至少做一件事。 – 2009-05-30 01:53:42

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()) 
      )