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_outcomeBedeutung
0Fehler
1Erfolg
3Abgebrochen
5Unbekannt

Damit bekommst Du eine saubere Übersicht über den aktuellen Zustand.

Schritt 3: Häufige Fehlerursachen

FehlerbildMögliche Ursache
Step bleibt stehenHängt in SSIS oder wartet auf Timeout
Rückgabewert <> 0PowerShell/Batch-Fehler, falsche Exit-Codes
Zugriff verweigertRechte fehlen für Datei oder Login
Deadlockkonkurrierender 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.

Tags:

No responses yet

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert