创建完整数据库备份

适用范围:SQL Server

本文介绍如何使用SQL Server Management Studio(SSMS)、Transact-SQL或PowerShell在SQL Server中创建完整的数据库备份。

有关更多信息,请参阅 使用 Azure Blob 存储进行 SQL Server 备份和还原用于 Azure Blob 存储的 SQL Server URL 备份。 关于备份概念和任务的概述,请参见备份概览(SQL Server)。

建议

  • 随着数据库的增长,完整的数据库备份需要更长时间,并且需要更多的存储空间。 对于大型数据库,可以用一系列 差分数据库备份来补充完整备份。

  • sp_spaceused 系统存储过程估算完整数据库备份的规模。

  • 默认情况下,每次成功的备份都会在 SQL Server 错误日志和系统事件日志中添加一条。 频繁备份会填满这些日志,使其他消息难以被发现。

    要抑制备份日志条目,可以使用 trace flag 3226,前提是你的脚本不依赖它们。

局限性

你不能在显式或隐式交易中使用该 BACKUP 语句。

你无法从较早版本的 SQL Server 中恢复备份。 例如,你无法在SQL Server 2022(16.x)上恢复SQL Server 2025(17.x)的备份。

安全性

数据库备份的 TRUSTWORTHY 设置为 OFF。 要将 TRUSTWORTHY 设置为 ON,请参阅 ALTER DATABASE SET 选项

从 SQL Server 2012(11.x)开始,PASSWORDMEDIAPASSWORD选项不可用于创建备份。 不过,您仍可以还原使用密码创建的备份。

权限

BACKUP DATABASEBACKUP LOG 权限默认授予 sysadmin 固定服务器角色以及 db_ownerdb_backupoperator 固定数据库角色的成员。

SQL Server 服务账户必须对备份设备的物理文件拥有读写权限。 该文件的所有权或权限问题会阻止备份和恢复操作,且仅在备份或恢复操作运行时出现。

例如, sp_addumpdevice 系统存储过程(向系统表添加备份设备条目) 并不验证文件访问

使用 SQL Server Management Studio

  1. 在 对象资源管理器 中,连接到 数据库引擎,然后展开服务器树。

  2. 展开 数据库,然后选择一个用户数据库。 或者,展开 “系统数据库 ”并选择系统数据库。

  3. 右键点击你想备份的数据库,指向 任务,然后选择 备份......

  4. “备份数据库 ”对话框中,您选择的数据库会出现在下拉列表中。 你可以把数据库改成服务器上任何其他数据库。

  5. “备份类型 ”列表中,选择备份类型。 默认值为 Full

    重要

    必须先执行至少一个完整数据库备份,然后才能执行差异备份或事务日志备份。

  6. 在“备份组件”下,选择“数据库”

  7. 在“目标”部分中,查看备份文件的默认位置(位于 ../mssql/data 文件夹)

    使用“备份到”列表选择其他设备。 选择 添加 以添加备份对象或目的地。 你可以把备份集分成多个文件,以提升备份速度。

    若要移除备份目标,请选中该目标,然后选择移除。 要查看现有备份目的地的内容,选择该备份地址并选择 “目录”

  8. 可选地,查看 媒体选项备份选项 页面上的其他设置。

    有关备份选项的更多信息,请参见备份数据库(通用页面)、备份数据库(媒体选项页面)备份数据库(备份选项页面)。

  9. 若要启动备份,请选择“确定”

  10. 备份成功完成后,选择 确定 关闭对话框。

注解

  • 在SQL Server Management Studio中指定备份任务时,可以通过选择脚本按钮然后选择脚本目的地生成相应的 Transact-SQL BACKUP 脚本。

  • 在你创建完整数据库备份后,你可以创建 差分数据库备份事务日志备份

  • 可选地,选择 只复制备份 复选框以创建只复制备份。 仅复制备份是独立于传统 SQL Server 备份序列的 SQL Server 备份。 有关详细信息,请参阅 仅复制备份差异备份类型不支持副本备份。

  • 当你备份到 URL 时,媒体选项页上的 覆盖媒体 选项将被禁用。

示例

