Fehlerprotokoll

Die Seite Fehlerprotokoll liest das SQL Server-Fehlerprotokoll — und auf derselben Seite das SQL Server Agent-Protokoll — direkt von der überwachten Instanz. Es wird nichts in die Monitoring-Datenbank kopiert: SQL Server verwaltet und rotiert diese Dateien bereits selbst, eine zweite Kopie wäre nur eine zweite Sache, die abweichen kann.

Was die Stufen bedeuten

Jede Zeile wird beim Lesen eingestuft, damit Sie zum Wesentlichen springen können statt zu scrollen. Die Einstufung nutzt zwei Signale und nimmt jeweils das schwerwiegendere.

Stufe Bedeutung
Kritisch Schweregrad 20+, Stack Dumps, Non-Yielding Scheduler, Korruption (Fehler 823/824), ein DBCC CHECKDB mit gefundenen Fehlern. Jemanden wecken.
Fehler Schweregrad 17–19, fehlgeschlagene Sicherungen (Fehler 3041), volles Transaktionsprotokoll (9002), Betriebssystem-E/A-Fehler. Etwas hat nicht funktioniert.
Warnung Schweregrad 11–16, fehlgeschlagene Anmeldungen (18456), E/A länger als 15 Sekunden, ausgelagerter Prozessspeicher. Ansehen, aber kein Notfall.
Information Start- und Wiederherstellungsmeldungen, erfolgreiche Sicherungen, Konfigurationsänderungen. Der Großteil der Datei.

Der Schweregrad allein wäre irreführend: Eine fehlgeschlagene Sicherung wird mit Schweregrad 16 protokolliert, was die Schweregradtabelle als bloße Warnung einstuft. Daher wird auch der Meldungstext ausgewertet — und das schwerwiegendere der beiden Signale gilt.

Große Protokolle effizient lesen

Zeitraum und beide Suchfelder werden innerhalb von SQL Server angewendet, nicht im Browser. Eine engere Abfrage ist also tatsächlich günstiger und überträgt den Rest der Datei gar nicht erst. Die beiden Suchfelder werden UND-verknüpft: Login failed zusammen mit sa findet nur fehlgeschlagene Anmeldungen dieses Kontos.

Es werden höchstens die neuesten 2 000 passenden Zeilen angezeigt. Wird diese Grenze erreicht, sagt die Seite das ausdrücklich — ein stillschweigend abgeschnittenes Protokoll ist schlimmer als gar keines.

Zwei Ansichten, zwei Fragen

Die Auswahl Ansicht schaltet um:

  • Live vom Server liest die Datei auf der Instanz. Sekundenaktuell, ungefiltert — und beim nächsten Dienstneustart weg.
  • Archiviert (gesammelt) liest, was der Monitor aufbewahrt hat. Ein Hintergrunddienst kopiert alle paar Minuten jede Zeile ab der konfigurierten Stufe in die Monitoring-Datenbank. Diese Ansicht reicht damit über Dienstneustarts hinaus zurück und über so viele Protokolldateien, wie SQL Server seither rotiert hat.

Keine ersetzt die andere. Der Live-Ansicht vertrauen Sie bei etwas, das gerade passiert; die archivierte Ansicht ist die einzige, die „Was hat dieser Server vor drei Wochen gemeldet?" beantworten kann.

Das Abzeichen neben der Tabellenüberschrift sagt, ob das Sammeln überhaupt funktioniert — harvested 4 min ago, not harvested yet oder harvest failing samt Grund. Eine leere Tabelle unter einem roten Abzeichen bedeutet, dass niemand das Protokoll lesen konnte — eine völlig andere Aussage als ein ruhiger Server.

Alarme

Gesammelte Einträge ab der Alarmstufe (Standard Error) lösen einen Alarm über die normale Alarmierung aus: Severity-Routing, Benachrichtigungskanäle, Wartungsfenster und Quittierung verhalten sich wie bei jedem anderen Alarm.

Zwei bewusste Verhaltensweisen:

  • Ein Alarm pro Stufe pro Schub, nicht einer pro Zeile. Ein Stack Dump sind ein Dutzend Zeilen in einer Sekunde; ein Dutzend Meldungen für einen Vorfall ist der schnellste Weg, eine Rufbereitschaft dazu zu bringen, das Produkt stummzuschalten. Der Alarm trägt die schwerwiegendste Zeile als Beispiel und die Anzahl der Vorkommen.
  • Der erste Durchlauf pro Server speichert nichts. Er merkt sich nur den Stand. Monitoring einzuschalten darf nicht Wochen an Historie importieren und dann wegen eines Neustarts aus dem Juli jemanden alarmieren.

