SQL Server 完整备份位置

1 sql-server backup sql-server-2014

我使用 SQL Server 2014 Management Studio 创建了完整备份。之后,我将其删除并创建了差异备份,一切正常。如果原始完整备份被删除,服务器如何知道需要进行哪些差异备份?

Han*_*non 6

SQL Server 在所有数据库中创建差异备份位图。

此位图包含数据库中每个范围(8 页)的位。

完成完整备份后,SQL Server 会清除位图中每个位的内容。

当页面被写入(即行被更新、删除、插入等)时,差异位图被更新以反映修改的页面。

当 SQL Server 进行差异备份时,它使用差异备份位图来确定需要备份哪些页面。

如果删除差异备份所基于的完整备份,差异备份将变得无用。

为了证明这一点,您可以使用以下测试平台:

USE master;
GO

CREATE DATABASE [Test];
GO
Run Code Online (Sandbox Code Playgroud)

备份数据库:

BACKUP DATABASE [Test]
TO DISK = 'D:\SQLServer\Backups\Test_Full_Backup.bak'
WITH FORMAT
    , INIT
    , SKIP
    , STATS = 1;
GO
Run Code Online (Sandbox Code Playgroud)

向数据库中添加一些内容:

USE Test;
GO

CREATE TABLE dbo.SomeDDL
(
    ID INT NOT NULL
);
GO
Run Code Online (Sandbox Code Playgroud)

进行差异备份:

USE master;
GO

BACKUP DATABASE [Test]
TO DISK = 'D:\SQLServer\Backups\Test_Diff_Backup.bak'
WITH DIFFERENTIAL
    , STATS = 1;
Run Code Online (Sandbox Code Playgroud)

删除完整备份(这需要启用 xp_cmdshell):

EXEC xp_cmdshell 'DEL D:\SQLServer\Backups\Test_Full_Backup.bak';
Run Code Online (Sandbox Code Playgroud)

尝试恢复差异备份:

RESTORE DATABASE [test]
FROM DISK = 'D:\SQLServer\Backups\Test_Diff_Backup.bak'
WITH RECOVERY;
Run Code Online (Sandbox Code Playgroud)

出现几个错误:

Msg 3117, Level 16, State 1, Line 9

无法恢复日志或差异备份,因为没有文件准备好前滚。

消息 3013,级别 16,状态 1,第 9 行

RESTORE DATABASE 异常终止。

有关差异备份如何工作的详细信息,请参阅此 MSDN 页面。