1 sql-server backup sql-server-2014
我使用 SQL Server 2014 Management Studio 创建了完整备份。之后,我将其删除并创建了差异备份,一切正常。如果原始完整备份被删除,服务器如何知道需要进行哪些差异备份?
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 页面。