Ошибка the request failed or the services did not respond in a timely fashion

MS SQL log

Добрый день! Уважаемые читатели и гости IT блога Pyatilistnik.org. В прошлый  мы с вами разобрались, что делать если выскакивает ошибка "This action is only valid for that are currently installed" и не удаляется антивирус Касперского. Там мы все успешно выполнили и сегодня поговорим про не менее интересный случай, который как показал интернет не сильно описан. Речь пойдет про устранение ошибки "The request failed or the services did not respond in a timely fashion" при попытке запустить службу SQL Server Agent. Давайте я покажу свой опыт, как я выкручивался в этой ситуации.

Описание проблемы с запуском SQL Server Agent

У меня есть большая инфраструктура физических и виртуальных серверов. В середине декабря началось плановое обслуживание, которое включает в себя одним из этапов установку обновлений безопасности. После перезагрузки сервера на нем появилась проблема, связанная с тем, что перестал запускаться SQL Server Agent. В результате этого не будут работать Jobs. Хорошо, что данный сервер находился в кластере Always On, но вопрос стал критичным. Всех пострадавших объединяло одно, в качестве операционной системы использовалась Windows Server 2022.

В оснастке "Службы" ошибка имела вот такой текст:

Error 1053: Windows could not start SQL Server Agent (MSSQLSERVER) service did not respond to the start control request in a timely fashion

С ошибкой Error 1053 мы уже встречали и успешно ее решали, я описавал эти методы, их можно будет опробовать если эта статья вам не поможет.

SQL error 1053

При попытке запуска службы через консоль "SQL Server 2022 Configuration Manager", была такая ошибка:

The request failed or the services did not respond in a timely fashion. Consult the event log or other applicable error logs for details.

The request failed or the services did not respond in a timely fashion

Если зайти в свойства службы и скопировать из нее строку запуска, открыть командную строку от имени администратора и выполнить это там, появляется вот такая ошибка, с нехваткой прав.

Служба MS SQL Agent

"C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Binn\SQLAGENT.EXE" -i MSSQLSERVER

Access is denied SQLAgent is exiting

Меня тут ожидала ошибка доступа "Access is denied SQLAgent is exiting", которая была настолько неинформативной, что еще раз напоминает мне, что Microsoft есть куда расти. Давайте разбираться, как диагностировать и устранять ошибку "The request failed or the services did not respond in a timely fashion".

Изучение логов при попытке запускать SQL Server Agent

Первое с чего всегда следует начинать, это изучить логи в системы. Откройте логи системы, журнал "Система (System)". Первое на что я обратил внимание, это ошибка с кодом ID 7000:

ID 7000 - The SQL Server Agent (MSSQLSERVER) service failed to start due to the following error:
The service did not respond to the start or control request in a timely fashion.

The SQL Server Agent (MSSQLSERVER) service failed to start due to the following error

Далее была ошибка, показывающая, что SQL Server Agent не смог запуститься по-заданному таймингу.

ID 7009: A timeout was reached (1572864 milliseconds) while waiting for the SQL Server Agent (MSSQLSERVER) service to connect.

A timeout was reached while waiting for the SQL Server Agent

ID 7034: The SQL Server Agent (MSSQLSERVER) service terminated unexpectedly. It has done this 3 time(s).

The SQL Server Agent (MSSQLSERVER) service terminated unexpectedly. It has done this 3 time(s).

Проверка прав на папку Log

Ошибка "Access is denied SQLAgent is exiting" очень расплывчатая и может вызываться по ряду причин, но будьте уверены, у вашей учетной записи из под которой запускается ваш MS SQL Agent, точно нехватает прав.

  • 1️⃣Первое, что вы можете попытаться сделать это запустить MS SQL Agent с определенными ключами, это поможет в некоторых случаях дать вам дополнительную информацию для траблшутинга. Запустите, как я описывал выше cmd от имени администратора и введите команду:

cd "C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Binn\SQLAGENT.EXE"

У вас может быть свой путь установки MS SQL. Тут мы переходим в данный каталог.

далее запустите

SQLAGENT.exe -i MSSQLSERVER -c -v

Приведу описание ключей: -i MSSQLSERVER имя экземпляра указываем в случае необходимости, -c это режим консоли, -v подробный режим. К сожалению, в моем случае, тут не появилось дополнительных ошибок

SQLAGENT.exe -i MSSQLSERVER -c -v

В некоторых случаях вы можете получить ошибки подобной этой:

Unable to rename C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Log\ to C:\Program Files\Microsoft SQL Server\MSSQL13.1 (reason: Access is denied)

Unable to rename MSSQL Log

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

Файл SQLAGENT.OUT в MS SQL Server используется для записи вывода и журнала событий агента SQL Server. Агент SQL Server является службой, которая отвечает за выполнение запланированных заданий, таких как резервное копирование баз данных, выполнение хранимых процедур и отправка уведомлений.

