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
语句从完全备份还原数据库。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· DeepSeek “源神”启动!「GitHub 热点速览」
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器