Lire les journaux d'erreur avec TSQL

Un des problèmes que l'on rencontre fréquemment est d'avoir un journal d'erreur (l'errorlog SQL Server) très volumineux.

Il devient alors très difficile de le l'analyser dans la pauvre interface de Management Studio.

Le meilleur moyen dans ce cas consiste à le charger dans une table, ce qui va nous permettre de faire des recherches à l'aide de requêtes SQL : nous travaillons avec SQL Server, après tout !

Voyons comment faire...

SQL Server nous offre pour ce faire, depuis la version 2005, une procédure stockée système non documentée : sp_readerrorlog.

En fouillant un peu, vous verrez qu'elle fait directement appel à la procédure stockée étendue xp_readerrorlog, donc autant utiliser directement celle-ci...

xp_readerrorlog prend 6 paramètres :

  • Une valeur qui indique le journal que vous voulez lire : 0 = le journal courant, 1 = l'archive #1, 2 = l'archive #2, etc..
  • Une valeur qui indique le type de journal : 1 ou NULL pour l'errorlog SQL Server, 2 pour le journal de l'agent SQL Server
  • Une chaîne unicode : la chaîne de caractère que vous cherchez dans le journal. Important : n'oubliez pas de mettre le N devant pour indiquer l'unicode !
  • Une deuxième chaîne unicode : pour affiner la recherche
  • Une valeur datetime : pour ne lire qu'à partir de cette borne
  • Une deuxième valeur datetime : pour ne lire que jusqu'à cette borne

Par exemple nous cherchons dans l'errorlog courant les sauvegardes effectuées de la base AdventureWorks entre le 10 janvier (4h00) et le 15 janvier (5h00)

EXEC xp_readerrorlog 0,1,N'Database backed up'
  ,N'AdventureWorks'
  ,'2019-01-10T04:00:00.000','2019-01-15:05:00:00.000'

Plus simplement, nous pouvons nous passer de certains paramètres : xp_readerrorlog tilisé tout seul nous renvoit le journal courant en entier

EXEC xp_readerrorlog 

ou avec seulement les premiers paramètres, pour lire par exemple la première archive

EXEC xp_readerrorlog 1,1

Pour charger ce que renvoie cette procédure dans une table, il suffit de créer la table et d'insérer !

CREATE TABLE dbo.#LogRecords
    (
        EventTime datetime,
        MetaText varchar(128),
        Message nvarchar(max),
        ID int identity(1,1) PRIMARY KEY CLUSTERED
    )

INSERT #LogRecords (EventTime, MetaText, Message) EXEC xp_readerrorlog 0, 1;

Une autre procédure système nous est utile pour connaître le nombre d'archives à lire (dans SSMS, vous pouvez modifier le nombre d'archives que SQL Server conserve, au lieu des 6 par défaut) : la procédure sp_enumerrorlogs nous retourne la liste des fichiers journaux, avec leur date et leur taille de fichier.

Je vous propose de télécharger le script que  vous trouverez sur la page "script center" de mon site mssql.fr (profitez-en pour vous informer sur mssql.fr) : il effectue le chargement dans une table de tous les errorlogs et vous en présente les enregistrements par date décroissante.

Et n'oubliez pas de recycler de temps en temps votre errorlog lorsqu'il devient trop volumineux, avec la procédure stockée sp_cycle_errorlog...