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
选项则附加到最近的备份。如果未指定INIT
或NOINIT
,则NOINIT
是默认选项。
NAME
NAME
指定备份的名称。默认情况下,备份的名称为空。
除了INIT
、NOINIT
和NAME
选项之外,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
语句从完全备份还原数据库。