SQL Server差异备份
目录简介
差异备份基于最近的完整备份。换句话说,只有在至少有一个完整备份后,才能创建差异备份。
差异备份捕获自上次完全备份以来的所有更改。完全备份是差异备份的基础。
下图说明了差异备份与完整备份之间的关系:
在这张图片中,有两个完整备份和三个差异备份。
第一个完整备份包含 id 1,第二个完整备份包含 id 1、2和3。
第一次和第二次差异备份在第一次完全备份之后执行。因此,第一个差异备份包含 id 2,第二个差异备份包含 id 2和3。
第三个差异备份是在第二个完整备份之后进行的,因此它只包含id 4。
差异备份 vs 完整备份
与完整备份相比,差异备份具有以下优点:
- 速度快–与创建完整备份相比,创建差异备份可能非常快,因为差异备份只捕获自上次完整备份以来发生变化的数据。
- 存储少—差异备份比完整备份需要更少的存储空间。
- 更少的数据丢失风险–由于差异备份需要更少的存储,可以更频繁地执行差异备份,从而降低数据丢失的风险。
但是,从差异备份恢复比从完整备份恢复需要更多的时间,因为需要从至少两个备份文件恢复:
- 首先,从最近的完整备份恢复。
- 然后,从差异备份进行恢复。
创建差异备份
可以使用BACKUP DATABASE
语句和选项DIFFERENTIAL
,语法如下所示:
BACKUP DATABASE database_name
TO DISK = path_to_backup_file
WITH DIFFERENTIAL;
其中:
- database_name:数据库名
- path_to_backup_file:备份文件路径
示例
下面的示例说明了如何创建HR数据库的多个差异备份。
首先,切换到master
数据库并删除HR数据库:
USE master;
DROP DATABASE IF EXISTS HR;
其次,创建HR数据库,其中People
表有一行:
CREATE DATABASE HR;
GO
USE HR;
GO
CREATE TABLE People (
Id int IDENTITY PRIMARY KEY,
FirstName varchar(50) NOT NULL,
LastName varchar(50) NOT NULL
);
INSERT INTO People (FirstName, LastName)
VALUES ('John', 'Doe');
第三步,创建人力资源数据库的完整备份:
BACKUP DATABASE HR
TO DISK = 'D:\backup\hr.bak'
WITH INIT,
NAME = 'HR-Full Database Backup';
第一个完整备份包含一个id为1的行。
第四步,在人员表中再插入一行:
INSERT INTO People(FirstName, LastName)
VALUES ('Jane', 'Doe')
第五步,创建HR数据库的第一个差异备份:
BACKUP DATABASE HR
TO DISK = N'D:\backup\hr.bak'
WITH DIFFERENTIAL ,
NAME = N'HR-Differential Database Backup';
备份文件现在有两个备份:一个完整备份和一个差异备份。差异备份包含id为2的行。
第六步,在人员表中再插入一行:
INSERT INTO People(FirstName, LastName)
VALUES ('Dach', 'Keon');
第七步,创建第二个差异备份:
BACKUP DATABASE HR
TO DISK = N'D:\backup\hr.bak'
WITH DIFFERENTIAL ,
NAME = N'HR-Differential Database Backup';
第二个差异备份包含id为2和3的行,因为它捕获了自上次完全备份以来的更改。
第八步,创建第二个完整备份:
BACKUP DATABASE HR
TO DISK = 'D:\backup\hr.bak'
WITH NOINIT,
NAME = 'HR-Full Database Backup';
第二个完全备份包含id为1、2和3的行。
第九步,在人员表中再插入一行:
INSERT INTO People(FirstName, LastName)
VALUES('Dach', 'Keon');
第十步,创建第三个差异备份:
BACKUP DATABASE HR
TO DISK = N'D:\backup\hr.bak'
WITH DIFFERENTIAL ,
NAME = N'HR-Differential Database Backup';
第三个差异备份包含id为4的行。
最后,检查备份文件:
RESTORE HEADERONLY
FROM DISK = N'D:\backup\hr.bak';
备份文件包含五个备份,其中两个完整备份和三个差异备份。
恢复差异备份
要从备份文件还原HR数据库,可以还原第二次完整备份和最后一次差异备份。
首先,删除人力资源数据库:
USE master;
DROP DATABASE IF EXISTS HR;
其次,从第二次完整备份中恢复HR数据库:
RESTORE DATABASE HR
FROM DISK = N'D:\backup\hr.bak'
WITH FILE = 4, NORECOVERY;
请注意,第二次完整备份的文件号为4。NORECOVERY
选项将数据库置于还原状态。
如果使用SSMS,HR数据库将如下所示:
HR (Restoring...)
在还原状态下,数据库不可访问。
换句话说,如果要恢复更多备份,请使用NORECOVERY
选项。但是,如果没有其他备份要恢复,则需要使用RECOVERY
选项。
第三,从上次差异备份中恢复HR数据库:
RESTORE DATABASE HR
FROM DISK = N'D:\backup\hr.bak'
WITH FILE = 5, RECOVERY;
FILE=5表示SQL Server使用最后一次差异备份。并且RECOVERY
选项表示您没有其他备份要恢复。
最后,从人力资源数据库的人员表中选择数据:
USE HR;
SELECT * FROM people;
总结
-
差异备份捕获自最近一次完整备份以来的更改。而差异备份总是基于完整备份。
-
将
BACKUP DATABASE
语句与DIFFERENTIAL
选项一起使用,来创建差异备份。 -
在从差异备份恢复之前,始终先从完整备份恢复。