Azure SQL 虚拟机数据计划备份





5.00/5 (6投票s)
使用 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 容器* – 如果看到长期结果,我可能会报告。
与我所有的文章一样,我请求您花一秒钟来评价它,这样我就可以跟踪人们感兴趣的内容!
非常感谢,祝您编码愉快。