本主题介绍将 Azure Blob 存储服务用作备份目标所需的概念、要求和组件。 备份和还原功能与使用 DISK 或 TAPE 时相同或类似,但存在一些差异。 区别在于哪些显著例外,本主题中还包括一些代码示例。
要求、组件和概念
本部分
安全
以下是从 Azure Blob 存储服务备份或还原时的安全注意事项和要求。
为 Azure Blob 存储服务创建容器时,建议将访问权限设置为 专用。 将访问权限设置为私有将限制仅对能够提供信息以在 Azure 帐户上进行身份验证的用户或帐户的访问。
重要
SQL Server 要求将 Azure 帐户名称和访问密钥身份验证存储在 SQL Server 凭据中。 此信息用于在 Azure 帐户执行备份或还原时进行身份验证。
用于发出 BACKUP 或 RESTORE 命令的用户帐户应在具有更改任何凭据权限的db_backup操作员数据库角色中。
关键组件和概念简介
以下两个部分介绍了 Azure Blob 存储服务,以及备份或从 Azure Blob 存储服务还原时使用的 SQL Server 组件。 请务必了解组件及其之间的交互,以便对 Azure Blob 存储服务执行备份或从中还原。
创建 Azure 帐户是此过程的第一步。 SQL Server 使用 Azure 存储帐户名称 及其 访问密钥 值对存储服务进行身份验证和写入和读取 Blob。 SQL Server 凭据存储此身份验证信息,并且将在备份或还原期间使用这些信息。 有关创建存储帐户和执行简单还原的完整演练,请参阅 教程:使用 Azure 存储服务进行 SQL Server 备份和还原。
Azure Blob 存储服务
存储帐户: 存储帐户是所有存储服务的起点。 若要访问 Azure Blob 存储服务,请先创建一个 Azure 存储帐户。 对 Azure Blob 存储服务及其组件进行身份验证需要存储帐户名称和其访问密钥属性。
容器: 容器提供一组 Blob 的分组,并且可以存储无限数量的 Blob。 若要将 SQL Server 备份写入 Azure Blob 服务,必须至少创建根容器。
Blob: 任何类型和大小的文件。 在 Azure Blob 存储服务中,可以储存两种类型的 Blob:分别是块 Blob 和页 Blob。 SQL Server 备份使用页 Blob 作为 Blob 类型。 Blob 使用以下 URL 格式进行寻址:https://< storage account.blob.core.windows.net/>< container>/<blob>
有关 Azure Blob 存储服务的详细信息,请参阅 如何使用 Azure Blob 存储服务
有关页 Blob 的详细信息,请参阅了解块 Blob 和页 Blob
SQL Server 组件
URL: URL 指定唯一备份文件的统一资源标识符(URI)。 URL 用于提供 SQL Server 备份文件的位置和名称。 在此实现中,唯一有效的 URL 是指向 Azure 存储帐户中的页面 Blob 的 URL。 URL 必须指向实际的 Blob,而不仅仅是容器。 如果 Blob 不存在,就创建它。 如果指定了现有 Blob,则 BACKUP 将失败,除非指定了“WITH FORMAT”选项。
警告
如果选择将备份文件复制并上传到 Azure Blob 存储服务,请使用页 Blob 作为存储选项。 不支持从块 Blob 进行还原。 从块 blob 类型 RESTORE 将出错并且失败。
下面是示例 URL 值:http[s]://ACCOUNTNAME.Blob.core.windows.net/< CONTAINER>/<FILENAME.bak>。 不需要 HTTPS,但建议使用 HTTPS。
凭据: SQL Server 凭据是一个对象,用于存储连接到 SQL Server 外部资源所需的身份验证信息。 在这里,SQL Server 备份和还原过程使用凭据向 Azure Blob 存储服务进行身份验证。 凭据存储存储帐户的名称和存储帐户 访问密钥 值。 创建凭据后,必须在发出 BACKUP/RESTORE 语句时在 WITH CREDENTIAL 选项中指定该凭据。 有关如何查看、复制或重新生成存储帐户 访问密钥的详细信息,请参阅 存储帐户访问密钥。
有关如何创建 SQL Server 凭据的分步说明,请参阅本主题后面的 “创建凭据 ”示例。
有关凭据的常规信息,请参阅 凭据
有关使用凭据的其他示例的信息,请参阅 创建 SQL Server 代理代理。
局限性
不支持备份到高级存储。
支持的最大备份大小为 1 TB。
可以使用 TSQL、SMO 或 PowerShell cmdlet 发出备份或还原语句。 当前未启用使用 SQL Server Management Studio 的备份或还原向导将数据备份至或从 Azure Blob 存储服务进行还原。
不支持创建逻辑设备名称。 因此不支持使用 sp_dumpdevice 或通过 SQL Server Management Studio 将 URL 添加为备份设备。
不支持追加到现有的备份 Blob 存储。 现有 Blob 的备份只能通过使用 WITH FORMAT 选项进行覆盖。
不支持在单个备份操作中备份到多个 Blob。 例如,以下方法返回错误:
BACKUP DATABASE AdventureWorks2012 TO URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012_1.bak' URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012_2.bak' WITH CREDENTIAL = 'mycredential' ,STATS = 5; GO
不支持使用
BACKUP
指定块大小。不支持
MAXTRANSFERSIZE
的指定。指定备份集选项 -
RETAINDAYS
和EXPIREDATE
不受支持。SQL Server 要求备份设备名称最多包含 259 个字符。 对于用于指定 URL“https://.blob.core.windows.net//.bak”所需的元素,BACKUP TO URL 占用 36 个字符,其余 223 个字符将用于帐户、容器和 Blob 名称。
支持备份/还原语句
备份/还原命令 | 已支持 | 例外 | 注释 |
备份 | ✓ | 不支持 BLOCKSIZE 和 MAXTRANSFERSIZE。 | 需要指定的 WITH CREDENTIAL |
恢复 | ✓ | 需要指定的 WITH CREDENTIAL | |
RESTORE FILELISTONLY (恢复文件列表) | ✓ | 需要指定的 WITH CREDENTIAL | |
还原 HEADERONLY | ✓ | 需要指定的 WITH CREDENTIAL | |
仅恢复标签 | ✓ | 需要指定WITH CREDENTIAL | |
恢复仅验证 | ✓ | 需要指定的 WITH CREDENTIAL | |
RESTORE REWINDONLY | ✓ |
有关备份语句的语法和常规信息,请参阅 BACKUP (Transact-SQL)。
有关还原语句的语法和常规信息,请参阅 RESTORE(Transact-SQL)。
支持备份参数
论点 | 已支持 | 例外 | 注释 |
数据库 | ✓ | ||
日志 | ✓ | ||
TO (URL) | ✓ | 与 DISK 和 TAPE 不同,URL 不支持指定或创建逻辑名称。 | 此参数用于指定备份文件的 URL 路径。 |
镜像到 | ✓ | ||
带有选项: | |||
凭据 | ✓ | 仅当使用 BACKUP TO URL 选项备份到 Azure Blob 存储服务时,才支持 WITH CREDENTIAL。 | |
微分 | ✓ | ||
COPY_ONLY | ✓ | ||
压缩|无压缩 | ✓ | ||
描述 | ✓ | ||
名称 | ✓ | ||
到期日期 | 保留天数 | ✓ | ||
NOINIT |INIT | ✓ | 该选项即使被使用也会被忽略。 无法向 Blob 附加内容。 若要覆盖备份,请使用 FORMAT 参数。 |
|
NOSKIP |跳 | ✓ | ||
NOFORMAT |格式 | ✓ | 此选项被忽略,无论是否使用。 除非指定 WITH FORMAT,否则对现有 Blob 执行的备份将失败。 指定 WITH FORMAT 选项时,将覆盖现有 Blob。 |
|
媒体描述 | ✓ | ||
媒体名称 | ✓ | ||
BLOCKSIZE | ✓ | ||
BUFFERCOUNT | ✓ | ||
MAXTRANSFERSIZE | ✓ | ||
无校验和 | 校验和 | ✓ | ||
错误时停止 | 错误后继续 | ✓ | ||
统计 | ✓ | ||
REWIND |NOREWIND | ✓ | ||
UNLOAD | NOUNLOAD | ✓ | ||
NORECOVERY |待机 | ✓ | ||
NO_TRUNCATE | ✓ |
有关备份参数的详细信息,请参阅 BACKUP (Transact-SQL)。
支持还原参数
论点 | 已支持 | 例外 | 注释 |
数据库 | ✓ | ||
日志 | ✓ | ||
来自 (URL) | ✓ | FROM URL 参数用于指定备份文件的 URL 路径。 | |
选项: | |||
凭据 | ✓ | 仅当使用 RESTORE FROM URL 选项从 Azure Blob 存储服务还原时,才支持 WITH CREDENTIAL。 | |
部分 | ✓ | ||
恢复 | 不恢复 | 待机 | ✓ | ||
加载历史记录 | ✓ | ||
移动 | ✓ | ||
取代 | ✓ | ||
重新启动 | ✓ | ||
受限制用户 | ✓ | ||
文件 | ✓ | ||
密码 | ✓ | ||
MEDIANAME | ✓ | ||
媒体密码 | ✓ | ||
BLOCKSIZE | ✓ | ||
BUFFERCOUNT | ✓ | ||
MAXTRANSFERSIZE | ✓ | ||
CHECKSUM | NO_CHECKSUM | ✓ | ||
遇错停止 | 遇错继续 | ✓ | ||
FILESTREAM | ✓ | ||
统计 | ✓ | ||
REWIND |NOREWIND | ✓ | ||
卸载 | 不卸载 | ✓ | ||
保持复制 | ✓ | ||
KEEP_CDC | ✓ | ||
ENABLE_BROKER |ERROR_BROKER_CONVERSATIONS |NEW_BROKER | ✓ | ||
STOPAT |STOPATMARK |STOPBEFOREMARK | ✓ |
有关还原参数的详细信息,请参阅 RESTORE 参数(Transact-SQL)。
在 SQL Server Management Studio 中使用备份任务
SQL Server Management Studio 中的备份任务已得到增强,以包含 URL 作为目标选项之一,以及备份到 Azure 存储所需的其他支持对象,例如 SQL 凭据。
以下步骤描述了对备份数据库任务所做的更改,以允许备份到 Azure 存储。
启动 SQL Server Management Studio 并连接到 SQL Server 实例。 选择要备份的数据库,然后右键单击 “任务”,然后选择“ 备份”。。。这将打开“备份数据库”对话框。
在常规页面上, URL 选项用于创建到 Azure 存储的备份。 选择此选项时,可看到此页面上启用了其他选项:
文件名: 备份文件的名称。
SQL 凭据: 可以指定现有的 SQL Server 凭据,也可以通过单击“SQL 凭据”框旁边的“ 创建 ”创建新的凭据。
重要
单击“ 创建 ”时打开的对话框需要订阅的管理证书或发布配置文件。 SQL Server 当前支持发布配置文件版本 2.0。 若要下载受支持的发布配置文件版本,请参阅 “下载发布配置文件 2.0”。
如果无权访问管理证书或发布配置文件,可以通过指定存储帐户名称并使用 Transact-SQL 或 SQL Server Management Studio 访问密钥信息来创建 SQL 凭据。 请参阅“ 创建凭据 ”部分中的示例代码,以使用 Transact-SQL 创建凭据。 或者,使用 SQL Server Management Studio,从数据库引擎实例中右键单击 “安全性”,选择“ 新建”,然后选择“ 凭据”。 在“密码”字段中指定标识和访问密钥的存储帐户名称。
Azure 存储容器: 用于存储备份文件的 Azure 存储容器的名称。
URL 前缀: 这是使用前面步骤中所述字段中指定的信息自动生成的。 如果手动编辑此值,请确保它与之前提供的其他信息匹配。 例如,如果修改存储 URL,请确保将 SQL 凭据设置为对同一存储帐户进行身份验证。
选择 URL 作为目标时,“ 媒体选项” 页中的某些选项将被禁用。 以下主题提供了有关“备份数据库”对话框的详细信息:
使用维护计划向导将 SQL Server 备份到 URL
与前面所述的备份任务类似,SQL Server Management Studio 中的维护计划向导已得到增强,以将 URL 作为目标选项之一包含,以及备份到 Azure 存储(如 SQL 凭据)所需的其他支持对象。 有关详细信息,请参阅“使用维护计划向导”中的“定义备份任务”部分。
使用 SQL Server Management Studio 从 Azure 存储还原
如果要还原数据库, URL 将作为要从中进行还原的设备包含在内。 以下步骤描述了还原任务中的更改,以允许从 Azure 存储进行还原:
在 SQL Server Management Studio 的“还原”任务的“常规”页中选择“设备”时,会转到“选择备份设备”对话框,其中包括 URL 作为备份媒体类型。
选择 URL 并单击“ 添加”时,将打开 “连接到 Azure 存储 ”对话框。 指定要向 Azure 存储进行身份验证的 SQL 凭据信息。
然后,SQL Server 使用提供的 SQL 凭据信息连接到 Azure 存储,并在 Azure 对话框中打开 “查找备份文件 ”。 此页显示了驻留在存储中的备份文件。 选择要用于还原的文件,然后单击“ 确定”。 这会将你返回到 “选择备份设备 ”对话框,单击此对话框上的 “确定 ”将返回到主 “还原 ”对话框,你可以在其中完成还原。 有关详细信息,请参阅以下主题:
代码示例
本部分包含以下示例。
创建凭据
以下示例创建一个凭据,用于存储 Azure 存储身份验证信息。
IF NOT EXISTS
(SELECT * FROM sys.credentials
WHERE credential_identity = 'mycredential')
CREATE CREDENTIAL mycredential WITH IDENTITY = 'mystorageaccount'
,SECRET = '<storage access key>' ;
// Connect to default sql server instance on local machine
Server server = new Server(".");
string identity = "mystorageaccount";
string secret = "<storage access key>";
// Create a Credential
string credentialName = "mycredential";
Credential credential = new Credential(server, credentialName);
credential.Create(identity, secret);
# create variables
$storageAccount = "mystorageaccount"
$storageKey = "<storage access key>"
$secureString = ConvertTo-SecureString $storageKey -asplaintext -force
$credentialName = "mycredential"
$srvPath = "SQLSERVER:\SQL\COMPUTERNAME\INSTANCENAME"
# for default instance, the $srvpath variable would be "SQLSERVER:\SQL\COMPUTERNAME\DEFAULT"
# Create a credential
New-SqlCredential -Name $credentialName -Path $srvpath -Identity $storageAccount -Secret $secureString
备份完整数据库
以下示例将 AdventureWorks2012 数据库备份到 Azure Blob 存储服务。
BACKUP DATABASE AdventureWorks2012
TO URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012.bak'
WITH CREDENTIAL = 'mycredential'
,COMPRESSION
,STATS = 5;
GO
// Connect to default sql server instance on local machine
Server server = new Server(".");
string identity = "mystorageaccount";
string credentialName = "mycredential";
string dbName = "AdventureWorks2012";
string blobContainerName = "mycontainer";
// Generate Unique Url
string url = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}-{3}.bak",
identity,
blobContainerName,
dbName,
DateTime.Now.ToString("s").Replace(":", "-"));
// Backup to Url
Backup backup = new Backup();
backup.CredentialName = credentialName;
backup.Database = dbName;
backup.CompressionOption = BackupCompressionOptions.On;
backup.Devices.AddDevice(url, DeviceType.Url);
backup.SqlBackup(server);
# create variables
$backupUrlContainer = "https://mystorageaccount.blob.core.windows.net/mycontainer/"
$credentialName = "mycredential"
$srvPath = "SQLSERVER:\SQL\COMPUTERNAME\INSTANCENAME"
# for default instance, the $srvpath varilable would be "SQLSERVER:\SQL\COMPUTERNAME\DEFAULT"
# navigate to SQL Server Instance
CD $srvPath
$backupFile = $backupUrlContainer + "AdventureWorks2012" + ".bak"
Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupFile -SqlCredential $credentialName -CompressionOption On
备份数据库和日志
以下示例备份 AdventureWorks2012 示例数据库,该数据库默认使用简单的恢复模式。 为了支持日志备份,将修改 AdventureWorks2012 数据库以使用完整恢复模式。 然后,该示例会创建到 Azure Blob 的完整数据库备份,并在更新活动之后备份日志。 此示例使用日期/时间戳创建备份文件名。
-- To permit log backups, before the full database backup, modify the database
-- to use the full recovery model.
USE master;
GO
ALTER DATABASE AdventureWorks2012
SET RECOVERY FULL;
GO
-- Back up the full AdventureWorks2012 database.
-- First create a file name for the backup file with DateTime stamp
DECLARE @Full_Filename AS VARCHAR (300);
SET @Full_Filename = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012_Full_'+
REPLACE (REPLACE (REPLACE (CONVERT (VARCHAR (40), GETDATE (), 120), '-','_'),':', '_'),' ', '_') + '.bak';
--Back up Adventureworks2012 database
BACKUP DATABASE AdventureWorks2012
TO URL = @Full_Filename
WITH CREDENTIAL = 'mycredential';
,COMPRESSION
GO
-- Back up the AdventureWorks2012 log.
DECLARE @Log_Filename AS VARCHAR (300);
SET @Log_Filename = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012_Log_'+
REPLACE (REPLACE (REPLACE (CONVERT (VARCHAR (40), GETDATE (), 120), '-','_'),':', '_'),' ', '_') + '.trn';
BACKUP LOG AdventureWorks2012
TO URL = @Log_Filename
WITH CREDENTIAL = 'mycredential'
,COMPRESSION;
GO
// Connect to default sql server instance on local machine
Server server = new Server(".");
string identity = "mystorageaccount";
string credentialName = "mycredential";
string dbName = "AdventureWorks2012";
string blobContainerName = "mycontainer";
// Generate Unique Url for data backup
string urlDataBackup = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}_Data-{3}.bak",
identity,
blobContainerName,
dbName,
DateTime.Now.ToString("s").Replace(":", "-"));
// Backup Database to Url
Backup backupData = new Backup();
backupData.CredentialName = credentialName;
backupData.Database = dbName;
backup.CompressionOption = BackupCompressionOptions.On;
backupData.Devices.AddDevice(urlDataBackup, DeviceType.Url);
backupData.SqlBackup(server);
// Generate Unique Url for data backup
string urlLogBackup = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}_Log-{3}.bak",
identity,
blobContainerName,
dbName,
DateTime.Now.ToString("s").Replace(":", "-"));
// Backup Database Log to Url
Backup backupLog = new Backup();
backupLog.CredentialName = credentialName;
backupLog.Database = dbName;
backup.CompressionOption = BackupCompressionOptions.On;
backupLog.Devices.AddDevice(urlLogBackup, DeviceType.Url);
backupLog.Action = BackupActionType.Log;
backupLog.SqlBackup(server);
#create variables
$backupUrlContainer = "https://mystorageaccount.blob.core.windows.net/mycontainer/"
$credentialName = "mycredential"
$srvPath = "SQLSERVER:\SQL\COMPUTERNAME\INSTANCENAME"
# for default instance, the $srvpath variable would be "SQLSERVER:\SQL\COMPUTERNAME\DEFAULT"
# navigate to theSQL Server Instance
CD $srvPath
#Create a unique file name for the full database backup
$backupFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") + ".bak"
#Backup Database to URL
Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupFile -SqlCredential $credentialName -CompressionOption On -BackupAction Database
#Create a unique file name for log backup
$backupFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") + ".trn"
#Backup Log to URL
Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupFile -SqlCredential $credentialName -CompressionOption On -BackupAction Log
创建主文件组的完整文件备份
以下示例创建主文件组的完整文件备份。
--Back up the files in Primary:
BACKUP DATABASE AdventureWorks2012
FILEGROUP = 'Primary'
TO URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012files.bck'
WITH CREDENTIAL = 'mycredential'
,COMPRESSION;
GO
// Connect to default sql server instance on local machine
Server server = new Server(".");
string identity = "mystorageaccount";
string credentialName = "mycredential";
string dbName = "AdventureWorks2012";
string blobContainerName = "mycontainer";
// Generate Unique Url
string url = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}-{3}.bck",
identity,
blobContainerName,
dbName,
DateTime.Now.ToString("s").Replace(":", "-"));
// Backup to Url
Backup backup = new Backup();
backup.CredentialName = credentialName;
backup.Database = dbName;
backup.Action = BackupActionType.Files;
backup.DatabaseFileGroups.Add("PRIMARY");
backup.CompressionOption = BackupCompressionOptions.On;
backup.Devices.AddDevice(url, DeviceType.Url);
backup.SqlBackup(server);
#create variables
$backupUrlContainer = "https://mystorageaccount.blob.core.windows.net/mycontainer/"
$credentialName = "mycredential"
$srvPath = "SQLSERVER:\SQL\COMPUTERNAME\INSTANCENAME"
# for default instance, the $srvpath variable would be "SQLSERVER:\SQL\COMPUTERNAME\DEFAULT"
# navigate to the SQL Server Instance
CD $srvPath
#Create a unique file name for the file backup
$backupFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") + ".bck"
#Backup Primary File Group to URL
Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupFile -SqlCredential $credentialName -CompressionOption On -BackupAction Files -DatabaseFileGroup Primary
创建主文件组的差异文件备份
以下示例创建主文件组的差异文件备份。
--Back up the files in Primary:
BACKUP DATABASE AdventureWorks2012
FILEGROUP = 'Primary'
TO URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012filesdiff.bck'
WITH
CREDENTIAL = 'mycredential'
,COMPRESSION
,DIFFERENTIAL;
GO
// Connect to default sql server instance on local machine
Server server = new Server(".");
string identity = "mystorageaccount";
string credentialName = "mycredential";
string dbName = "AdventureWorks2012";
string blobContainerName = "mycontainer";
// Generate Unique Url
string url = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}-{3}.bak",
identity,
blobContainerName,
dbName,
DateTime.Now.ToString("s").Replace(":", "-"));
// Backup to Url
Backup backup = new Backup();
backup.CredentialName = credentialName;
backup.Database = dbName;
backup.Action = BackupActionType.Files;
backup.DatabaseFileGroups.Add("PRIMARY");
backup.Incremental = true;
backup.CompressionOption = BackupCompressionOptions.On;
backup.Devices.AddDevice(url, DeviceType.Url);
backup.SqlBackup(server);
#create variables
$backupUrlContainer = "https://mystorageaccount.blob.core.windows.net/mycontainer/"
$credentialName = "mycredential"
$srvPath = "SQLSERVER:\SQL\COMUTERNAME\INSTANCENAME"
# for default instance, the $srvpath variable would be "SQLSERVER:\SQL\COMPUTERNAME\DEFAULT"
# navigate to SQL Server Instance
CD $srvPath
#create a unique file name for the full backup
$backupdbFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") + ".bak"
#Create a differential backup of the primary filegroup
Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupFile -SqlCredential $credentialName -CompressionOption On -BackupAction Files -DatabaseFileGroup Primary -Incremental
还原数据库并移动文件
还原完整数据库备份并将还原的数据库移动到 C:\Program Files\Microsoft SQL Server\MSSQL12。MSSQLSERVER\MSSQL\Data 目录,使用以下步骤。
-- Backup the tail of the log first
DECLARE @Log_Filename AS VARCHAR (300);
SET @Log_Filename = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012_Log_'+
REPLACE (REPLACE (REPLACE (CONVERT (VARCHAR (40), GETDATE (), 120), '-','_'),':', '_'),' ', '_') + '.trn';
BACKUP LOG AdventureWorks2012
TO URL = @Log_Filename
WITH CREDENTIAL = 'mycredential'
,NORECOVERY;
GO
RESTORE DATABASE AdventureWorks2012 FROM URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012.bak'
WITH CREDENTIAL = 'mycredential'
,MOVE 'AdventureWorks2012_data' to 'C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.mdf'
,MOVE 'AdventureWorks2012_log' to 'C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.ldf'
,STATS = 5
// Connect to default sql server instance on local machine
Server server = new Server(".");
string identity = "mystorageaccount";
string credentialName = "mycredential";
string dbName = "AdventureWorks2012";
string blobContainerName = "mycontainer";
// Generate Unique Url
string urlBackupData = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}-Data{3}.bak",
identity,
blobContainerName,
dbName,
DateTime.Now.ToString("s").Replace(":", "-"));
// Backup to Url
Backup backup = new Backup();
backup.CredentialName = credentialName;
backup.Database = dbName;
backup.Devices.AddDevice(urlBackupData, DeviceType.Url);
backup.SqlBackup(server);
// Generate Unique Url for tail log backup
string urlTailLogBackup = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}-TailLog{3}.bak",
identity,
blobContainerName,
dbName,
DateTime.Now.ToString("s").Replace(":", "-"));
// Backup Tail Log to Url
Backup backupTailLog = new Backup();
backupTailLog.CredentialName = credentialName;
backupTailLog.Database = dbName;
backupTailLog.Action = BackupActionType.Log;
backupTailLog.NoRecovery = true;
backupTailLog.Devices.AddDevice(urlTailLogBackup, DeviceType.Url);
backupTailLog.SqlBackup(server);
// Restore a database and move files
string newDataFilePath = server.MasterDBLogPath + @"\" + dbName + DateTime.Now.ToString("s").Replace(":", "-") + ".mdf";
string newLogFilePath = server.MasterDBLogPath + @"\" + dbName + DateTime.Now.ToString("s").Replace(":", "-") + ".ldf";
Restore restore = new Restore();
restore.CredentialName = credentialName;
restore.Database = dbName;
restore.ReplaceDatabase = true;
restore.Devices.AddDevice(urlBackupData, DeviceType.Url);
restore.RelocateFiles.Add(new RelocateFile(dbName, newDataFilePath));
restore.RelocateFiles.Add(new RelocateFile(dbName+ "_Log", newLogFilePath));
restore.SqlRestore(server);
#create variables
$backupUrlContainer = "https://mystorageaccount.blob.core.windows.net/mycontainer/"
$credentialName = "mycredential"
$srvPath = "SQLSERVER:\SQL\COMPUTERNAME\INSTNACENAME"
# for default instance, the $srvpath variable would be "SQLSERVER:\SQL\COMPUTERNAME\DEFAULT"
# navigate to SQL Server Instance
CD $srvPath
#create a unique file name for the full backup
$backupdbFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") + ".bak"
# Full database backup to URL
Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupdbFile -SqlCredential $credentialName -CompressionOption On
#Create a unique file name for the tail log backup
$backuplogFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") + ".trn"
#Backup tail log to URL
Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupFile -SqlCredential $credentialName -BackupAction Log -NoRecovery
# Restore Database and move files
$newDataFilePath = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile ("AdventureWorks_Data","C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.mdf")
$newLogFilePath = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile("AdventureWorks_Log","C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.ldf")
Restore-SqlDatabase -Database AdventureWorks2012 -SqlCredential $credentialName -BackupFile $backupdbFile -RelocateFile @($newDataFilePath,$newLogFilePath)
使用 STOPAT 功能还原到特定时间点
以下示例将数据库还原到某个时间点的状态,并展示还原操作。
RESTORE DATABASE AdventureWorks FROM URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012.bak'
WITH
CREDENTIAL = 'mycredential'
,MOVE 'AdventureWorks2012_data' to 'C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.mdf'
,Move 'AdventureWorks2012_log' to 'C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.ldf'
,NORECOVERY
--,REPLACE
,STATS = 5;
GO
RESTORE LOG AdventureWorks FROM URL = 'https://mystorageaccount.blob.core.windows.net/mycontainer/AdventureWorks2012.trn'
WITH CREDENTIAL = 'mycredential'
,RECOVERY
,STOPAT = 'Oct 23, 2012 5:00 PM'
GO
// Connect to default sql server instance on local machine
Server server = new Server(".");
string identity = "mystorageaccount";
string credentialName = "mycredential";
string dbName = "AdventureWorks2012";
string blobContainerName = "mycontainer";
// Generate Unique Url
string urlBackupData = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}-Data{3}.bak",
identity,
blobContainerName,
dbName,
DateTime.Now.ToString("s").Replace(":", "-"));
// Backup to Url
Backup backup = new Backup();
backup.CredentialName = credentialName;
backup.Database = dbName;
backup.Devices.AddDevice(urlBackupData, DeviceType.Url);
backup.SqlBackup(server);
// Generate Unique Url for Tail Log backup
string urlTailLogBackup = String.Format(@"https://{0}.blob.core.windows.net/{1}/{2}-TailLog{3}.bak",
identity,
blobContainerName,
dbName,
DateTime.Now.ToString("s").Replace(":", "-"));
// Backup Tail Log to Url
Backup backupTailLog = new Backup();
backupTailLog.CredentialName = credentialName;
backupTailLog.Database = dbName;
backupTailLog.Action = BackupActionType.Log;
backupTailLog.NoRecovery = true;
backupTailLog.Devices.AddDevice(urlTailLogBackup, DeviceType.Url);
backupTailLog.SqlBackup(server);
// Restore a database and move files
string newDataFilePath = server.MasterDBLogPath + @"\" + dbName + DateTime.Now.ToString("s").Replace(":", "-") + ".mdf";
string newLogFilePath = server.MasterDBLogPath + @"\" + dbName + DateTime.Now.ToString("s").Replace(":", "-") + ".ldf";
Restore restore = new Restore();
restore.CredentialName = credentialName;
restore.Database = dbName;
restore.ReplaceDatabase = true;
restore.NoRecovery = true;
restore.Devices.AddDevice(urlBackupData, DeviceType.Url);
restore.RelocateFiles.Add(new RelocateFile(dbName, newDataFilePath));
restore.RelocateFiles.Add(new RelocateFile(dbName + "_Log", newLogFilePath));
restore.SqlRestore(server);
// Restore transaction Log with stop at
Restore restoreLog = new Restore();
restoreLog.CredentialName = credentialName;
restoreLog.Database = dbName;
restoreLog.Action = RestoreActionType.Log;
restoreLog.Devices.AddDevice(urlBackupData, DeviceType.Url);
restoreLog.ToPointInTime = DateTime.Now.ToString();
restoreLog.SqlRestore(server);
#create variables
$backupUrlContainer = "https://mystorageaccount.blob.core.windows.net/mycontainer/"
$credentialName = "mycredential"
$srvPath = "SQLSERVER:\SQL\COMPUTERNAME\INSTANCENAME"
# for default instance, the $srvpath variable would be "SQLSERVER:\SQL\COMPUTERNAME\DEFAULT"
# Navigate to SQL Server Instance Directory
CD $srvPath
#create a unique file name for the full backup
$backupdbFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") + ".bak"
# Full database backup to URL
Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupdbFile -SqlCredential $credentialName -CompressionOption On
#Create a unique file name for the tail log backup
$backuplogFile = $backupUrlContainer + "AdventureWorks2012_" + (Get-Date).ToString("s").Replace("-","_").Replace(":", "_").Replace(" ","_").Replace("/", "_") + ".trn"
#Backup tail log to URL
Backup-SqlDatabase -Database AdventureWorks2012 -backupFile $backupFile -SqlCredential $credentialName -BackupAction Log -NoRecovery
# Restore Database and move files
$newDataFilePath = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile ("AdventureWorks_Data","C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.mdf")
$newLogFilePath = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile("AdventureWorks_Log","C:\Program Files\Microsoft SQL Server\myinstance\MSSQL\DATA\AdventureWorks2012.ldf")
Restore-SqlDatabase -Database AdventureWorks2012 -SqlCredential $credentialName -BackupFile $backupdbFile -RelocateFile @($newDataFilePath,$newLogFilePath) -NoRecovery
# Restore Transaction log with Stop At:
Restore-SqlDatabase -Database AdventureWorks2012 -SqlCredential $credentialName -BackupFile $backuplogFile -ToPointInTime (Get-Date).ToString()