对于以下示例,请使用以下 Transact-SQL 代码创建测试数据库:

USE master;
GO

CREATE DATABASE [SQLTestDB];
GO

USE [SQLTestDB];
GO

CREATE TABLE SQLTest
(
    ID INT NOT NULL PRIMARY KEY,
    c1 VARCHAR (100) NOT NULL,
    dt1 DATETIME DEFAULT getdate() NOT NULL
);
GO

USE [SQLTestDB];
GO

INSERT INTO SQLTest (ID, c1) VALUES (1, 'test1');
INSERT INTO SQLTest (ID, c1) VALUES (2, 'test2');
INSERT INTO SQLTest (ID, c1) VALUES (3, 'test3');
INSERT INTO SQLTest (ID, c1) VALUES (4, 'test4');
INSERT INTO SQLTest (ID, c1) VALUES (5, 'test5');
GO

SELECT *
FROM SQLTest;
GO

答: 将完整备份保存到磁盘上的默认位置

这个例子是将 SQLTestDB 数据库备份到默认备份位置的磁盘。

  1. 在 对象资源管理器 中,连接到 数据库引擎,然后展开服务器树。

  2. 展开“数据库”,右键单击“SQLTestDB”,指向“任务”,然后选择“备份...”

  3. 选择“确定”

  4. 备份成功完成后,选择 确定 关闭对话框。

显示创建备份的步骤的屏幕截图。

B. 将完整备份到磁盘上的非默认位置

这个例子是将 SQLTestDB 数据库备份到你选择的位置的磁盘上。

  1. 在 对象资源管理器 中,连接到 数据库引擎,然后展开服务器树。

  2. 展开“数据库”,右键单击“SQLTestDB”,指向“任务”,然后选择“备份...”

  3. “通用”页面的“目的地”部分,选择“备份列表”中的磁盘

  4. 选择 “删除” ,直到删除所有现有备份文件。

  5. 选择 并添加。 会弹出“ 选择备份目的地 ”对话框。

  6. 在“ 文件名”框中 输入有效的路径和文件名。 使用 .bak 作为扩展名,简化文件分类。

  7. 选择 确定,然后再次选择 确定 开始备份。

  8. 备份成功完成后,选择 确定 关闭对话框。

显示如何添加或删除备份位置的屏幕截图。

C. 创建加密备份

这个例子是用加密方式备份 SQLTestDB 数据库到默认备份位置。

  1. 在 对象资源管理器 中,连接到 数据库引擎,然后展开服务器树。

  2. 展开 数据库,展开 系统数据库,右键单击 master,然后选择 新建查询,以打开一个已连接到你的 SQLTestDB 数据库的查询窗口。

  3. 执行以下命令,在数据库中创建数据库主密钥证书master

    -- Create the master key.
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
    
    -- If the master key already exists, open it in the same session that you create the certificate. (See next step.)
    OPEN MASTER KEY DECRYPTION BY PASSWORD = '<password>';
    
    -- Create the certificate encrypted by the master key.
    CREATE CERTIFICATE MyCertificate
    WITH SUBJECT = 'Backup Cert', EXPIRY_DATE = '20201031';
    
  4. 在“对象资源管理器”的“数据库”节点中,右键单击“SQLTestDB”,指向“任务”,然后选择“备份...”

  5. “媒体选项” 页上的“ 覆盖媒体 ”部分中,选择“ 备份到新媒体集”,并清除所有现有的备份集

  6. “备份选项” 页上的“ 加密 ”部分中,选择“ 加密备份”。

  7. “算法” 列表中,选择 AES 256

  8. “证书”或“非对称密钥 ”列表中,选择 MyCertificate

  9. 选择“确定”

显示创建加密备份的步骤的屏幕截图。

D. 备份到 Azure Blob 存储

此示例将 SQLTestDB 完整备份到 Azure Blob 存储。 这个例子假设你已经有一个带有 blob 容器的存储账户。 示例创建共享访问签名,如果容器已有共享访问签名,则失败。

