Определите отсутствующие задания агента на вторичных репликах - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь настроить процесс, который будет проверять задания агентов на всех серверах в группе доступности и сообщать обо всех, которые могут отсутствовать во вторичных репликах.

У меня есть настройка CMS со всеми серверами изAG и может выполнять запрос заданий агента через реплики, но я хочу только вернуть задания, которые есть на некоторых серверах, но не на всех.

Я написал запрос, чтобы получить эту информацию с помощью COUNT (), но поскольку результаты запроса группируются по серверу, это не работает.Я также попытался поместить результаты во временную таблицу, чтобы посмотреть, поможет ли это, но, похоже, это не имеет большого значения.

В AG есть четыре сервера, и следующий запрос должен возвращать имена всех заданий, которые находятся не на всех четырех серверах, но, поскольку он, похоже, тоже возвращает имя сервера, он не распознает их какодно и то же задание.

CREATE TABLE #jobs (
    JobName NVARCHAR(128))

INSERT INTO #jobs
SELECT name JobName
FROM sysjobs 

SELECT * 
FROM #jobs
GROUP BY JobName
HAVING COUNT(*) < 4
ORDER BY JobName

DROP TABLE #jobs

Запрос в том виде, в котором он существует, выдает набор результатов, например ниже:

+------------+------------------------------------------+
| ServerName |                 JobName                  |
+------------+------------------------------------------+
| ServerA    | DBA DatabaseBackup - AG_DATABASES - FULL |
| ServerA    | OutputFile Cleanup                       |
| ServerB    | DBA DatabaseBackup - AG_DATABASES - FULL |
| ServerB    | IndexOptimize - USER_DATABASES           |
| ServerC    | DBA DatabaseBackup - AG_DATABASES - FULL |
| ServerB    | IndexOptimize - USER_DATABASES           |
| ServerD    | DBA DatabaseBackup - AG_DATABASES - FULL |
| ServerD    | Output File Cleanup                      |
+------------+------------------------------------------+

Задание DBA DatabaseBackup - AG_DATABASES - FULL существует для всех четырех серверовпоэтому я не хочу, чтобы это возвращалось, но из-за неявного столбца servername, который исходит из соединения CMS, он не распознает их как одно и то же значение.

Ответы [ 5 ]

0 голосов
/ 29 января 2019

Мне удалось обойти это по-другому.Теперь я настроил таблицу на своем сервере CMS, и у меня есть хранимая процедура, которая будет заполнять таблицу сведениями о заданиях агента со всех серверов в AG.Оттуда я могу выполнить следующий запрос, и он работает как шарм:

SELECT ServerName
       ,JobName
FROM AgentJobs
WHERE JobName IN(
                    SELECT JobName
                    FROM AgentJobs
                    WHERE JobCategory = 'Production'
                    GROUP BY JobName
                    HAVING COUNT(*) < 4)
0 голосов
/ 25 января 2019

Вы можете использовать функцию STUFF (), чтобы поместить все имена серверов в один столбец и считать только имена заданий.

SELECT JobName, STUFF((
    SELECT ',' + CAST([ServerName] AS VARCHAR(MAX)) 
    FROM sysjobs 
    WHERE results.JobNames = sysjobs.JobNames
    FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)')
  ,1,1,'') AS ServerNames 
FROM #jobs results
GROUP BY JobName
HAVING COUNT(*) < 4
ORDER BY JobName
0 голосов
/ 24 января 2019

Если ваша CMS всегда вставляет имя сервера, за которым следует имя задания, разделенное дефисом, разделенным пробелами ... вы можете разобрать имена серверов примерно так:

INSERT INTO #jobs
SELECT REPLACE(SUBSTRING(name, CHARINDEX(' - ', name),LEN(name)) , ' - ', '') JobName
FROM sysjobs 
0 голосов
/ 24 января 2019

Как уже упоминалось в GMB, вам нужно будет извлечь часть поля "name".

Я предлагаю разделить строку на ServerName и JobName.

Предполагая, что имя разделяется - как вваш пример ваш код может выглядеть следующим образом.

CREATE TABLE #jobs (
ServerName NVARCHAR(128)    
,JobName NVARCHAR(128))

INSERT INTO #jobs
SELECT 
LEFT(name,CHARINDEX('-',name)-1) AS ServerName --Takes the Part left of the first -
, RIGHT(name,LEN(name) - CHARINDEX('-',name)) AS JobName --Takes the Part right of the first -
FROM sysjobs 

SELECT JobName 
FROM #jobs
GROUP BY JobName
HAVING COUNT(*) < 4
ORDER BY JobName

DROP TABLE #jobs
0 голосов
/ 07 декабря 2018

Итак, запрос, который возвращает все JobName, которые имеют менее 4 записей.Нет смысла создавать временную таблицу, просто запросите таблицу sysjobs, например:

SELECT name  
FROM sysjobs
GROUP BY name
HAVING COUNT(*) < 4
ORDER BY name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...