Microsoft SQL Server: Kaputte Jobs im SQL Server Agent – wie ich fehlgeschlagene Jobs finde und dauerhaft stabilisiere

Wenn Jobs/“>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.

Kategorien:

Schlagwörter: