14.5 SQL Server差异备份
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选项一起使用,来创建差异备份。 -
在从差异备份恢复之前,始终先从完整备份恢复。
浙公网安备 33010602011771号