-->

понедельник, 8 февраля 2016 г.

Бэкап БД SQL Server по-расписанию через PowerShell и SQL Server Agent job

Задача: автоматизировать снятие BACPAC пакета с базы данных SQL Server (для Azure SQL Database тоже работает). Напомню, BACPAC не содержит transaction log, соответственно для point-in-time restore не подойдет. В нашем случае нужен для быстрого развертывания "по требованию" копии базы с нужными данными, для проведения интеграционного тестирования.

Идеальным решением оказался скрипт на PowerShell. Код простейший, я взял гуляющую по интернету версию (к сожалению, ссылка на исходный скрипт затерялась) и немного ее доработал в нужную сторону. Создание бэкапа выполняется следующими командлетами:

$Services = new-object Microsoft.SqlServer.Dac.DacServices $ConnectionString
$Services.ExportBacpac($OutputFile, $DatabaseName)

Есть полный работоспособный пример на GitHub.  Для работы необходим PowerShell 3.0+ и Microsoft® SQL Server® Data-Tier Application Framework, желательно последней версии. На х64 машине необходимо установить как х86, так и х64 версию данной библиотеки.

Куда больше времени пришлось потратить на запуск скрипта через SQL Server Agent, когда я решил автоматизировать создание пакета с помощью периодически выполняемой задачи (job). Как оказалось, SQL Server  может использовать различные версии powershell для выполнения скрипта, в зависимости от версии самого SQL Server и step type у нашей задачи. Вообще говоря, выполнить PowerShell от лица SQL Server Agent возможно из нескольких типов шагов:
  • Operating System (CmdExec)
  • Powershell
Вот здесь есть таблица зависимости версий. Например, SQL Server 2012 с типом шага "Powershell" будут использовать PowerShell версии 2.0, что приведет к ошибке выполнения скрипта (нужен 3.0+). Независимо от наличия более свежих версий PS.
Сразу приведу workaround: для успешного выполнения Powershell скрипта через агента SQL Server 2012-2014 необходим шаг Operating System (CmdExec) со следующей командой:

powershell.exe -version 3.0 -ExecutionPolicy Bypass -file "C:\yourscript.ps1"

Комментариев нет:

Отправить комментарий