Добрый день! Есть задание sql сервера, выполняется код powershell:
если его выполнять через задание 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 отрабатывает и копирует
Кто подскажет в чем дело? Или как еще можно заставить SQL после создания бэкапов сразу же копировать их во вне?
$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 после создания бэкапов сразу же копировать их во вне?
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
"Или как еще можно заставить 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"
- Создаете план обслуживания с несколькими шагами (в зависимости от того, что помимо бэкапа нужно делать). Вариант для бэкап+копирование во вне:
Шаг 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"
(2) Хотелось бы без "xp_cmdshell=1" и без использования внешних файлов
(3) с правами все ОК, явное указание файла копирования через powershell в задании отрабатывает агентом корректно.
(4) У Нас не экспресс, но мне не известно таких механизмов, где бэкап пишется 2 места зеркально, а не 1 файл бить на 2 части по разным путям. (вариант делать 2 раза бэкап не рассматривается)
(5) Через создание нового шага мне не понравилось, т.е. если редактировать план обслуживания - эти лишние шаги удаляются, решил просто сделать отдельное задание и прикрепил его в основное. А батник из вне тоже не очень хочется запускать по той причине, что его могут подменить или затереть код внутри, или самого затереть, или еще что..
(3) с правами все ОК, явное указание файла копирования через powershell в задании отрабатывает агентом корректно.
Copy-Item "D:\MSSQL\Backup\BUH_....._d\BUH_.......7597418.bak" -Destination "E:\Backup\" -Force
(4) У Нас не экспресс, но мне не известно таких механизмов, где бэкап пишется 2 места зеркально, а не 1 файл бить на 2 части по разным путям. (вариант делать 2 раза бэкап не рассматривается)
(5) Через создание нового шага мне не понравилось, т.е. если редактировать план обслуживания - эти лишние шаги удаляются, решил просто сделать отдельное задание и прикрепил его в основное. А батник из вне тоже не очень хочется запускать по той причине, что его могут подменить или затереть код внутри, или самого затереть, или еще что..
Раз копирование идёт на другую машину, а выполнение скрипта от локальной учётки NT Service\SQLSERVERAGENT, то как вариант можно запускать агента под доменной учёткой, которая будет видна и SQL серверу и серверу, куда делается копия бекапа. Ну и про права на запись в каталог этой доменной учётке не забыть дать.
Сталкивался с таким вопросом, решить через powershell так и не удалось, в итоге сделал список шагов заданий : первыми заданиями создаем backup в каталог-темп, последним вызываем bat-ник, в котором прописано: создание новых папок, сжатия в архив bak-ов, и последующим перемещением в папки.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот