В этой короткой статье я приведу пример одного случая из моей практики по Service Manager. Конкретно про задания сервера хранения данных Service Manager. У одного из наших клиентов задание MPSyncJob завершилось с ошибкой и повторный его запуск с консоли или командлет никакого результата не приносил. Поэтому в этой публикации я кратко покажу, как выполнить перезапуск повисшего задания сервера хранения данных Service Manager.
Честно, я не смог воспроизвести у себя именно эту проблему, но решил все же сделать себе небольшую шпаргалку – вдруг пригодится.
Симптомы
Одно из заданий сервера хранения данных не завершалось успешно. В моей случае это было задание MPSyncJob. У ряда пакетов управления не были завершены связи. Ручной запуск задания ни к чему не приводил – даже дата последнего запуска задания не обновлялась. Стало понятно, что с заданием что-то не так.
В базе знаний Microsoft я наткнулся на детальной реководство по решению проблем с заданиями сервера хранения данных. Именно его я буду использовать в качестве основы.
Перезапуск повисшего задания
Перезапуск повисшего задания можно выполнить через запросы к базе данных и ряд командлетов PowerShell. Теперь по порядку:
1. На сервере управления выполните следующие командлеты в модуле PoserShell для Service Manager для того, чтобы импортировать модуль для работы с сервером хранения данных и получить перечень заданий сервера хранения данных.
import-module (((Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\System Center\2010\Common\Setup").InstallDirectory)+ "Microsoft.EnterpriseManagement.Warehouse.Cmdlets.psd1")
$jobs = Get-SCDWJob -ComputerName scsmdw01
$jobs | ft -autosize
Параметр ComputerName – это имя сервера хранения данных.
Здесь в списке заданий мы должны увидеть нашу проблемное задание. Повторюсь, что я не смог на своем тестовом стенде воспроизвести проблему, но я могу воспроизвести ход решения.
2. Теперь необходимо отключить все задания сервера хранения данных:
foreach($job in $jobs){Disable-SCDWJobSchedule -jobname $job.name -ComputerName scsmdw01}; Get-SCDWJobSchedule -ComputerName scsmdw01 | ft -autosize
3. Теперь необходимо дождаться пока все задания завершат свою работу. По крайней мере те, которые могут завершить работу штатно.
Get-SCDWJob -ComputerName scsmdw01
4. На сервере хранения данных останавливаем службу Microsoft Monitoring Agent и переименовываем папку с кэшэм агента наблюдения:
Stop-Service -Name HealthService
$dir = Get-ItemProperty -path "HKLM:\SOFTWARE\Microsoft\System Center\2010\Common\Setup"
$oldname = $dir.installdirectory + "Health Service State"
$newname = $dir.installdirectory + "Health Service State.old"
Rename-Item -Path $oldname -NewName $newname
5. Теперь нам необходимо выяснить BatchId проблемного задания:
Get-SCDWJob -ComputerName scsmdw01
В моем случае для работы MPSyncJob BatchId – 2944.
6. Теперь выполним следующий SQL запрос к базе данных:
USE DWStagingAndConfig
UPDATE Infra.WorkItem SET StatusId = 6 WHERE BatchId = '2944'
UPDATE Infra.Batch SET StatusId = 6 WHERE BatchId = '2944'
В BatchId указываем ID задания из п. 5.
7. Создадим новое задание через SQL запрос:
USE DWStagingAndConfig
EXEC Infra.CreateBatch 'MPSyncJob'
В качестве параметра передаем имя задания. В моем случае – MPSyncJob.
8. Теперь мы должны увидеть новый BatchID для нашего задания:
Get-SCDWJob -ComputerName scsmdw01
9. Если в базе данных остались какие-то блокировки, то их необходимо удалить. Проверяем наличие блокировок следующим SQL запросом:
USE DWStagingAndConfig
SELECT * FROM LockDetails
Если какие-то блокировки есть, то удаляем из следующим SQL запросом:
USE DWStagingAndConfig
EXEC dbo.ReleaseLock
@ResourceName = '<ResourceName>',
@LockRequester = '<LockRequester>'
Параметры ResourceName и LockRequester вы сможете взять из первого запроса, который выводит полный перечень блокировок.
Необходимо удалить все блокировки.
10. На сервере хранения данных запускаем службу Microsoft Monitoring Agent:
Start-Service -Name HealthService
11. Запускаем автоматический запуск заданий сервера хранения данных:
foreach($job in $jobs){Enable-SCDWJobSchedule -jobname $job.name -ComputerName scsmdw01 };
Get-SCDWJobSchedule -ComputerName scsmdw01 | ft -autosize
12. Теперь запуск проблемного задания должен завершаться успешно:
Start-SCDWJob -jobname MPSyncJob -ComputerName scsmdw01
А самое главное, что перезапуск повисшего задания методом, который я привел выше позволил заданию корректно завершить работу.