首页 > 数据库 >14.5 SQL Server差异备份

14.5 SQL Server差异备份

时间:2023-01-30 11:12:23浏览次数:47  
标签:14.5 DATABASE HR 备份 数据库 Server 完整 SQL 差异

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选项一起使用,来创建差异备份。

  • 在从差异备份恢复之前,始终先从完整备份恢复。

标签:14.5,DATABASE,HR,备份,数据库,Server,完整,SQL,差异
From: https://www.cnblogs.com/michaelshen/p/17074859.html

相关文章

  • 14.6 SQL Server事务日志备份
    SQLServer事务日志备份目录SQLServer事务日志备份简介使用T-SQL创建事务日志备份示例从事务日志备份还原数据库总结简介当数据库的恢复模式为FULL(完整)或BULK_LOGGED(大......
  • 12.1 SQL Server视图
    SQLServer视图(Views)目录SQLServer视图(Views)简介视图的优点安全简单一致性创建视图示例创建一个简单视图重新定义视图使用聚合函数创建视图删除视图简介示例删除一个......
  • SQL Server 存储过程定时转存数据
    CREATEPROCEDURE[dbo].[sp_MES_JTMSLS]--创建存储过程asBEGINBEGINTRANTran_MoveData--开始事务DECLARE@tran_erro......
  • 9.2 SQL Server BEGIN END
    BEGINEND目录BEGINEND简介嵌套BEGIN...END简介BEGIN…END语句用于定义语句块。语句块由一组一起执行的SQL语句组成。语句块也称为批处理。打个比方说,如果语句是句子......
  • 9.4 SQL Server循环
    SQLServer循环目录SQLServer循环简介WHILE示例BREAK简介示例CONTINUE简介示例简介WHILE语句是一个控制流语句,它允许重复执行语句块,只要指定的条件为TRUE。WHILE语法......
  • 9.3 SQL Server IF ELSE
    SQLServerIFELSE目录SQLServerIFELSE简介IF语句示例IFELSE语句示例:嵌套IF…ELSE简介IF...ELSE语句是一种控制流语句,允许根据指定的条件执行或跳过语句块。IF......
  • 9.5 SQL Server游标
    SQLServer游标(CURSOR)目录SQLServer游标(CURSOR)简介什么是数据库游标SQLServer游标生命周期示例简介SQL基于集合进行操作,例如,SELECT语句返回一组称为结果集的行。但......
  • 9.6 SQL Server异常处理
    SQLServer异常处理目录SQLServer异常处理TRYCATCH简介CATCH块中的函数嵌套的TRYCATCH简单示例在事务中使用TRYCATCH的示例THROW简介示例A)以下示例使用THROW语句引......
  • 8.3 SQL Server非聚集索引
    SQLServerNon-ClusteredIndexes(非聚集索引)目录SQLServerNon-ClusteredIndexes(非聚集索引)简介使用SQLServerCREATE[NONCLUSTERED]INDEX创建非聚集索引示例A)使用C......
  • 8.4 SQL Server唯一索引
    SQLServer唯一索引(UniqueIndex)目录SQLServer唯一索引(UniqueIndex)简介示例A)创建包含一列的唯一约束B)创建包含多列的唯一约束SQLServer唯一索引与NULL唯一索引(Uniquei......