Pro Server werden automatisch zwei Regeln angelegt, Error log: Error und Error log: Critical — so lässt sich Critical an PagerDuty und Error an E-Mail routen, oder eines von beiden abschalten. Es sind gewöhnliche Regeln unter /settings/alerts.

Fehlerprotokoll-Alarme beschreiben einen Zeitpunkt, keinen Zustand, und lösen sich daher nicht von selbst auf. Quittieren Sie sie, sobald Sie sich darum gekümmert haben.

Was ein kritisches Ereignis mitbringt

Ein Klick auf eine gesammelte Zeile öffnet die Detailansicht. Bei kritischen Einträgen enthält sie zwei Dinge, die die Tabelle nicht zeigen kann.

Die umliegenden Protokollzeilen. Derselbe Stufenfilter, der die Tabelle lesbar hält, verwirft die Zeilen, die ein kritisches Ereignis erklären — ein Stack Dump behält seine Kopfzeile Stack Dump being sent to ... und verliert Input Buffer 255 bytes - SELECT ..., also die Anweisung, die ihn ausgelöst hat. Bei einem Critical liest der Monitor deshalb ein paar Minuten davor und danach ungefiltert nach und speichert diesen Block am Ereignis. Die Zeile des Ereignisses ist darin hervorgehoben.

Ist die Instanz zwischendurch neu gestartet, hat das Protokoll bereits rotiert und der Block ist nicht mehr zu retten. Die Ansicht sagt das, statt ein leeres Feld zu zeigen — und sie unterscheidet diesen Fall von einem Lesefehler wegen fehlender Rechte, denn das eine liegt am Server und das andere an uns.

Was sonst noch los war. Eine Zeitleiste alles bereits Erfassten im Umkreis von ±15 Minuten: Konfigurations- und DDL-Änderungen, Deadlocks, Blocking-Ketten, andere Alarme, dazu CPU, Speicher und Verbindungen aus der nächstgelegenen Messung. Jeder Eintrag ist relativ zum Ereignis angegeben — −3 min davor, +40 s danach —, denn genau danach wird gefragt. Dafür geht keine einzige zusätzliche Abfrage an den überwachten Server: Es sind Daten, die das Produkt längst aufgeschrieben hatte, nur nie neben das Ereignis gestellt hat.

Archivierte Protokolle

SQL Server beginnt bei jedem Dienstneustart und bei jedem sp_cycle_errorlog eine neue Protokolldatei und behält standardmäßig sechs Archive. Die Auswahl Datei zeigt, was aktuell auf der Platte liegt. Für mehr Historie erhöhen Sie die Anzahl der aufbewahrten Protokolle im SQL Server Management Studio (Verwaltung → SQL Server-Protokolle → Konfigurieren).

Berechtigungen

Das Lesen des Protokolls erfordert zwei Berechtigungen, die in den üblichen Monitoring-Rechten nicht enthalten sind. Beide Prozeduren liegen in master, der Login braucht dort also auch einen Benutzer — dieser Schritt wird am häufigsten übersehen:

-- Auf jeder überwachten Instanz, als sysadmin:
USE master;
CREATE USER [monitoring_login] FOR LOGIN [monitoring_login];   -- nötig: die Prozeduren liegen in master
GRANT EXECUTE ON sys.xp_readerrorlog  TO [monitoring_login];   -- Protokoll lesen
GRANT EXECUTE ON sys.xp_enumerrorlogs TO [monitoring_login];   -- Archive auflisten

Mitgliedschaft in securityadmin funktioniert ebenfalls, gewährt aber weit mehr als nötig — damit lassen sich Logins anlegen und Kennwörter zurücksetzen. Nehmen Sie die zwei Grants.

Die Wrapper sp_readerrorlog und sp_enumerrorlogs funktionieren mit den schmalen Grants nicht: Sie enthalten eine interne securityadmin-Prüfung. Der Monitor ruft deshalb direkt die zugrunde liegenden erweiterten Prozeduren auf.

Fehlt die Berechtigung, nennt die Seite genau die nötigen Grants, statt ein leeres Protokoll zu zeigen — ein leeres und ein unlesbares Protokoll sind sehr verschiedene Aussagen über einen Server.

Azure SQL-Datenbank

Dort gibt es kein Fehlerprotokoll auf Instanzebene. Die Seite sagt das, statt mit einem Fehler abzubrechen. Managed Instance und lokale Instanzen funktionieren normal.