Sql + powershell

1. ice-net 19 03.10.18 16:53 Сейчас в теме
Добрый день! Есть задание sql сервера, выполняется код powershell:

$Date = (Get-Date).Date
$Destination = "E:\Backup"
$Departure = "D:\MSSQL\Backup"
$Catalogs = Get-ChildItem -Path "$Departure" | Where-Object { $_.PSIsContainer }
foreach ($Catalog in $Catalogs)
{
	if(!(Test-Path "$Destination\$Catalog")) { New-Item -Path "$Destination\$Catalog" -ItemType Directory } # Создание подкаталогов
    Get-ChildItem -Path "$Departure\$Catalog" —Filter *.bak -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime.Date -eq $Date} | Copy-Item -Destination "$Destination\$Catalog" -Force # копирование бэкапов
}
Показать


если его выполнять через задание SQL - вылазит ошибка
Выполняется от имени пользователя: NT Service\SQLSERVERAGENT.На шаге задания произошла ошибка в строке 8 скрипта PowerShell. Соответствующая строка: " Get-ChildItem -Path "$Departure\$Catalog" -Filter *.bak -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime.Date -eq $Date} | Copy-Item -Destination "$Destination\$Catalog" -Force". Исправьте скрипт и заново внесите задание в расписание. Сведения об ошибке, возвращенные PowerShell: "Недопустимый путь: "E:\Backup\BUH_......._d". ". Код завершения процесса: -1. Шаг завершился с ошибкой.

Если этот же код запускать из консоли - все отрабатывает. Права на каталоги есть. Если закомментить строку копирования файлов - подкаталоги успешно создаются. Так же, если напрямую написать копирование конретного файла, то агент sql отрабатывает и копирует
Copy-Item "D:\MSSQL\Backup\BUH_....._d\BUH_.......7597418.bak" -Destination "E:\Backup\" -Force


Кто подскажет в чем дело? Или как еще можно заставить SQL после создания бэкапов сразу же копировать их во вне?
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
7. ice-net 19 09.10.18 10:20 Сейчас в теме
Отвечу сам же на свой вопрос:

выбираем тип шага CMDEXEC
cmd /C (ROBOCOPY "ПУТЬОТКУДА" "ПУТЬКУДА" *.bak /S /Z /MAXAGE:1 /R:1 /W:10 /XC /XX) ^& IF %ERRORLEVEL% LSS 8 EXIT /B 0
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. softcom_1c 20 03.10.18 17:09 Сейчас в теме
"Или как еще можно заставить SQL после создания бэкапов сразу же копировать их во вне?"

- Создаете план обслуживания с несколькими шагами (в зависимости от того, что помимо бэкапа нужно делать). Вариант для бэкап+копирование во вне:
Шаг 1: Бэкап (Либо скриптом чере execute TSQL либо через конструктор);
Шаг 2: execute TSQL примерно следующего содержания:
"-- <включаем использование xp_cmdshell в среде SQL. Если уже включено и выключать не нужно - можно пропустить>
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
-- enable xp_cmdshell
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
-- hide advanced options
EXEC sp_configure 'show advanced options', 0
GO
RECONFIGURE
GO
-- ... <включаем использование xp_cmdshell в среде SQL. Если уже включено и выключать не нужно - можно пропустить>
-- скрипт по копированию/ выполнению чего угодно еще
exec xp_cmdshell 'call "script_path/script.bat"'
GO"
6. ice-net 19 04.10.18 08:43 Сейчас в теме
(2) Хотелось бы без "xp_cmdshell=1" и без использования внешних файлов

(3) с правами все ОК, явное указание файла копирования через powershell в задании отрабатывает агентом корректно.
Copy-Item "D:\MSSQL\Backup\BUH_....._d\BUH_.......7597418.bak" -Destination "E:\Backup\" -Force


(4) У Нас не экспресс, но мне не известно таких механизмов, где бэкап пишется 2 места зеркально, а не 1 файл бить на 2 части по разным путям. (вариант делать 2 раза бэкап не рассматривается)

(5) Через создание нового шага мне не понравилось, т.е. если редактировать план обслуживания - эти лишние шаги удаляются, решил просто сделать отдельное задание и прикрепил его в основное. А батник из вне тоже не очень хочется запускать по той причине, что его могут подменить или затереть код внутри, или самого затереть, или еще что..
3. nyam-nyam 03.10.18 17:23 Сейчас в теме
Раз копирование идёт на другую машину, а выполнение скрипта от локальной учётки NT Service\SQLSERVERAGENT, то как вариант можно запускать агента под доменной учёткой, которая будет видна и SQL серверу и серверу, куда делается копия бекапа. Ну и про права на запись в каталог этой доменной учётке не забыть дать.
4. YannikAlx 27 03.10.18 18:19 Сейчас в теме
А еще лучше не копировать бэкапы, а сразу создавать необходимое количество зеркальных бекапов в нужные папки, если у вас не экспресс конечно
5. 24rus 126 04.10.18 04:52 Сейчас в теме
Сталкивался с таким вопросом, решить через powershell так и не удалось, в итоге сделал список шагов заданий : первыми заданиями создаем backup в каталог-темп, последним вызываем bat-ник, в котором прописано: создание новых папок, сжатия в архив bak-ов, и последующим перемещением в папки.
7. ice-net 19 09.10.18 10:20 Сейчас в теме
Отвечу сам же на свой вопрос:

выбираем тип шага CMDEXEC
cmd /C (ROBOCOPY "ПУТЬОТКУДА" "ПУТЬКУДА" *.bak /S /Z /MAXAGE:1 /R:1 /W:10 /XC /XX) ^& IF %ERRORLEVEL% LSS 8 EXIT /B 0
8. asrgroup 09.07.23 19:28 Сейчас в теме
Некропост, но истины ради
В начало скрипта powershell добавить строку "cd c:"
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот