是否可以从备份中部分恢复数据?

Mat*_*att 2 sql-server sql-server-2008-r2 restore

抱歉,如果我没有使用正确的术语,我不是 DBA,但现在,我就在这里!

情况是上周,一个数据库服务器运行不正常(大约有 6 年历史)。托管公司构建了一个新服务器,并将所有当前数据转移到运行良好的新服务器上。

然而,不知何故,新服务器丢失了 36 小时的数据。托管公司为我们提供了包含这些数据的备份等。

由于某些表具有自动生成的键(类型integer),是否有任何方法可以将日期范围中的一组数据恢复到我的实时数据库中?我显然不能只是剪切和粘贴,因为所有数据的完整性都将丢失。

想法?

Windows Server 和 Microsoft SQL Server 2008。

Sql*_*ide 7

不,你不能做你在问题中提到的。

我相信有很多方法可以恢复您需要的数据。一种方法是:

  • 将备份还原为不同的(名称)数据库。
  • 使用此源和您当前的实时数据库协调数据。你如何做到这一点?将完全取决于您丢失的内容和您的业务逻辑。
  • 您当然可以利用自动生成的整数键(至少对于具有此键的表)。您可能需要在此处进行一些检查,具体取决于当前实时数据库中的差距在哪里。

我知道这是一个非常笼统的答案。如果您需要个别表格的具体帮助,您将需要发布表格架构、示例数据和差距的详细信息。

附带说明一下,您可能想重新考虑使用这家托管公司。


CaM*_*CaM 5

不是直接的,但这里有一个解决方法

在 SQL Server 中对单个表或行进行部分还原的方法是将备份还原到不同的数据库名称,然后手动将特定丢失的数据从还原的数据库移回生产数据库。

这涉及几个步骤,具体取决于您的环境。如果原始数据库名为 DB1,那么您可以执行以下操作:

RESTORE FILELISTONLY
FROM DISK = 'PATH\To\FullBackup.bak';
Run Code Online (Sandbox Code Playgroud)

这将为您提供要插入下一步的逻辑和物理文件名:

RESTORE DATABASE DB1_RESTORE
FROM DISK = 'PATH\To\Full_Backup.bak'
WITH MOVE 'Data' TO 'PATH\To\DataFiles\DB1_Restore_01.mdf',
     MOVE 'Log' TO 'PATH\To\LogFiles\DB1_Log_Restore_01.ldf', NORecovery;
Run Code Online (Sandbox Code Playgroud)

您需要针对您的特定环境进行调整,但基本上有两个关键点需要记住:

  1. 将数据库本身重命名为您可以识别的不是真正的数据库
  2. 将 EACH FILE 重命名为新名称,这样您就不会覆盖现有的 DB 文件。

如果您有 Diff 备份文件,则执行

RESTORE DATABASE DB1_RESTORE
    FROM DISK = '\PATH\To\Diff_backup.bak'
    WITH NORECOVERY;
Run Code Online (Sandbox Code Playgroud)

然后为每个日志文件备份:

RESTORE LOG DB1_RESTORE FROM DISK = '\PATH\To\LogFile_1.trn'  WITH NORECOVERY;
RESTORE LOG DB1_RESTORE FROM DISK = '\PATH\To\LogFile_2.trn'  WITH NORECOVERY;
RESTORE LOG DB1_RESTORE FROM DISK = '\PATH\To\LogFile_3.trn'  WITH NORECOVERY;
Run Code Online (Sandbox Code Playgroud)

依此类推,直到您恢复了所有日志文件。

最后,

RESTORE DATABASE DB1_RESTORE WITH RECOVERY;
Run Code Online (Sandbox Code Playgroud)

之后,您可以开始手动将数据从恢复的数据库复制到原始生产数据库。

但在将数据复制回生产数据库之前,请对该数据库进行完整备份。以防万一。

如果需要将数据插入具有标识(自动编号)列的表中,请使用

SET Identity_Insert DB1.dbo.tablename ON

INSERT INTO DB1.dbo.tablename ( col1, col2, col3 )
Select col1, col2, col3
From DB1_Restore.dbo.tablename Where col1 > 1234

SET Identity_Insert DB1.dbo.tablename OFF
Run Code Online (Sandbox Code Playgroud)

以上是一个非常通用的脚本,如果您不付出一些努力,它将无法工作,但它应该可以帮助您入门。Identity_Insert 语句允许您插入到 Identity 列中。只要确保你的 WHERE 子句正确,这样你就不会插入错误的数据。