如果你的存储账户里没有 Blob 存储 容器,继续之前先创建一个。 请参阅创建常规用途存储帐户创建容器

  1. 在 对象资源管理器 中,连接到 数据库引擎,然后展开服务器树。

  2. 展开“数据库”,右键单击“SQLTestDB”,指向“任务”,然后选择“备份...”

  3. “常规”页上的“目标”部分中,选择“备份到”列表中的 URL

  4. 选择 并添加。 会弹出“ 选择备份目的地 ”对话框。

  5. 如果你之前注册了想用 SSMS 使用的 Azure 存储容器,选择它。 否则,选择“新建容器”来注册新的容器。

  6. 在“连接 Microsoft 订阅”对话框中,登录您的账户。

  7. “选择存储帐户 ”框中,选择存储帐户。

  8. “选择 Blob 容器 ”框中,选择 Blob 容器。

  9. 共享访问策略的到期 日历框中,选择该示例创建的共享访问策略的到期日。

  10. 选择 创建凭据 以在 SSMS 中生成共享访问签名和凭据。

  11. 选择确定以关闭“连接到Microsoft订阅”对话框。

  12. “备份文件 ”框中,如果需要,请更改备份文件的名称。

  13. 选择 确定 以关闭“ 选择备份目的地 ”对话框。

  14. 若要启动备份,请选择“确定”

  15. 备份成功完成后,选择 确定 关闭对话框。

注意

目前不支持使用托管标识备份到 Blob 存储。

使用 Transact-SQL

通过运行该 BACKUP DATABASE 语句来创建完整的数据库备份。 指定:

  • 要备份的数据库的名称。
  • 写入完整数据库备份的备份设备。

用于完整数据库备份的基本 Transact-SQL 语法如下:

BACKUP DATABASE <database>
TO <backup_device> [ , ...n ]
[ WITH <with_options> [ , ...o ] ];
选项 说明
<database> 要备份的数据库。
<backup_device> [ , ...n ] 指定1至64个备份设备用于备份操作。 指定一个物理备份设备,或者如果已经定义了相应的逻辑备份设备,也指定一个。 要指定物理备份设备,请使用 DISKTAPE, 或 URL 选项:

{ DISK | URL | TAPE} = physical_backup_device_name

URL来备份到 Azure Blob 存储 或兼容 S3 的对象存储。 有关详细信息,请参阅备份设备 (SQL Server)
WITH <with_options> [ , ...n ] 用于指定一个或多个选项, n。 以下列表中描述了一些基本 WITH 选项。

(可选)指定一个或多个 WITH 选项。 此处介绍了一些基本 WITH 选项。 有关所有 WITH 选项的信息,请参见 BACKUP

基本备份集WITH选项:

  • { COMPRESSION |NO_COMPRESSION }。 SQL Server 指定是否对备份进行压缩,覆盖服务器级默认。

  • 加密(算法,服务器 CERTIFICATE | ASYMMETRIC KEY)。 在 SQL Server 2014 或更高版本中,指定了使用的加密算法,以及用于加密安全的证书或非对称密钥。

  • DESCRIPTION = { 'text' | @text_variable }。 指定描述备份集的自由格式文本。 该字符串最长可达 255 个字符。

  • NAME = { backup_set_name | @backup_set_name_var }. 指定备份集的名称。 名称最长可达 128 个字符。 如果未指定 NAME,则为空白。

默认情况下,BACKUP 将备份追加到现有介质集中,并保留现有备份集。 若要显式指定此配置,请使用 NOINIT 该选项。 有关追加到现有备份集的信息,请参阅媒体集、介质系列和备份集 (SQL Server)。

若要设置备份介质的格式,请使用 FORMAT 以下选项:

FORMAT [ , MEDIANAME = { media_name | @media_name_variable } ] [ , MEDIADESCRIPTION = { text | @text_variable } ]

当你第一次使用媒体,或者想覆盖所有现有数据时,可以使用该 FORMAT 条款。 根据需要,可以为新介质指定介质名称和说明。

重要

使用FORMATBACKUP该条款时要小心,因为这个选项会销毁之前存储在备份介质上的备份。

示例

对于以下示例,请使用以下 Transact-SQL 代码创建测试数据库:

USE master;
GO

CREATE DATABASE [SQLTestDB];
GO