SQLAGENT.OUT содержит информацию о выполнении заданий агента SQL Server, включая успешное выполнение, ошибки и предупреждения. Файл может быть полезен для отслеживания и анализа выполнения заданий, а также для обнаружения проблем или ошибок. Обычно файл SQLAGENT.OUT находится в директории установки SQL Server и может быть просмотрен с помощью текстового редактора или инструментов анализа журналов SQL Server.

Другими словами ваша учетная запись агента SQL Server не может переименовать файл SQLAGENT.OUT в SQLAGENT.1.

  • 2️⃣Проверим в ACL присутствует ли данная учетная запись в явном виде или через членство в группе. Для этого выполните код:

$directoryPath = "C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Log"

$acl = Get-Acl -Path $directoryPath
$aceTable = @()

foreach ($ace in $acl.Access) {
$aceTable += [PSCustomObject]@{
Identity = $ace.IdentityReference
FileSystemRights = $ace.FileSystemRights
AccessControlType = $ace.AccessControlType
}
}

$aceTable | Format-Table -AutoSize

У меня права были, поэтому ошибка запуска MS SQL Agent "The request failed or the services did not respond in a timely fashion. Consult the event log or other applicable error logs for details" была не по этой причине.

PowerShell Просмотр ACL у папки

Если не хотите использовать PowerShell, то можете посмотреть через графический интерфейс, на вкладке "Безопасность".

Просмотр ACL у папки

При отсутствии прав, попытайтесь их выдать и проверить запуск сервиса.

  • 3️⃣Если это не помогло, то необходимо проверить правильность записи указывающей в реестре на путь к логам, для этого откройте "Редактор реестра" и перейдите по пути:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft \Microsoft SQL Server\MSSQL15.MSSQLSERVER\SQLServerAgent

или

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft \Microsoft SQL Server\MSSQL13.MSSQLSERVER\SQLServerAgent\ErrorLogFile

Удостоверьтесь, что в ключе ErrorLogFile у вас указан верный путь, если это не так, то обязательно поправьте и перезагрузите вашу систему, чтобы настройки вступили в силу.

Расположение SQLAGENT.OUT

  • 4️⃣Если ошибка доступа сохраняется, то проверьте еще настройки "Dump Directory".  Откройте оснастку  "SQL Server 2022 Configuration Manager" по пути "C:\Windows\SysWOW64\mmc.exe /32 C:\Windows\SysWOW64\SQLServerManager16.msc". Далее найдите там SQL Server Agent (MSSQLSERVER). Откройте его свойства, на вкладке "Advanced" найдите пункт "Dump Directory" и удостоверьтесь, что там указан правильный путь до папки логов.

Очень часто, тут бывает неправильный путь, после того, когда было перемещение системных баз данных в SQL Server. Не забудьте перезагрузить сервер после внесения изменений.

Dump Directory

К сожалению, у меня везде были правильные значения, поэтому я стал копать дальше.

Проверка прав на службу логов в Windows

С появлением Windows Server 2022 были усилены меры безопасности по разным направлениям. Так и я попал на эти нововведения. Существует компонент Event Log Service в Windows и отвечает он за запись и отображение системных событий, происходящих в операционной системе. Event Log Service позволяет отслеживать различные типы событий, такие как ошибки, предупреждения, информационные сообщения и аудиторские записи.

В старых версиях Windows вплоть до Windows Server 2019 существовала проблема, когда эта политика не соблюдалась строго. В результате учетная запись пользователя, которой этой политикой не предоставлен доступ на запись в журнал событий приложения, все равно может записывать в указанный журнал событий. В версиях Windows, выпущенных после Windows Server 2019, эта проблема исправлена. Таким образом, ограничение доступа к журналу событий приложения с помощью этой политики применяется правильно. В нашем случае это привело к тому, что агент SQL Server не запускается на Windows Server 2022.

В моем случае, в декабре как раз внедрялась политика по перенаправлению событий на сервера коллекторы, и в политике GPO эта опция была активирована. После перезагрузки сервера, в момент сервисного обслуживания, политика вступила в свои права и мы получили ошибку запуска агента MS SQL. При запуске службы агент SQL Server вызывает API Windows, чтобы зарегистрировать собственный источник событий в журнале событий приложения, что требует доступа к нему на запись. Поскольку агент SQL Server работает под учетной записью, которой политикой не предоставлен доступ на запись в журнал событий приложений, вызов API завершается неудачно, и агент SQL Server завершает работу из-за ошибки.

  • 1️⃣Чтобы проверить, что у вас похожая ситуация, я вам советую открыть командную строку от имени администратора и проверить результирующую политику применяющуюся к системе, где есть ошибка "Access is denied SQLAgent is exiting", для этого введите для создания отчета такую команду:

gpresult /scope:computer /f /h c:\temp\gp.html

Она создаст по пути c:\temp\gp.html файл, который можно проанализировать с помощью браузера.

Gpresult получение отчета

  • 2️⃣Далее вам нужно изучить данный отчет по пути:

