创建完整数据库备份

适用范围:SQL Server

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

有关详细信息,请参阅使用 Azure Blob 存储和 SQL Server 备份还原到 Azure Blob 存储的 URL 的 SQL Server 备份和还原。

局限性

  • 不允许在显式事务或隐式事务中使用 BACKUP 语句。
  • 在早期版本的 SQL Server 中无法还原由较新版本的 SQL Server 创建的备份。

有关备份概念和任务的概述和深入探讨,请参阅 备份概述(SQL Server), 然后再继续作。

建议

  • 随着数据库不断增大,完整数据库备份的完成时间会延长,并且需要占用更多存储空间。 对于大型数据库,请考虑用一系列差异数据库备份来补充完整数据库备份。
  • 使用 sp_spaceused 系统存储过程估计完整数据库备份的大小。
  • 默认情况下,每个成功的备份操作都会在 SQL Server 错误日志和系统事件日志中添加一个条目。 如果经常备份,成功消息会迅速累积,从而导致巨大的错误日志,这会使查找其他消息变得困难。 在这些情况下,如果脚本均不依赖于这些备份日志条目,则可使用跟踪标志 3226 取消这些条目。 有关详细信息,请参阅 使用 DBCC TRACEON 设置跟踪标志

安全性

TRUSTWORTHY 设置为 OFF 数据库备份。 有关如何设置为TRUSTWORTHYON的信息,请参阅 ALTER DATABASE SET 选项

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

权限

默认情况下,为 sysadmin 固定服务器角色以及 db_owner 和 db_backupoperator 固定数据库角色的成员授予 BACKUP DATABASEBACKUP LOG 权限 。

备份设备的物理文件的所有权和权限问题可能会妨碍备份操作。 SQL Server 服务应从设备读取和写入。 运行 SQL Server 服务所用的帐户必须拥有对备份设备的写入权限。 但是,用于在系统表中添加备份设备条目的 sp_addumpdevice 并不检查文件访问权限。 备份设备的物理文件中的问题可能不会显示在使用备份或尝试还原之前出现。

使用 SQL Server Management Studio

注意

使用 SQL Server Management Studio 指定备份任务时,可以通过选择“脚本”按钮并选择脚本目标来生成相应的 Transact-SQL BACKUP 脚本。

  1. 连接到 SQL Server 数据库引擎的相应实例后,在 对象资源管理器中展开服务器树。

  2. 展开“数据库”,选择用户数据库,或展开“系统数据库”,选择系统数据库。

  3. 右键单击要备份的数据库,指向 “任务”,然后选择“ 备份...”

  4. “备份数据库 ”对话框中,所选的数据库将显示在下拉列表中。 (可以将数据库更改为服务器上的任何其他数据库。

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

    重要

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

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

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

    可以使用 “备份 ”列表来选择其他设备。 选择 “添加” 以添加备份对象和/或目标。 可以跨多个文件对备份集进行分条,以提高备份速度。

    若要删除备份目标,请选择它,然后选择“ 删除”。 若要查看现有备份目标的内容,请选择它,然后选择 “内容”。

  8. (可选)查看 媒体选项备份选项 页上的其他可用设置。

    有关各种备份选项的详细信息,请参阅备份数据库(常规页)、备份数据库(媒体选项页)备份数据库(备份选项页)。

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

  10. 备份成功完成后,选择“ 确定 ”关闭 SQL Server Management Studio 对话框。

其他信息

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

  • (可选)可以选择 “仅复制备份 ”复选框来创建仅复制备份。 仅复制备份是独立于传统 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 NOT NULL DEFAULT getdate()
   );
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. 连接到 SQL Server 数据库引擎的相应实例后,在 对象资源管理器中展开服务器树。

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

  3. 选择“确定”

  4. 备份成功完成后,选择“ 确定 ”关闭 SQL Server Management Studio 对话框。

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

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

在此示例中,数据库 SQLTestDB 备份到所选位置的磁盘。

  1. 连接到 SQL Server 数据库引擎的相应实例后,在 对象资源管理器中展开服务器树。

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

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

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

  5. 选择 并添加。 此时会打开 “选择备份目标 ”对话框。

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

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

  8. 备份成功完成后,选择“ 确定 ”关闭 SQL Server Management Studio 对话框。

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

°C 创建加密备份

在此示例中,数据库 SQLTestDB 使用加密备份到默认备份位置。

  1. 连接到 SQL Server 数据库引擎的相应实例后,在 对象资源管理器中展开服务器树。

  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 存储

此示例创建到 Azure Blob 存储的完整数据库备份 SQLTestDB 。 此示例采用假设已有包含 Blob 容器的存储帐户。 该示例创建共享访问签名。 如果容器具有现有的共享访问签名,该示例将失败。

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

  1. 连接到 SQL Server 数据库引擎的相应实例后,在 对象资源管理器中展开服务器树。

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

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

  4. 选择 并添加。 此时会打开 “选择备份目标 ”对话框。

  5. 如果以前已注册要用于 SQL Server Management Studio 的 Azure 存储容器,请选择它。 否则,选择“新建容器”来注册新的容器。

  6. “连接到Microsoft订阅 ”对话框中,登录到帐户。

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

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

  9. 在“ 共享访问策略过期 日历”框中,选择在此示例中创建的共享访问策略的到期日期。

  10. 选择“创建凭据”,以在 SQL Server Management Studio 中生成共享访问签名和凭据。

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

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

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

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

  15. 备份成功完成后,选择“ 确定 ”关闭 SQL Server Management Studio 对话框。

注意

目前不支持使用托管标识备份到 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 选项:

{ DISK | TAPE } =physical_backup_device_name

有关详细信息,请参阅备份设备 (SQL Server)
WITH <with_options> [ , ...o ] 用于指定一个或多个选项 (o)。 下面介绍了一些基本 WITH 选项。

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

基本备份集 WITH 选项:

  • { COMPRESSION |NO_COMPRESSION }。 在 SQL Server 2008(10.0.x) Enterprise 及更高版本中,仅指定是否对 备份执行备份压缩 ,替代服务器级默认值。
  • 加密(算法,服务器证书 |非对称密钥。 仅在 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 子句。 根据需要,可以为新介质指定介质名称和说明。

重要

使用 FORMAT 语句的 BACKUP 子句时请谨慎,因为此选项会销毁以前存储在备份介质上的任何备份。

示例

对于以下示例,使用以下 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 NOT NULL DEFAULT GETDATE()
)
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
EXEC 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参数。 对于完整数据库备份而言,此参数是可选的。

注意

这些示例需要安装 SqlServer 模块。 若要确定它是否已安装,请运行 Get-Module -Name SqlServer。 若要安装它,请在 PowerShell 的管理员会话中运行 Install-Module -Name SqlServer

有关详细信息,请参阅 SQL Server PowerShell Provider

重要

如果要从 SQL Server Management Studio(SSMS)中打开 PowerShell 窗口以连接到 SQL Server 实例,则可以省略凭据部分,因为 SSMS 中的凭据会自动用于在 PowerShell 和 SQL Server 实例之间建立连接。

示例

答: 完整备份(本地)

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

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

$credential = Get-Credential

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

B. 完整备份到 Azure

以下示例在实例上创建数据库 <myDatabase> 到 Blob 存储的完整 <myServer> 备份。 已经创建具有读取、写入和表权限的存储访问策略。 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