Select 来自 blob 存储的最新 .bak 自动恢复到 SQL Server 2016

Select latest .bak from blob store to automate restore to SQL Server 2016

每晚都会从生产服务器(我无法访问)备份到 azure blob 存储,我在 Azure VM 中使用 SQL Server 2016 来恢复要提取的 .bak用于报告目的的数据。

如何从我的 blob 存储中识别最新 .bak 文件的名称以自动恢复?

一种方法是我可以使用其余的 API 来获取容器中的 blob 列表,但是如果没有第 3 方插件,我如何在 SQL 中获取结果。

如果使用本机备份(或与本机备份集成的东西)进行备份,您可以从以下开始获取文件的 name\location

select  top 1 
        bs.database_name, backup_finish_date
       ,bmf.physical_device_name
from msdb.dbo.backupset bs 
Inner join msdb.dbo.backupmediafamily bmf on bs.media_set_id = bmf.media_set_id
where bs.database_name Like 'master%'
and bs.type = 'D'  -- full backup
order by bs.backup_finish_date desc

但是,如果您的 physical_device_name 提供了一个 guid,则您可能正在使用某些第三方备份工具,您将不得不以另一种方式进行管理...

我通过创建一个 powershell 脚本解决了这个问题,该脚本获取 blob 列表并将它们保存到 csv

    $ctx = New-AzureStorageContext -StorageAccountName "" -SASToken ""
Get-AzureStorageBlob -Context $ctx -Container "" | Select-Object Name,LastModified,{""}, {""}, {""} | Export-Csv "C:\bloblist.csv"

然后我使用 ssis 将 csv 加载到 azure sql 数据库中并检索最新记录

SELECT TOP 1 URI + [Name] as bak
FROM [stg].[ext_BlobList]
ORDER BY cast(lastmodified as datetime2) DESC

然后在 ssis tsql 脚本中用作变量来恢复数据库

USE [master]
ALTER DATABASE [pc] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
RESTORE DATABASE [pc] FROM  URL = ? WITH  FILE = 1,  MOVE N'pc' TO N'F:\Data\pc.mdf',  MOVE N'pc_log' TO N'F:\Log\pc_log.ldf',  NOUNLOAD,  REPLACE,  STATS = 5
ALTER DATABASE [pc] SET MULTI_USER

GO