Uitgebreide jobhistorie opvragen

Binnen SQL Server wordt gebruik gemaakt van jobs om onder andere de backups en het databaseonderhoud geautomatiseerd te verzorgen.
Van al deze jobs kun je de historie opvragen binnen de eigenschappen van die job.
In dit artikel leg ik uit hoe je die jobhistorie kunt bekijken, met name als die erg lang is en/of niet goed leesbaar.

In onderstaand voorbeeld zie je de job die backups van de systemdatabases maakt. Als je ook de scripts van Ola Hallengren hebt geïnstalleerd dan komt dit je bekend voor. Je kunt natuurlijk ook je eigen job als voorbeeld gebruiken.

Vraag de eigenschappen op van de job ‘DatabaseBackup – SYSTEM_DATABASES – FULL’:

Klik op ‘View Job History’.
Klik op het plusje bij het tijdstip van de run die je wilt controleren om de step-details te openen:

Onderaan zie je de details van de run. Zeker bij gebruik van de scripts van Ola heb je uitgebreide logging, maar dit is soms niet goed uit te lezen in de jobhistory omdat de tekst te lang is.
Ola geeft standaard de optie om de historie-details weg te schrijven in een logfile en daarvan maak ik dankbaar gebruik.
Soms echter ben ik bij een klant waar ik geen toegang heb tot het OS, en moet ik een andere manier vinden om deze belangrijke info te kunnen lezen. Gelukkig kan dat, maar daarvoor moet je de job aanpassen.

Open de job die je wilt aanpassen:

Klik ‘Steps’

Selecteer de gewenste job-step en klik op Edit (of dubbelklik op de job-step) om de eigenschappen te openen:

Klik op ‘Advanced’

Plaats vinkjes bij ‘Log to table’ en ‘Append output to existing entry in table’
Deze laatste optie is nodig bij jobs met meerdere steps om de historie van alle steps te bewaren (en niet alleen die van de laatste).
Klik OK en bewaar je wijzigingen in de job.
Done!

Nu het leuke, opvragen van de historie.
Dat is eenvoudig te doen met een query. Er is natuurlijk pas data te zien als de job gerund heeft, wacht dus even tot dat gedaan is.

select * from msdb.dbo.sysjobstepslogs
order by log_id desc

Zoek de log_id van de run die je wilt bekijken en kopieer die.
Pas de output van het queryscherm aan zodat die geen tabel geeft (‘results to grid’) maar een tekst (‘results to text’), dat kan onder andere via CTRL+T.
Voer daarna de volgende query uit:

select log_id, [log] from msdb.dbo.sysjobstepslogs
where log_id=<gekopieerde log_id>
order by log_id desc

Soms is dit niet genoeg om alle tekst weer te geven; results to text geeft bij default maximaal 256 karakters weer.
Dit kun je aanpassen naar de maximale waarde van 8192 in de query-opties:
Klik in het hoofdmenu van SSMS op ‘Query’ en dan onderaan op ‘Query Options’:

Pas de aangeven waarde onderaan aan naar de maximale waarde van  8192.
Wil je deze waarde voortaan voor alle queries gebruiken, stel het dan in via ‘Tools’ in de menubalk en dan ‘Options’:

Soms zijn ook deze 8192 karakters niet voldoende. Dan is er nog een methode waarbij je de output kunt exporteren naar een andere lokatie, bijvoorbeeld de harddisk op de machine waar je SSMS gestart hebt.
Daarvoor gebruiken we de import-export wizard.
Klik met de rechter muisknop (bijvoorbeeld) op de MSDB-database waar alle jobhistorie wordt bewaard:

Selecteer ‘Tasks’, ‘Export Data…’

Selecteer als bron ‘SQL Server Native Client’ (onderaan meestal) en klik ‘Next’

Selecteer bij ‘Destination’ een ‘Flat File Destination’ en geef een bestandsnaam op.
Vergeet niet de vinkjes aan resp. uit te zetten bij ‘Unicode’ en ‘Column names in the first datarow’.
Klik ‘Next’

Selecteer ‘Write a query…..’ en klik ‘Next’.

Vul de eerder gebruikte query in en klik ‘Next’.

Klik ‘Finish’
De export wordt nu uitgevoerd:

Het resultaat is te vinden in het bestand dat je als ‘Destination’ hebt aangegeven.

Veel succes!