Wenn Jobs nicht tun, was sie sollen
SQL Agent Jobs sind praktisch.
Sie sichern, verschieben, berechnen, löschen.
Aber wenn einer hängt oder fehlschlägt, fällt’s oft erst Tage später auf.
Du brauchst ein Auge drauf.
Und wenn was schiefgeht: eine saubere Analyse.
Sonst bleibt der Fehler zyklisch.
Schritt 1: Fehlerhafte Jobs erkennen
SELECT
j.name AS job_name,
h.run_date,
h.run_time,
h.run_duration,
h.message
FROM msdb.dbo.sysjobhistory h
JOIN msdb.dbo.sysjobs j ON h.job_id = j.job_id
WHERE h.run_status = 0 -- 0 = Fehler
AND h.step_id > 0
ORDER BY h.run_date DESC, h.run_time DESC;
Damit siehst Du, welcher Step wann versagt hat.
Die Spalte message
zeigt den konkreten Fehler.
Schritt 2: Letzten Status aller Jobs prüfen
SELECT
j.name,
js.last_run_outcome,
js.last_run_date,
js.last_run_time,
js.last_outcome_message
FROM msdb.dbo.sysjobs j
JOIN msdb.dbo.sysjobservers js ON j.job_id = js.job_id;
last_run_outcome | Bedeutung |
---|---|
0 | Fehler |
1 | Erfolg |
3 | Abgebrochen |
5 | Unbekannt |
Damit bekommst Du eine saubere Übersicht über den aktuellen Zustand.
Schritt 3: Häufige Fehlerursachen
Fehlerbild | Mögliche Ursache |
---|---|
Step bleibt stehen | Hängt in SSIS oder wartet auf Timeout |
Rückgabewert <> 0 | PowerShell/Batch-Fehler, falsche Exit-Codes |
Zugriff verweigert | Rechte fehlen für Datei oder Login |
Deadlock | konkurrierender Zugriff |
„Login failed“ | SQL Auth + Passwort abgelaufen |
„Job owner missing“ | User gelöscht, Job hat keinen Besitzer |
Tipp: Owner immer auf sa
setzen. Nicht auf AD-Accounts.
EXEC msdb.dbo.sp_update_job
@job_name = 'DeinJob',
@owner_login_name = 'sa';
Schritt 4: Wiederholende Fehler früh erkennen
SELECT
j.name, COUNT(*) AS fehleranzahl
FROM msdb.dbo.sysjobhistory h
JOIN msdb.dbo.sysjobs j ON h.job_id = j.job_id
WHERE h.run_status = 0
AND h.run_date >= CONVERT(INT, FORMAT(DATEADD(DAY, -7, GETDATE()), 'yyyyMMdd'))
GROUP BY j.name
ORDER BY fehleranzahl DESC;
Damit findest Du die „Serientäter“.
Die sollten zuerst stabilisiert werden.
Schritt 5: Stabilisierung
Typische Maßnahmen:
- Retry-Zähler setzen:
EXEC msdb.dbo.sp_update_jobstep
@job_name = 'DeinJob',
@step_id = 1,
@retry_attempts = 3,
@retry_interval = 5; -- Minuten
- Logging ergänzen (z. B.
PRINT
,RAISERROR
, Output-Datei) - lange Schritte in kleinere aufteilen
- Parameter prüfen: keine harten Pfade, keine Zeitdifferenzen
- Aufruf per Proxy-Login, wenn Rechte fehlen
- Rückgabewerte abfangen in PowerShell/Batch
Beispiel PowerShell im Jobstep:
try {
# dein Script
exit 0
} catch {
Write-Error $_.Exception.Message
exit 1
}
Schritt 6: Alert per Mail
EXEC msdb.dbo.sp_add_alert
@name = 'Job Failure Alert',
@message_id = 0,
@severity = 16,
@notification_message = 'Ein SQL Agent Job ist fehlgeschlagen.',
@job_name = NULL,
@enabled = 1;
EXEC msdb.dbo.sp_add_notification
@alert_name = 'Job Failure Alert',
@operator_name = 'DBA-Team',
@notification_method = 1; -- E-Mail
Damit bekommst Du’s sofort mit.
Mein Fazit
SQL Agent Jobs sind oft unterschätzt.
Sie laufen leise im Hintergrund – bis sie’s nicht mehr tun.
Wenn Du regelmäßig prüfst, sauber protokollierst und Alerts setzt, sparst Du Dir viel Ärger.
No responses yet