USE [SQLTestDB];
GO

CREATE TABLE SQLTest
(
    ID INT NOT NULL PRIMARY KEY,
    c1 VARCHAR (100) NOT NULL,
    dt1 DATETIME DEFAULT GETDATE() NOT NULL
);
GO

USE [SQLTestDB];
GO

INSERT INTO SQLTest (ID, c1) VALUES (1, 'test1');
INSERT INTO SQLTest (ID, c1) VALUES (2, 'test2');
INSERT INTO SQLTest (ID, c1) VALUES (3, 'test3');
INSERT INTO SQLTest (ID, c1) VALUES (4, 'test4');
INSERT INTO SQLTest (ID, c1) VALUES (5, 'test5');
GO

SELECT *
FROM SQLTest;
GO

答: 备份到磁盘设备

以下示例将完整 SQLTestDB 数据库备份到磁盘。 它使用 FORMAT 创建新的媒体集。

USE SQLTestDB;
GO

BACKUP DATABASE SQLTestDB
TO DISK = 'c:\tmp\SQLTestDB.bak'
WITH FORMAT,
     MEDIANAME = 'SQLServerBackups',
     NAME = 'Full Backup of SQLTestDB';
GO

B. 备份到磁带设备

以下示例将完整 SQLTestDB 数据库备份到磁带。 它将备份追加到以前的备份。

USE SQLTestDB;
GO

BACKUP DATABASE SQLTestDB
TO TAPE = '\\.\Tape0'
WITH NOINIT,
     NAME = 'Full Backup of SQLTestDB';
GO

C. 备份到逻辑磁带设备

下例为某个磁带驱动器创建一个逻辑备份设备, 然后,该示例将完整 SQLTestDB 数据库备份到该设备。

-- Create a logical backup device,
-- SQLTestDB_Bak_Tape, for tape device \\.\tape0.
USE master;
GO

EXECUTE sp_addumpdevice 'tape', 'SQLTestDB_Bak_Tape', '\\.\tape0';

USE SQLTestDB;
GO

BACKUP DATABASE SQLTestDB
TO SQLTestDB_Bak_Tape
WITH FORMAT,
     MEDIANAME = 'SQLTestDB_Bak_Tape',
     MEDIADESCRIPTION = '\\.\tape0',
     NAME = 'Full Backup of SQLTestDB';
GO

PowerShell

使用 Backup-SqlDatabase cmdlet。 若要明确指明完整数据库备份,请指定 -BackupAction 参数,并将其值设为默认值 Database。 对于完整数据库备份而言,此参数是可选的。

如果你在SSMS中打开PowerShell窗口连接SQL Server 数据库引擎,可以省略凭证部分,因为SSMS中的凭证会自动建立PowerShell和数据库引擎之间的连接。

注意

本例需要该 SqlServer 模块。 有关详细信息,请参阅 SQL Server PowerShell Provider

示例

答: 完整备份(本地)

下面的示例在服务器实例 <myDatabase> 的默认备份位置创建数据库 Computer\Instance的完整数据库备份。 (可选)此示例指定 -BackupAction Database

有关完整语法示例,请参阅 Backup-SqlDatabase

$credential = Get-Credential

Backup-SqlDatabase -ServerInstance Computer[\Instance] -Database <myDatabase> -BackupAction Database -Credential $credential

B. 完整备份到 Azure

以下示例在 <myDatabase> 实例上为数据库 <myServer> 创建完整备份,并将其备份到 Blob 存储。 存储访问策略被创建,具有读、写和列表权限。 SQL Server凭据 https://<myStorageAccount>.blob.core.windows.net/<myContainer>,是通过使用与存储访问策略关联的共享访问签名创建的。 该命令使用 $backupFile 参数指定位置(URL)和备份文件名。

$credential = Get-Credential
$container = 'https://<myStorageAccount>blob.core.windows.net/<myContainer>'
$fileName = '<myDatabase>.bak'
$server = '<myServer>'
$database = '<myDatabase>'
$backupFile = $container + '/' + $fileName

Backup-SqlDatabase -ServerInstance $server -Database $database -BackupFile $backupFile -Credential $credential