65.9K
CodeProject 正在变化。 阅读更多。
Home

Azure SQL 虚拟机数据计划备份

starIconstarIconstarIconstarIconstarIcon

5.00/5 (6投票s)

2013年10月14日

CPOL

5分钟阅读

viewsIcon

26534

downloadIcon

142

使用 SQL 作业代理将虚拟机中的数据库备份到 Azure Blob 容器,SQL,云,SQL-Server,Azure

引言

本文是一个简短的“操作指南”,演示了如何将 Azure 平台上的 SQL 2012 虚拟机中运行的数据备份到 Blob 容器。


背景

出于安全和隐私等各种原因,我们不得不将一些最近的多租户应用程序托管在单独的 MS SQL 数据库中。数据库本身托管在多个 SQL 2012 数据服务器中,这些服务器运行在多个不同的虚拟机上。虽然市面上有许多优秀的数据库备份提供商,但没有一家能满足我们特定配置的定价模式,因此我们不得不自己构建一个解决方案 - 本文便是成果,希望对其他人有所帮助!

此处详细介绍的方法基于“BACKUP TO URL”,该方法在 此处 进行了概述。

设置

我们有一个核心数据库,其中包含一个列出每个单独客户端数据库的表;这充当我们的起点。我们获取这些数据库的列表,然后逐个备份。当然,您不需要这样做,如果您愿意,可以简单地枚举数据服务器中的所有数据库,这只是我们采用的方法。为了进行实际备份,我们使用了增强的“BACKUP”SQL 命令,该命令允许使用 URL 作为目标设备。

远程备份“设备”所需的目標信息如下

http[s]://ACCOUNTNAME.Blob.core.windows.net/<CONTAINER>/<FILENAME.bak> 

相关部分是

(1) 您需要在 Azure 中输入您的 ACCOUNTNAME
(2) 您提供一个容器名称(我们称之为“SQLBackup”)
(3) 您提供一个文件名(我们动态创建了一个)

完整的 SQL 脚本很简单

BACKUP DATABASE AdventureWorks2012 TO URL = 'https://ACCOUNTNAME.blob.core.windows.net/mycontainer/AdventureWorks2012_1.bak' WITH CREDENTIAL = 'mycredential', STATS = 5; 

除了上述 (1-3) 项之外,您还为命令提供了一个“CREDENTIAL”。凭据是您的 Azure ACCOUNTNAME 加上您的 blob 容器 SHARED KEY 的详细信息。

要同时获取这两项,请转到您的 Azure 仪表板,选择您的容器存储,然后点击屏幕底部的“管理密钥”来获取密钥。

一旦您获得了密钥,您还需要获取您的 blob 容器名称 – 这应该与您的存储帐户名称相同,但如果不是,可以在 blob 仪表板的底部找到。


要创建名为“MyCred”的凭据(例如),您需要运行此 SQL 代码

IF NOT EXISTS (SELECT * FROM sys.credentials WHERE credential_identity = 'MyCred') CREATE CREDENTIAL MyCred WITH IDENTITY = 'MyCred' ,SECRET = [YOUR SECRET KEY]' ;


现在可以使用“MyCred”凭据了。


为了能够运行测试,我们需要在您的 blob 容器中设置一个文件夹 – 我们称之为“SQLBackup” – 您可以随意命名。


现在我们应该有足够的信息来运行一个测试。让我们假设以下内容

数据库名称 = “MyDatabase”
凭据 = “MyCred”
存储容器 = “MyAzureStorage”
容器内的存储文件夹 = “SQLBackup”
密钥 = “ABC123”


因此,我们的测试命令如下

BACKUP DATABASE MyDatabase TO URL = 'http://MyAzureStorage.blob.core.windows.net/sqlbackup/MyDatabase.bak' WITH CREDENTIAL = 'MyCred', COMPRESSION ,STATS = 5

如果我们运行它,我们应该看到类似这样的结果


