Zielona ikona przy jobie SQL Server Agent nie wystarcza, aby uznać proces za bezpieczny.
Job może zakończyć się sukcesem, mimo że nie wykonał wszystkich kroków, uruchomił się z opóźnieniem albo działał znacznie dłużej niż zazwyczaj.
Co powinna wykrywać codzienna kontrola?
- joby zakończone błędem,
- joby anulowane,
- joby uruchomione z opóźnieniem,
- joby, które nadal działają,
- nietypowy czas wykonania,
- joby wyłączone,
- joby bez harmonogramu,
- joby bez powiadomienia.
Ostatni status wszystkich jobów
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| ;WITH LastExecution AS
(
SELECT
j.job_id,
j.name AS JobName,
h.run_status,
msdb.dbo.agent_datetime(h.run_date, h.run_time) AS RunDateTime,
h.run_duration,
h.message,
ROW_NUMBER() OVER
(
PARTITION BY j.job_id
ORDER BY h.instance_id DESC
) AS RowNumber
FROM msdb.dbo.sysjobs AS j
LEFT JOIN msdb.dbo.sysjobhistory AS h
ON j.job_id = h.job_id
AND h.step_id = 0
)
SELECT
JobName,
RunDateTime,
run_status,
run_duration,
message
FROM LastExecution
WHERE RowNumber = 1
ORDER BY JobName;
|
Joby zakończone błędem w ostatnich 24 godzinach
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| SELECT
j.name AS JobName,
msdb.dbo.agent_datetime(h.run_date, h.run_time) AS RunDateTime,
h.step_id,
h.step_name,
h.sql_severity,
h.sql_message_id,
h.message
FROM msdb.dbo.sysjobhistory AS h
INNER JOIN msdb.dbo.sysjobs AS j
ON h.job_id = j.job_id
WHERE h.run_status = 0
AND msdb.dbo.agent_datetime(h.run_date, h.run_time)
>= DATEADD(HOUR, -24, SYSDATETIME())
ORDER BY RunDateTime DESC, JobName, h.step_id;
|
Nie ograniczaj analizy tylko do step_id = 0. Szczegół kroku zwykle zawiera najważniejszą informację.
Aktualnie działające joby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| SELECT
j.name AS JobName,
ja.start_execution_date,
DATEDIFF(MINUTE, ja.start_execution_date, SYSDATETIME()) AS RunningMinutes,
ja.last_executed_step_id,
js.step_name AS LastExecutedStep
FROM msdb.dbo.sysjobactivity AS ja
INNER JOIN msdb.dbo.sysjobs AS j
ON ja.job_id = j.job_id
LEFT JOIN msdb.dbo.sysjobsteps AS js
ON ja.job_id = js.job_id
AND ja.last_executed_step_id = js.step_id
WHERE ja.session_id =
(
SELECT MAX(session_id)
FROM msdb.dbo.syssessions
)
AND ja.start_execution_date IS NOT NULL
AND ja.stop_execution_date IS NULL
ORDER BY RunningMinutes DESC;
|
Joby wyłączone
1
2
3
4
5
6
| SELECT
name AS JobName,
date_modified
FROM msdb.dbo.sysjobs
WHERE enabled = 0
ORDER BY name;
|
Każdy wyłączony job powinien mieć właściciela i uzasadnienie.
Codzienna checklista
- Czy którykolwiek job zakończył się błędem?
- Jaki był pierwszy błędny krok?
- Czy wystąpiły retry?
- Czy job nadal działa?
- Czy czas wykonania odbiega od normy?
- Czy wszystkie krytyczne joby wystartowały?
- Czy któryś job został wyłączony?
- Czy powiadomienia rzeczywiście działają?
- Czy błąd jest jednorazowy, czy powtarzalny?
- Czy zdarzenie wymaga aktualizacji dokumentacji?
Podsumowanie
Codzienna kontrola SQL Server Agent powinna być powtarzalną procedurą, a nie przeglądaniem zielonych i czerwonych ikon.
Spokojny DBA pyta:
Czy proces wykonał właściwą pracę, we właściwym czasie i czy dowiem się, gdy następnym razem tego nie zrobi?