Wie kann SQL Profiler Trace nachts zu einer bestimmten Zeit ausgeführt werden?

Wie führe ich den SQL Profiler Trace aus, wenn ein Problem von 3:00 bis 3:30 Uhr morgens behoben werden muss? Dies kann mithilfe einer serverseitigen Ablaufverfolgung erfolgen, dies ist jedoch äußerst unpraktisch. Es ist nicht schwierig, aber unangenehm und immer faul. Schließlich habe ich beschlossen, dies ein für alle Mal zu automatisieren. So:



Jenkins ist hier übrigens völlig optional und dient nur als Schnittstelle zum Aufrufen eines Skripts mit den erforderlichen Parametern:



Ich werde die Lösung in großen Zügen zeigen, trotzdem gibt es viele Besonderheiten, die speziell mit unserer Infrastruktur zusammenhängen. Das heißt, ich werde das tun, was links gezeigt wird:



Die bat-Datei führt also etwas aus und überträgt die Aktion bereits an das PowerShell-Skript, an das sie alle von Jenkins empfangenen Parameter und zwei weitere Variablen - '% BUILD_USER_ID%', '% BUILD_USER_EMAIL%' - übergibt. Sie werden uns später nützlich sein:



Seltsamerweise passiert in ps1 selbst wenig wirklich sehr Wertvolles: Dort wird eine bestimmte Prozedur aufgerufen, die den Namen des Verzeichnisses auf einer speziellen Freigabe anhand des Servernamens erstellt und zurückgibt, auf dem diese Datei abgelegt wird. Der Server, auf dem dieses Verzeichnis erstellt wird, hängt vom Datencenter ab, auf dem sich der Server befindet, auf dem die Ablaufverfolgung gestartet wird. Darüber hinaus hat der Benutzer das Recht, den Trace zu lesen, und es gibt einen Prozess, der diese Verzeichnisse in wenigen Tagen bereinigt. Wie Sie sehen können, benötigen Sie dies möglicherweise nicht und können dies alles sicher überspringen.

Jetzt wird die Aktion bereits in der SQL-Datei auf den Server übertragen, auf dem der Trace gestartet wird. loc ist nur ein Parameter, der den Pfad enthält, in den die fertige Ablaufverfolgung kopiert wird. Sie können es durch eine Konstante ersetzen.



Zuerst müssen wir einen Ort finden, an dem wir die Trace-Datei lokal schreiben. Zum Beispiel so:



Als nächstes eine kleine Reinigung. Plötzlich existiert eine solche Datei bereits oder hat jemand die Ablaufverfolgung früher ausgeführt? Sie müssen sys.traces ausführen und das Trace-Schreiben in% jenkinsTraceSch% stoppen / löschen, falls bereits eines vorhanden ist. Erstellen Sie als Nächstes eine Ablaufverfolgung (begrenzen Sie deren Größe!) Und ein wenig Langeweile bei sp_trace_setevent-Aufrufen. Sie können Ihr Leben einfacher machen, indem Sie CROSS JOIN zwischen Ereignissen und Spalten erstellen:



Fügen Sie nun nach Belieben Filter hinzu. Hier beenden Sie gerade Ihre Eule. Dies ist der erste Ort, an dem wir Skriptparameter verwenden - Filtertyp und Datenbankname:



Jetzt ging der Thrash:



In @j bilden Sie einen Befehl für Job, der lautet:

  • Warten Sie mit WAITFOR auf die richtige Zeit
  • Führen Sie die Strecke
  • Warten Sie auf die bestellte Zeit
  • Stoppen Sie das Rennen
  • Warten Sie für alle Fälle eine weitere Sekunde - asynchrone Vorgänge
  • Bilden Sie ein Team, um die Ablaufverfolgung an die richtige Stelle zu kopieren
  • Führe sie aus
  • Formular Betreff und Körperbuchstaben
  • Senden Sie dem Kunden über sp_send_dbmail einen Brief mit einem Link zum Trace

Jetzt müssen wir Job mit Schritt 1 erstellen, der in @j beschrieben ist. Ich füge diesem Job jedoch immer noch Selbstmord hinzu, damit Joba am Ende der Arbeit spurlos verschwindet:



Hier höre ich Schreie über xp_cmdshell ... Ich möchte dies nicht kommentieren. Am Ende sollte niemand vor Gericht gegen sich selbst aussagen. Aber du kannst es anders machen. Es ist unwahrscheinlich, dass Sie den Trace per Post senden können - er ist groß. Obwohl Sie es packen können. Lassen Sie es entweder auf dem Server selbst und lassen Sie den Benutzer es selbst abholen oder ziehen Sie es über UNC an einen für den Benutzer zugänglichen Ort

Sie haben also:

  • Jenkins ruft Fledermaus
  • Fledermaus ruft Powershell
  • Powershell ruft SQL-Skript über sqlcmd auf
  • Das Skript erstellt Job
  • Job erstellt eine Ablaufverfolgung und sendet E-Mails vor dem Selbstmord:

Ich hätte nie gedacht, dass eine so lange Kette funktionieren würde. Aber es funktioniert ...



PS: Und ja, auch wenn xp_cmdshell verboten ist und Sie es nicht aktivieren können, haben Sie mindestens zwei Möglichkeiten, my_xp_cmdshell zu schreiben. Dieser "Schutz" schützt also vor nichts.

Source: https://habr.com/ru/post/de431142/


All Articles