SQL Server差异备份

目录

  • SQL Server差异备份
  • 简介
  • 创建差异备份
  • 示例
  • 恢复差异备份
  • 总结

简介

差异备份基于最近的完整备份。换句话说,只有在至少有一个完整备份后,才能创建差异备份。

差异备份捕获自上次完全备份以来的所有更改。完全备份是差异备份的基础。

下图说明了差异备份与完整备份之间的关系:

mysql差异备份命令 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';

mysql差异备份命令 sql server 差异备份_数据库_02

备份文件包含五个备份,其中两个完整备份和三个差异备份。

恢复差异备份

要从备份文件还原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;

mysql差异备份命令 sql server 差异备份_数据库_03

总结

  • 差异备份捕获自最近一次完整备份以来的更改。而差异备份总是基于完整备份。
  • BACKUP DATABASE语句与DIFFERENTIAL选项一起使用,来创建差异备份。
  • 在从差异备份恢复之前,始终先从完整备份恢复。