14.4 SQL Server完整备份

SQL Server完整备份

简介

完整数据库备份备份整个数据库。包括:

  • 数据库的元数据,如名称、创建日期、数据库选项、文件路径等。
  • 每个数据文件的已用数据页。

此外,完整备份还包括事务日志的一部分。它表示备份完成时的数据库。

执行完全备份时,SQL Server会使用大量磁盘I/O。因此,应该在工作负载较低的时候执行完全备份,例如在晚上。

实际上,将使用完整备份作为更高级备份策略的基准。例如,可以将完整备份与事务日志备份相结合。

注意,必须至少执行一次完整备份,才能执行其他备份类型,如差异备份和事务日志备份。

下图说明了两个完整备份:

在这张图中,第一个完整备份包含id 1,第二个完整备份包括id 1、2和3。

使用T-SQL创建数据库的完整备份

语法:

BACKUP DATABASE database_name
TO DISK = path_to_backup_file
WITH options;
  • database_name是要备份的数据库的名称。数据库必须存在并在服务器上正常工作。
  • path_to_backup_file是备份文件的路径。按照惯例,备份的扩展是bak。如果将备份文件存储在文件夹中,则该文件夹必须存在,因为该语句不会隐式为您创建文件夹。
  • options指定备份的一个或多个选项。

INIT vs NOINIT

INIT选项附加到文件上的现有备份,而NOINIT选项则附加到最近的备份。如果未指定INITNOINIT,则NOINIT是默认选项。

NAME

NAME指定备份的名称。默认情况下,备份的名称为空。

除了INITNOINITNAME选项之外,BACKUP DATABASE语句还有其他选项,将在下文介绍。

示例

首先,用一个名为People的表创建HR数据库,并在其中插入四行:

-- drop the HR database
USE master;
DROP DATABASE IF EXISTS HR;

-- create the HR database
CREATE DATABASE HR;
GO

-- create the People table
USE HR;

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'),
  ('Jane', 'Doe'),
  ('Upton', 'Luis'),
  ('Dach', 'Keon');

SELECT * FROM People;

然后,使用BACKUP DATABASE语句将HR数据库备份到D:\backup\目录中的hr.bak文件:

BACKUP DATABASE HR 
TO  DISK = 'D:\backup\hr.bak'
WITH INIT,
NAME = 'HR-Full Database Backup';

执行过后就能在D:\backup\目录中看到hr.bak文件

然后,使用RESTORE HEADERONLY从备份文件中读取:

RESTORE HEADERONLY   
FROM DISK ='D:\backup\hr.bak';

输出有很多信息,重要的是:

  • 备份名称
  • 备份类型(1是完全备份)
  • 位置(Position):1
  • 数据库:HR
  • 备份大小
  • 备份开始日期
  • 备份完成日期

在一个文件中执行多个完整备份

SQL Server允许在一个备份文件中存储多个备份。为此,需要在WITH子句中使用NOINIT选项。例如:

首先,在人员表中插入新行:

INSERT INTO People (FirstName, LastName)
VALUES ('Bob', 'Climo');

然后,对同一备份文件执行第二次完整备份:

BACKUP DATABASE HR 
TO  DISK = 'D:\backup\hr.bak'
WITH NOINIT,
NAME = 'HR-Full Database Backup';

第三,检查备份文件:

备份文件有两个完整备份。位置列(Position)中的值指定备份的顺序。值1表示第一次完全备份,而值2表示第二次完全备份。

在第一次备份中,People表有四行,而在第二次备份中People表格有五行。

从完整备份还原数据库

要还原数据库,使用RESTORE DATABASE语句,语法:

RESTORE DATABASE database_name
FROM DISK = path_to_backup_file
WITH options;
  • database_name:数据库名
  • path_to_backup_file:备份文件路径
  • options:用于恢复数据库的一个或多个选项。

从第一次完整备份恢复

首先,切换到主数据库并删除HR数据库:

USE master;

DROP DATABASE HR;

然后,从第一次完整备份中恢复HR数据库:

RESTORE DATABASE HR
FROM  DISK = N'D:\backup\hr.bak'
WITH FILE = 1;

在本例中,从备份文件D:\backup\hr.bak中恢复HR数据库。WITH FILE子句中的值1指示SQL Server还原第一个完整备份。它对应于备份文件的位置列(Position)。

切换到人力资源(HR)数据库并从人员表中选择数据来验证一下:

USE hr;
SELECT * FROM People;

查询按预期返回四行。

从第二次完全备份恢复

首先,切换到主数据库并删除HR数据库:

USE master;
DROP DATABASE HR;

然后,从第二次完整备份中恢复HR数据库:

RESTORE DATABASE HR
FROM  DISK = N'D:\backup\hr.bak'
WITH FILE = 2;

WITH FILE子句中的值2指示SQL Server从备份文件还原第二个备份。

最后,切换到人力资源数据库并从人员表中选择数据验证一下:

USE hr;
SELECT * FROM People;

查询按预期返回五行。

总结

  • 使用BACKUP DATABASE语句为数据库创建完整备份。
  • 使用WITH INIT选项覆盖备份,使用WITH NOINIT选项附加到现有备份文件。
  • 使用RESTORE DATABASE语句从完全备份还原数据库。
posted @ 2023-01-30 10:59  平元兄  阅读(283)  评论(0编辑  收藏  举报