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语句从完全备份还原数据库。
浙公网安备 33010602011771号