Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
29 мар 2024, 04:33

Параллельное выполнение процессов в одном задании MS SQL Server Agent

Автор ptr, 18 авг 2015, 16:22

0 Пользователей и 1 гость просматривают эту тему.

ptr

В задании на ежедневное обслуживание MS SQL баз данных иногда возникает желаение выполнять какие-то процессы параллельно. В моем случае, хотелось одновременно с восстановление БД "минус день" (копия продуктивной БД для обучения и экспериментов) архивировать копию БД для выкладывания на FTP сервер.
Если попробовать использовать стандартную команду START, то вас будет ждать разочарование. Она из-под SQL Server Agent не работает принципиально. Однако в любой MS Windows системе всегда уже есть запущеный Windows Scripting Host. Этот процесс совершенно не зависим от SQL Server Agent. Следовательно, никакие ограничения SQL Server Agent на него не распостраняются и мы вполне можем использовать его ресурсы для порождения новых процессов.

Для этого мы создаем простенький VB Script в файле с именем, например "Run cmd async.vbs" и содержимым:

dim scmd
dim command_line_args
dim RetCode

Set WshShell = CreateObject("WScript.Shell")
set command_line_args = wscript.Arguments

scmd="cmd.exe /C CD && """&command_line_args(0)&""" """&command_line_args(1)&""" >> """&command_line_args(2)&""" 2>&1"
RetCode = WshShell.run(scmd,0,false)
Wscript.Echo scmd


В данном примере первый параметр - имя асинхронно запускаемого командного файла. Второй параметр - параметр, передаваемый этому командному файлу. Третий параметр - имя текстового файла журнала, в который мы будем сохранять протокол работы нашего командного файла.

Пусть у нас уже есть командный файл с именем "Some task.cmd", м мы можем выполнить его асинхронно. Для этого в той же директории, что и ранее созданный файл "Run cmd async.vbs" мы размещаем наш командый файл "Some task.cmd" и создаем еще один командный файл с именем "Run some task asyn.cmd" и содержимым:

@echo off
c:\windows\system32\cscript.exe //nologo "%~dp0Run cmd async.vbs" "%~dp0Some task.cmd" "%1" "%~dp0%date:~10,4%%date:~4,2%%date:~7,2% Some task.log"
exit /B 0

Для простоты примера, журнал работы командного файла размещается в той же директории, что и командый файл. На практике, лучше для журналов выделять отдельную директорию.

Вот и все. Теперь при вызове "Run some task asyn.cmd" из шага SQL Server Agent шаг моментально завершится, а параллельно продолжит выполнятся наш командый файл "Some task.cmd"

P.S. У клиента БД размером около 200 гигабайт. Встроенное сжатие формирует резервную копию размером порядка 20 гигабайт. А 7Zip при компрессии не сжатого (уже сжатый почти не сжимается!) бекапа на максимальном сжатии LZMA - всего 3-4 гигабайта. Для передачи по FTP, к тому же с Камчатки в Москву по спутниковому каналу связи, разница принципиальная. Время сжатия не значительно, так как 7Zip умеет сжимать в несколько потоков, а при наличии 48 ядер на SQL серевере это дает очень ощутимое преимущество.

Похожие темы (1)

Рейтинг@Mail.ru

Поиск