Computer Details - Settings - Polices - Administrative Templates - Windows Components - Event Log Service- Application - Configure log access - Log Access

Тут я увидел текущий состав ACL, что опция активна и какая групповая политика это применила.

Configure log access

  • 3️⃣Следующим шагом вам нужно понять, будите вы добавлять в рамках текущей политики SID от группы безопасности Active Directory, куда входит данная учетная запись, от которой запускается агент MS SQL или же просто добавите его SID сюда. Если же вы понимаете, что данная опция вам не нужна в таком явном виде и вы хотите всем у кого есть права на систему разрешать работать со службой "Event Log Service", то можно отключить GPO и перенастроить на локальные настройки. Я покажу вам примеры всех этих шагов.
  • 4️⃣Если нужно отключить данную политику, то проверьте через оснастку как она применяется к системе. В моем случае была фильтрация GPO по группе безопасности, я просто удалил учетную запись сервера из группы, чтобы политика не считывалась.

Фильтрация GPO

Чистка тикета kerberos

  • 6️⃣Далее вам необходимо службу MS SQL Agent поставить в отложенный запуск и ОБЯЗАТЕЛЬНО перезагрузить сервер, инача так и будите получать ошибку 1053. После этого у вас все запуститься.

Отложенный запуск службы

  • 7️⃣Если же нужно оставить политику, путем добавления в ACL нужных учетных записей, то вам необходимо через редактор групповой политики открыть вашу GPO по пути:

Computer Details - Settings - Polices - Administrative Templates - Windows Components - Event Log Service- Application - Configure log access - Log Access

Далее в поле "Log Access" в самом конце вам нужно добавить SID группы или пользователя, которому нужны необходимые права.

Log Access

Напомню, что посмотреть SID группы можно вот такой командой:

$groupName = "название_группы"
$group = Get-ADGroup -Filter {Name -eq $groupName}
$groupSID = $group.SID
Write-Output $groupSID

В этом примере мы сначала сохраняем название группы в переменную $groupName. Затем мы используем команду Get-ADGroup для получения объекта группы Active Directory с заданным именем. После этого мы сохраняем SID группы в переменную $groupSID и выводим его на экран с помощью команды Write-Output.

Далее после внесения изменений в политику, ее нужно обновить на нужном хосте, проверив послее ее применения через перезагрузку, старт службы SQL Agent.

Дополнительная информация с помощью ProcessMonitor

Process Monitor (ProcMon) - это утилита для отслеживания активности процессов и операций файловой системы в операционной системе Windows. Она позволяет пользователю видеть все действия, выполняемые программами и системными службами, в режиме реального времени. ProcMon предоставляет подробную информацию о каждой операции, включая имя процесса, имя файла, тип операции, результат операции и многое другое. Это может быть полезно для отладки и анализа проблем с программами, поиска конфликтов или ошибок в системе.

Мы уже с помощью ProcMon выявляли дополнительную информацию в решении проблемы "Процесс IMJPDSVR.EXE грузит процессор" и "Software Reporter Tool грузит процессор на 100%"

Запускаете Process Monitor, удаляем старые записи через иконку "Корзины", далее нажмите значок пустого квадрата. Заранее откройте оснастку служб

ProcessMonitor

после этого запускаем сбор, заново через значок квадратика. Теперь пробуем несколько раз запустить службу MS SQL Agent, получаем те самые ошибки и останавливаем сбор. Далее сохраняем файл для дальнейшего изучения. По учолчанию он сохранится в папке с утилитой.

Logfile.PML

Нажмите на значок фильтра. Выберите "Process Name" "is" в качестве процесса SQLAGENT.EXE и "Include". Далее просто "Ok".

Фильтрация в Process Monitor

В результате у вас останутся событие сгенерируемые только процессом SQLAGENT.EXE, чтобы проще было изучит ьвсе события.

SQLAGENT.EXE в Process Monitor

Теперь остается кропотливое изучение строк, где будет указано на отсутствие доступа "Access is denied SQLAgent is exiting".

Как посмотреть и настроить Log Access через PowerShell

Тоже самое можно посмотреть и через PowerShell, сделав запрос в реестр:

$regPath = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\EventLog\Application"
$regValueName = "ChannelAccess"

$value = Get-ItemProperty -Path $regPath -Name $regValueName
$value.ChannelAccess

ChannelAccess

или

(Get-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\EventLog\Application").ChannelAccess

Для добавления нужного SID выполните:

$channelAccess = (Get-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\EventLog\Application").ChannelAccess
$channelAccess += ",(A;;0x1;;;S-1-5-21-117609710-1390067357-725345543-29616)"
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\EventLog\Application" -Name ChannelAccess -Value $channelAccess

Исправление Access is denied SQLAgent is exiting через PowerShell

На этом у меня все, надеюсь что вам удалось запустить вашу службу MS SQL Agent и работа восстановлена. С вами был Иван Сёмин, автор и создатель IT портала Pyatilistnik.org.

Оцените статью
Настройка серверов windows и linux
Добавить комментарий