Выберите последний BAK-файл из хранилища BLOB-объектов, чтобы автоматизировать восстановление до SQL Server 2016.

Каждую ночь создается резервная копия с производственного сервера (к которому у меня нет доступа) в хранилище больших двоичных объектов Azure каждую ночь. Я использую SQL Server 2016 на виртуальной машине Azure, чтобы восстановить этот .bak для извлечения данных для целей отчетности.

Как определить имя последнего файла .bak из моего хранилища BLOB-объектов для автоматического восстановления?

Одним из способов является то, что я могу использовать остальной API для получения списка больших двоичных объектов в контейнере, но как я могу получить результаты этого в SQL без сторонних плагинов.


person Dorf    schedule 24.10.2019    source источник
comment
Интересный вопрос, как мы узнаем, как получить доступ к вашему хранилищу BLOB-объектов? Мы даже не знаем, что вы используете, не говоря уже о том, как вы это используете.   -  person Dale K    schedule 24.10.2019
comment
Каждую ночь создается резервная копия с рабочего сервера в хранилище BLOB-объектов Azure. Я использую SQL Server 2016 в виртуальной машине Azure для восстановления этого .bak для извлечения данных для целей отчетности.   -  person Dorf    schedule 24.10.2019


Ответы (2)


Я решил эту проблему, создав скрипт powershell, который получает список больших двоичных объектов и сохраняет их в csv.

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

Затем я загружаю csv в базу данных azure sql с помощью ssis и получаю последнюю запись.

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
person Dorf    schedule 11.11.2019

вы можете начать со следующего, чтобы получить имя\местоположение файла, если он был зарезервирован с использованием собственной резервной копии (или чего-то, что интегрируется с собственной резервной копией)

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, вы, вероятно, используете какой-то сторонний инструмент для резервного копирования, которым вам придется управлять другим способом...

person Trubs    schedule 24.10.2019
comment
К сожалению, резервная копия сделана с другого сервера, поэтому я не знаю имя последнего файла, если не посмотрю его вручную. Если бы я мог загрузить список всех больших двоичных объектов в контейнере в таблицу sql, я мог бы выяснить, какой из них является последним, но я не уверен, как это сделать. - person Dorf; 24.10.2019
comment
Таким образом, вы можете запустить вышеуказанный запрос на другом сервере, чтобы получить правильную информацию? Вы пробовали использовать связанный сервер? например ..от имя_сервера.msdb.dbo.backupset.. - person Trubs; 24.10.2019
comment
У меня нет доступа к другому серверу, только резервные копии в хранилище BLOB-объектов. - person Dorf; 24.10.2019