【问题标题】:How do I rescue a small portion of data from a SQL Server database backup?如何从 SQL Server 数据库备份中挽救一小部分数据?
【发布时间】:2009-05-29 15:13:57
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: sql-server-2008 backup database-restore


    【解决方案1】:

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

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

    我总共只有大约 10 条主记录,其中 2 个其他表中有关系数据。我只花了大约一个小时就恢复了原来的样子。

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

    【讨论】:

    • 我成功了。 sp_generate_inserts 很有帮助,但在具有大量列的表和具有 nvarchar 列的表上会失败(正如它所说的那样)。而且,您的 WHERE 子句限制为 128 个字符。结果,我几乎不得不为每张桌子手动做至少一件事。
    【解决方案2】:

    您必须手动恢复。 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())
                )
    

    【讨论】:

      【解决方案3】:

      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 子句来过滤表中的行),但可能更可靠,因为它是产品的一部分。

      【讨论】:

        猜你喜欢
        • 2012-10-29
        • 1970-01-01
        • 2021-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多