数据库 'MyDatabase,文件 MyDatabase' 在文件 1 上处理了 384 页。

已处理 100%。

数据库 MyDatabase', 文件 MyDatabase_log' 在文件 1 上处理了 2 页。

BACKUP DATABASE 在 0.173 秒内成功处理了 386 页(17.397 MB/秒)。


我们可以通过查看 Azure blob 容器来确认数据是否已正确传输




将所有内容整合在一起

好的,这是省时省力部分……让我们构建一个存储过程,它遍历每个数据库并进行备份。逻辑如下

(1) 创建一个临时表来存储数据库列表(如果存在,先删除它)

create procedure BackupToAzure as
begin
-- delete temp table if exists

IF EXISTS
( SELECT * FROM tempdb.dbo.sysobjects WHERE ID =
OBJECT_ID('tempdb.dbo.#TablesToBackup'))
BEGIN 
DROP TABLE #TablesToBackup
END
-- create temp table
Create table #TablesToBackup(DBName
nvarchar(100)) 


(2) 选择表数据并插入临时表。在我们的例子中,我们将数据库名称与数据服务器名称一起存储,用冒号分隔,因此我们首先使用“CharIndex”函数来拆分我们想要的内容

-- populate
insert into #TablesToBackup
select
SUBSTRING(LinkName,CHARINDEX(':', LinkName)+1,100) as DBaseName from ClientDatabases

然后我们使用表游标遍历临时表,边构建执行字符串,其中包含 URL、文件名等。

declare @C cursor
set @C = cursor for 
       select
* from  #TablesToBackup
declare @F nvarchar(100)
open @C
while 0=0 
       begin
              fetch next from @C into @F
              if not(@@FETCH_STATUS = 0)
break
                     DECLARE @pathName
NVARCHAR(512) 
                     DECLARE @CMD
NVARCHAR(300)
                     DECLARE @URL
NVARCHAR(300)
                     DECLARE @Break
NVARCHAR(5)
                     DECLARE @FileDate NVARCHAR(20)
                     SET QUOTED_IDENTIFIER
OFF
                     Set @URL = 'https://MyAzureStorage.blob.core.windows.net/sqlbackup/'
                     Set @Break = '_' 
                     Set @FileDate =
Convert(varchar(8), GETDATE(), 112) + '.bak'
                     Set @Cmd = @URL + @F
+ @Break + @FileDate
                     BACKUP DATABASE @F
                     TO URL = @CMD WITH
FORMAT, CREDENTIAL = 'MyCred', COMPRESSION ,STATS = 5
                     SET QUOTED_IDENTIFIER
ON
       end    
close @C
deallocate @C
       
DROP TABLE #TablesToBackup
end

好的,差不多了。如果我们运行脚本,它会创建存储过程。当我们执行存储过程时,它会成功遍历每个数据库并逐个备份它们。


这很好,唯一的问题是我们不想手动运行存储过程,因此我们创建了一个计划任务来执行它。在 MS Management Studio 中,选择 SQL Server Agent,右键单击并创建新作业。




给作业起个名字..

并添加一个新的“步骤”

选择存储过程所在的数据库非常重要,否则可能会出现错误。在“命令”框中,输入您的“EXEC”命令以及您的存储过程名称。

最后,创建一个新的 SCHEDULE 项目并填写您想要的计划详细信息…

最后一件事情是能够查看正在发生的事情 – 为此,我们需要访问作业历史记录。可以通过右键单击作业任务来访问。


历史记录提供了有关流程运行状况的信息

剩下的唯一事情是备份备份!…目前我们正在测试 RedGate 的解决方案来备份包含我们所有客户数据的 *blob 容器* – 如果看到长期结果,我可能会报告。

与我所有的文章一样,我请求您花一秒钟来评价它,这样我就可以跟踪人们感兴趣的内容!

非常感谢,祝您编码愉快。

© . All rights reserved.