Freigeben über


Verwenden des tools Sqldumper.exe zum Generieren einer Abbilddatei in SQL Server

Dieser Artikel enthält allgemeine Richtlinien für das Sqldumper.exe Tool, das in SQL Server enthalten ist. Dieses Tool wird verwendet, um verschiedene Arten von Dumpdateien zu generieren.

Originalproduktversion: SQL Server 2019, SQL Server 2017, SQL Server 2016, SQL Server 2014, SQL Server 2012, SQL Server 2008, SQL Server 2005
Ursprüngliche KB-Nummer: 917825

Übersicht

Das Sqldumper.exe Tool ist in Microsoft SQL Server enthalten. Es generiert Speicherabbilddateien von SQL Server und zugehörigen Prozessen für das Debuggen. In diesem Artikel wird beschrieben, wie Sie Sqldumper.exe verwenden, um eine Speicherabbilddatei für Watson-Fehlerberichterstattungs- oder Debuggingaufgaben zu generieren.

Im Artikel werden auch zwei weitere Methoden zum Generieren von Dumpdateien beschrieben:

  • Das angefügte PowerShell-Skript automatisiert SQLDumper.exe Befehlszeilenoptionen.
  • Der BEFEHL DBCC STACKDUMP Transact-SQL (T-SQL) kann verwendet werden, um eine Speicherabbilddatei in SQL Server zu generieren.

Manuelles Ausführen von Sqldumper.exe

Führen Sie das tool Sqldumper.exe unter dem Kontext des Ordners aus, in dem SQL Server das Tool ursprünglich installiert hat.

Standardmäßig ist <der Installationspfad von Sqldumper.exe SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\90\Shared\SQLDumper.exe. Beachten Sie, dass <SQLServerInstall Drive> ein Platzhalter für das Laufwerk ist, auf dem Sie SQL Server installiert haben.

Führen Sie die folgenden Schritte aus, um eine Abbilddatei mithilfe des tools Sqldumper.exe zu generieren:

  1. Öffnen Sie <SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\<number>\Shared folder.

    In diesem Ordnerpfad <ist die Zahl> ein Platzhalter für eine der folgenden Versionen:

    • 150 für SQL Server 2019
    • 140 für SQL Server 2017
    • 130 für SQL Server 2016
    • 120 für SQL Server 2014
    • 110 für SQL Server 2012
    • 100 für SQL Server 2008
    • 90 für SQL Server 2005
  2. Stellen Sie sicher, dass sich die Dbghelp.dll Datei in diesem Ordner befindet.

  3. Wählen Sie "Start ausführen"> aus, geben Sie cmd ein, und wählen Sie dann "OK" aus.

  4. Geben Sie an der Eingabeaufforderung den folgenden Befehl ein und drücken Sie dann die EINGABETASTE:

    cd <SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\<number>\Shared
    

    Notiz

    In diesem Ordnerpfad <ist die Nummer> derselbe Platzhalter, der sich mit der SQL Server-Version ändert, wie zuvor beschrieben.

  5. Um eine bestimmte Art von Dumpdatei zu generieren, geben Sie den entsprechenden Befehl an der Eingabeaufforderung ein, und drücken Sie dann die EINGABETASTE:

    • Vollständige Dumpdatei:

      Sqldumper.exe <ProcessID> 0 0x01100
      
    • Miniabbilddatei:

      Sqldumper.exe <ProcessID> 0 0x0120
      
    • Miniabbilddatei, die indirekt referenzierten Speicher enthält (dies ist die empfohlene Option und wird standardmäßig auch von SQL Server verwendet, wenn automatisch Speicherabbilddateien generiert werden):

      Sqldumper.exe <ProcessID> 0 0x0128
      
    • Gefilterte Speicherabbilddatei:

      Sqldumper.exe <ProcessID> 0 0x8100
      

    Notiz

    <ProcessID> ist ein Platzhalter für den Prozessbezeichner der Windows-Anwendung, für die Sie eine Speicherabbilddatei generieren möchten.

Wenn Sqldumper.exe erfolgreich ausgeführt wird, generiert das Tool eine Dumpdatei in dem Ordner, in dem das Tool installiert ist.

Die Speicherabbilddatei, die Sqldumper.exe generiert, weist ein Dateinamenmuster auf, das SQLDmpr<xxxx.mdmp> ähnelt.

In diesem Muster ist xxxx> eine zunehmende Zahl, <die basierend auf anderen Dateien bestimmt wird, die einen ähnlichen Dateinamen im selben Ordner aufweisen. Wenn dateien im Ordner vorhanden sind, die dem angegebenen Muster entsprechen, sollten Sie deren Erstellungsdaten und -uhrzeiten vergleichen, um die gewünschte Datei zu finden.

So erhalten Sie eine Microsoft Windows-Anwendungsprozess-ID

Zum Generieren einer Abbilddatei mithilfe des tools Sqldumper.exe müssen Sie über den Prozessbezeichner der Windows-Anwendung verfügen, für die Sie eine Speicherabbilddatei generieren möchten. Hier erfahren Sie, wie Sie den Prozessbezeichner abrufen:

  1. Drücken Sie STRG+ALT+ENTF, und wählen Sie "Task-Manager" aus.
  2. Wählen Sie im Dialogfeld "Windows Task Manager " die Registerkarte "Prozesse " aus.
  3. Wählen Sie im Menü "Ansicht " die Option "Spalten auswählen " aus.
  4. Aktivieren Sie im Dialogfeld "Spalten auswählen" das Kontrollkästchen "PID (Prozessbezeichner)", und wählen Sie dann "OK" aus.
  5. Beachten Sie den Prozessbezeichner der Windows-Anwendung, für die Sie eine Speicherabbilddatei generieren möchten. Beachten Sie für die SQL Server-Anwendung den Prozessbezeichner des Sqlservr.exe Prozesses.
  6. Schließen Sie den Task-Manager.

Verwenden Sie alternativ die SQL Server-Fehlerprotokolldatei, um den Prozessbezeichner der SQL Server-Anwendung abzurufen, die auf Ihrem Computer ausgeführt wird. Ein Teil der SQL Server-Fehlerprotokolldatei ähnelt dem folgenden Beispiel:

2021-09-15 11:50:32.690 Server       Microsoft SQL Server 2019 (RTM-CU12) (KB5004524) - 15.0.4153.1 (X64)
    Jul 19 2021 15:37:34
    Copyright (C) 2019 Microsoft Corporation
    Enterprise Edition (64-bit) on Windows 10 Pro 10.0 <X64> (Build 19043: ) (Hypervisor)
2021-09-15 11:50:32.690 Server       UTC adjustment: -5:00
2021-09-15 11:50:32.690 Server       (c) Microsoft Corporation.
2021-09-15 11:50:32.690 Server       All rights reserved.
2021-09-15 11:50:32.690 Server       Server process ID is 7028.

Die Zahl, die hinterher Server process ID angezeigt wird, ist der Prozessbezeichner für den Sqlservr.exe Prozess.

Ausgabepfad für Speicherabbilddateien

SQLDumper.exe generiert in erster Linie Speicherabbilddateien für den SQL Server-Prozess, wenn ein Speicherabbild erforderlich ist, um bestimmte Probleme zu beheben, z. B. Ausnahmen, Assertionen oder nicht ertragende Scheduler. In solchen Fällen ruft SQL Server die SQLDumper.exe auf, um eine Speicherabbilddatei des Prozesses zu generieren. Standardmäßig wird die Speicherabbilddatei im VERZEICHNIS "MSSQL\LOG\" der SQL-Instanz gespeichert.

So ändern Sie den Standardpfad

Wenn die Größe der Dumpdatei beispielsweise zu groß ist, können Sie den Pfad ändern, indem Sie die folgenden Schritte ausführen:

  1. Öffnen Sie den SQL Server-Konfigurations-Manager.
  2. Suchen Sie unter SQL Server Services die sql Server-Instanz, die untersucht wird.
  3. Klicken Sie mit der rechten Maustaste auf diesen Eintrag, wählen Sie "Eigenschaften" aus, und wechseln Sie dann zur Registerkarte "Erweitert".
  4. Ändern Sie dieses Dumpverzeichnis in den gewünschten Pfad, und wählen Sie dann OK aus.
  5. Starten Sie SQL Server (sofern möglich) neu, damit die neue Einstellung wirksam wird.

Wenn das Sqldumper.exe Tool manuell verwendet wird, um eine Speicherabbilddatei für jede Windows-Anwendung zu generieren, ist die Speicherabbilddatei möglicherweise so groß wie der Arbeitsspeicher, den die Windows-Anwendung derzeit verwendet. Stellen Sie sicher, dass genügend Speicherplatz auf dem Laufwerk verfügbar ist, in das Sqldumper.exe die Speicherabbilddatei schreibt.

Angeben eines benutzerdefinierten Ausgabeordners in Befehl

Sie können das Verzeichnis angeben, in dem das Sqldumper.exe Tool die Dumpdatei schreiben soll. Das Verzeichnis muss bereits vorhanden sein, bevor Sie Sqldumper.exe ausführen. Andernfalls schlägt Sqldumper.exe fehl. Verwenden Sie keinen UNC-Pfad (Universal Naming Convention) als Speicherort für die Speicherabbilddatei. Die folgenden Schritte enthalten ein Beispiel zum Angeben des Speicherorts der Miniabbilddatei:

  1. Wählen Sie "Start ausführen"> aus, geben Sie cmd ein, und wählen Sie dann "OK" aus.

  2. Geben Sie an der Eingabeaufforderung den folgenden Befehl ein und drücken Sie dann die EINGABETASTE:

    cd <SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\<number>\Shared
    
  3. Geben Sie an der Eingabeaufforderung den folgenden Befehl ein und drücken Sie dann die EINGABETASTE:

    Sqldumper.exe ProcessID 0 0x0128 0 <MdumpPath>
    

    Notiz

    <MdumpPath> ist ein Platzhalter für das Verzeichnis, in dem das Sqldumper.exe Tool die Dumpdatei schreiben soll. Standardmäßig wird die Datei in den aktuellen Ordner geschrieben.

Wenn Sie eine vollständige Speicherabbilddatei oder eine gefilterte Speicherabbilddatei angeben, die generiert werden soll, kann es mehrere Minuten dauern, Sqldumper.exe die Speicherabbilddatei zu generieren. Die benötigte Zeit hängt von den folgenden Variablen ab:

  • Die Speichermenge, die Sqlservr.exe zurzeit verwendet.
  • Die Schreibgeschwindigkeit des Laufwerks, das vom Tool zum Speichern der Dumpdatei verwendet wird.

Während dieser Zeit verarbeitet das Sqldumper.exe Tool keine Befehle. Sie werden feststellen, dass der Server nicht mehr reagiert. Darüber hinaus kann ein Clusterfailover auftreten.

Erforderliche Berechtigungen

Um Sqldumper.exe auszuführen, müssen Sie sich mit einer der folgenden Methoden bei Windows anmelden:

  • Verwenden Sie ein Konto, das Mitglied der Gruppe des Administrators auf dem Computer ist.
  • Verwenden Sie dasselbe Benutzerkonto, unter dem der SQL Server-Dienst ausgeführt wird.

Damit das tool Sqldumper.exe erfolgreich über Remotedesktop oder Terminaldienste funktioniert, müssen Sie Remotedesktop- oder Terminaldienste im Konsolenmodus starten. Um z. B. Remotedesktop im Konsolenmodus zu starten, wählen Sie "Start>ausführen" aus, geben Sie "mstsc /console" ein, und wählen Sie dann "OK" aus. Wenn der Zielserver Windows 2000 ausführt, wird die Option "/console " im Hintergrund ignoriert. Sie können über Remotedesktop eine Verbindung mit dem Server herstellen, aber Sie verwenden die Konsolensitzung nicht.

Wenn Sie feststellen, dass nach dem Ausführen von Sqldumper.exe keine Dumpdatei im aktuellen Ordner generiert wurde, überprüfen Sie die vom Tool generierte Befehlszeilenausgabe, um die potenzielle Ursache des Fehlers zu ermitteln. Diese Informationen werden auch in der Sqldumper_errorlog.log Datei im aktuellen Verzeichnis protokolliert. Es folgen zwei mögliche Fehlermeldungen und deren Ursachen:

Nachricht Ursache
"OpenProcess failed 0x57 - The parameter is incorrect" An das Hilfsprogramm Sqldumper.exe wurde eine ungültige Prozess-ID übergeben.
"Ungültiger Wert für Thread-ID - <Ungültiger Parameterfehler> " An das Hilfsprogramm Sqldumper.exe wurde ein ungültiger Parameter übergeben.

Wenn eine Fehlermeldung, die einer der folgenden Elemente ähnelt, generiert wird, können Sie diese Meldung sicher ignorieren:

  • "Unbekannter Rückruftyp während minidump 6"
  • "Unbekannter Rückruftyp während minidump 7"

Auswirkungen der Generierung von Dumps

Wenn eine Dumpdatei eines Benutzermodusprozesses angefordert wird (wie in diesem Artikel beschrieben, im Gegensatz zu Betriebssystem-Kernelabbildern, die außerhalb unseres Bereichs liegen), wird der Zielprozess (hier SQLServer.exe) für die Dauer eingefroren, die zum Serialisieren des Dumpinhalts in das Dateiziel benötigt wird.

Eingefroren bedeutet, dass der Prozess keine Benutzeranforderung oder einen internen Vorgang ausführen kann, einschließlich eines Beliebigen Mechanismus für die Ressourcenabfrage, z. B. die Implementierung von IsAlive und Looks Alive von Windows Clustering (weitere Informationen zur Behandlung dieser Situation finden Sie im Abschnitt "Speicherabbilder auf Clusterfailovers"). Jedes Timeout, das auf die Wanduhrzeit angewiesen ist, kann auch aufgrund des Einfrierens verletzt werden.

Basierend auf der vorherigen Aussage ist die Dauer des Fixierungsfaktors hier der entscheidende Faktor, der von folgendem gesteuert wird:

  • Der Typ des ausgewählten Dumps .
  • Die Größe des SQL Server-Prozesses im Arbeitsspeicher, der bei einer einzelnen aktiven Instanz, die Standardparameter ausführt, häufig nahe am gesamten physischen RAM des Servers liegt.
  • Die Leistung des Datenträgers, der als Ziel für das Dump verwendet wird.

Darüber hinaus sollte die Größe der Speicherabbilddatei auf dem Datenträger geplant werden, insbesondere, wenn mehrere Dumps eine Möglichkeit sind und wenn große, nicht standardmäßige Dumptypen ausgewählt werden. Überprüfen Sie die Dump-Typen , um zu wissen, was Sie erwarten sollten. Standardmäßig erstellen einige Dumpmethoden das Abbild im Ordner "\Log" der SQL Server-Instanz, der in der standard einfachen Konfiguration auch Systemdatenträger und Daten+Protokolldatenträger für SQL Server sein würde. Die Sättigung dieses Datenträgers wirkt sich stark auf die VERFÜGBARKEIT von SQL Server und/oder System aus.

Verwalten der Auswirkungen auf gruppierte Systeme

Der Prozess wird während der Speicherabbildgenerierung vorübergehend angehalten. Dies kann sich auf die Verfügbarkeit des SQL Server-Diensts auswirken und das Failover von Ressourcen in AlwaysOn-Kontexten auslösen (sowohl Failoverclusterinstanz als auch Verfügbarkeitsgruppe). Die Dumpgenerierung verschiedener Prozesse wirkt sich auf Ressourcen unterschiedlich aus. Lesen Sie die Abschnitte " Auswirkungen der Dumpgenerierung " und "Dump"-Typen sorgfältig.

Wenn Sie ein SQL Server-Speicherabbild für eine Failoverclusterinstanz oder eine AG-Instanz (Availability Group) von SQL Server erfassen, schlägt der gruppierte SQL Server oder AG möglicherweise zu einem anderen Knoten fehl, wenn das Dump zu lange dauert. Dies kann besonders problematisch für Systeme sein, die große Mengen RAM verwenden oder wenn Sie ein gefiltertes oder vollständiges Speicherabbild generieren. Verwenden Sie zum Verhindern des Failovers die folgenden Einstellungen, bevor Sie die Speicherabbilddatei erfassen. Die Änderung kann nach dem Ausführen einer Speicherabbilddatei wiederhergestellt werden:

  • Für Failoverclusterinstanz (FCI):
    • Klicken Sie mit der rechten Maustaste auf die SQL Server-Ressource im Clusteradministrator, wählen Sie "Wenn Ressource fehlschlägt" aus, starten Sie nicht auf der Registerkarte "Richtlinien" neu.
    • Erhöhen Sie auf der Registerkarte "Eigenschaften " das HealthCheck-Timeout. Legen Sie beispielsweise den Eigenschaftswert auf 180 Sekunden oder höher fest. Wenn dieses Timeout erreicht ist, wird die Richtlinie Wenn die Ressource fehlschlägt, wird kein Neustart ignoriert, und die Ressource wird neu gestartet.
    • Ändern Sie auf der Registerkarte "Eigenschaften " den Wert "FailureConditionLevel " in Null.
  • Wenden Sie für AG alle folgenden Einstellungen an:
    • Erhöhen Sie das Sitzungstimeout, z. B. 120 Sekunden für alle Replikate. Klicken Sie in SQL Server Management Studio (SSMS) mit der rechten Maustaste auf das zu konfigurierende Replikat, und wählen Sie dann "Eigenschaften" aus. Ändern Sie das Feld "Session timeout" (Sekunden) in 120 Sekunden. Weitere Informationen finden Sie unter "Ändern des Sitzungstimeoutzeitraums für ein Verfügbarkeitsreplikat (SQL Server)".
    • Ändern Sie das automatische Failover aller Replikate in manuelles Failover. Klicken Sie in SSMS mit der rechten Maustaste auf Replikat, wählen Sie "Eigenschaften" aus, und ändern Sie das automatische Failover aller Replikate in manuelles Failover auf der Registerkarte "Eigenschaften". Weitere Informationen finden Sie unter Ändern des Failovermodus eines Verfügbarkeitsreplikats (SQL Server).
    • Erhöhen Sie das LeaseTimeout auf 60.000 ms (60 Sekunden) und ändern Sie HealthCheckTimeout auf 90.000 ms (90 Sekunden). Klicken Sie im Clusteradministrator mit der rechten Maustaste auf AG-Ressource, wählen Sie "Eigenschaften" aus, und wechseln Sie dann zur Registerkarte "Eigenschaften", um beide Einstellungen zu ändern. Weitere Informationen finden Sie unter Configure HealthCheckTimeout Property Settings.

Produktverbesserungen zur Verringerung der Auswirkungen auf SQL Server

Vier wichtige Verbesserungen werden zu den letzten Versionen von SQL Server hinzugefügt, um die Größe der Speicherabbilddatei und/oder die Zeit zum Generieren des Speicherabbilds zu verringern:

Bitmapfiltermechanismus

SQL Server ordnet eine Bitmap zu, die Speicherseiten nachverfolgt, die aus einem gefilterten Speicherabbild ausgeschlossen werden sollen. „Sqldumper.exe“ liest die Bitmap und filtert Seiten heraus, ohne dass weitere Metadaten des Speicher-Managers gelesen werden müssen. Die folgenden Meldungen werden im SQL Server-Fehlerprotokoll angezeigt, wenn die Bitmap aktiviert bzw. deaktiviert ist:

Page exclusion bitmap is enabled. und Page exclusion bitmap is disabled.

  • SQL Server 2016

    Ab SQL Server 2016 SP2 CU13 ist die Bitmapfilterung standardmäßig aktiviert.

  • SQL Server 2017

    • Dies ist in RTM bis CU15 nicht verfügbar.
    • In SQL Server 2017 CU16 können Sie die Bitmapfilterung über T8089 aktivieren und deaktivieren, indem Sie T8089 deaktivieren.
    • Ab SQL Server 2017 CU20 ist die Bitmapfilterung standardmäßig aktiviert. Die Ablaufverfolgungskennzeichnung T8089 wird nicht mehr angewendet und wird ignoriert, wenn sie aktiviert ist. Die Bitmapfilterung kann über T8095 deaktiviert werden.
  • SQL Server 2019

    Dies ist in SQL Server 2019 RTM standardmäßig aktiviert. Sie kann über T8095 deaktiviert werden.

Beseitigung wiederholter Dumps für dasselbe Problem

Wiederholte Speicherabbilder für dasselbe Problem werden beseitigt. Bei Verwendung einer Stapelsignatur verfolgt das SQL-Modul nach, ob bereits eine Ausnahme aufgetreten ist und keine neue Speicherabbilderstellung erzeugt, wenn bereits eine vorhanden ist. Dies gilt für Zugriffsverletzungen, Stapelüberlauf, Assertionen und Indexbeschädigungsausnahmen. Dadurch wird die Menge an Speicherplatz reduziert, der von Speicherabbildern verwendet wird, und der Prozess wird nicht vorübergehend fixiert, um ein Dump zu generieren. Dies wurde in SQL Server 2019 hinzugefügt.

Gekürzte Ausgabe im Fehlerprotokoll

Der im SQL Server-Fehlerprotokoll generierte Inhalt aus einem einzigen Speicherabbild kann nicht nur überwältigend sein, sondern kann auch den Prozess des Generierens eines Speicherabbilds aufgrund der Zeit verlangsamen, die erforderlich ist, um alle diese Informationen in ein Textformat im Fehlerprotokoll zu serialisieren. In SQL Server 2019 wurde der im Fehlerprotokoll gespeicherte Inhalt bei der Speicherabbildgenerierung erheblich reduziert und kann wie folgt aussehen:

DateTimespidS pid    **Dump thread - spid = 0, EC = 0x0000015C7169BF40
DateTimespidS pid    *
DateTimespidS pid    *User initiated stack dump. This is not a server exception dump.
DateTimespidS pid    *
DateTimespidS pid    Stack Signature for the dump is 0x00000000788399E5
DateTimespidS pid    External dump process return code 0x20000001.
External dump process returned no errors.

Zuvor würde SQL Server Informationen für jede Sitzung oder jeden Thread drucken, wenn beispielsweise ein manuelles Dump vom Benutzer ausgelöst wurde.

Parallele Komprimierung von Speicherabbildern

Um Dumps schneller zu generieren und die Größe zu verkleinern, wurde ein komprimiertes Speicherabbildfeature in SQL Server 2022 CU8 und SQL Server 2019 CU23 eingeführt. Wenn diese Option aktiviert wird, erstellt Sqldumper.exe mehrere Threads zum gleichzeitigen Lesen des Speichers eines Prozesses, komprimiert sie und speichert sie dann in der Speicherabbilddatei. Diese Multithreadkomprimierung reduziert die Dateigröße und beschleunigt den Dumpingprozess bei Verwendung mit vollständigen und gefilterten Dumps.

Sie können die Ablaufverfolgungskennzeichnung 2610 aktivieren, um das komprimierte Speicherabbild zu aktivieren:

DBCC TRACEON (2610,-1)
GO
DBCC STACKDUMP with FILTERED_DUMP
GO
DBCC TRACEOFF (2610,-1)

Alternativ können Sie ihrer SQL Server-Instanz einen Startparameter hinzufügen -T2610 , sodass immer komprimierte Speicherabbilder erstellt werden.

Wenn Sie Sqldumper.exe manuell ausführen, können Sie den -zdmp Parameter verwenden, um ein komprimiertes Speicherabbild zu erfassen. Zum Beispiel:

Sqldumper.exe <ProcessID> 0 0x8100 0 d:\temp -zdmp

Sie können auch einschränken, wie viele Kerne Sqldumper.exe verwenden können, um das komprimierte Dump mithilfe des -cpu:X Parameters zu erstellen, wobei X die Anzahl der CPUs ist. Dieser Parameter ist nur verfügbar, wenn Sie Sqldumper.exe manuell über die Befehlszeile ausführen:

Sqldumper.exe <ProcessID> 0 0x8100 0 d:\temp -zdmp -cpu:8

Faktoren, die die Erstellung von Speicherabbildern verhindern oder verzögern

Die folgenden Faktoren sind bekannt, um Verzögerungen zu verursachen oder die Erstellung von Speicherabbildern zu verhindern.

  • Der E/A-Pfad, in dem Speicherabbilder geschrieben werden, führt schlecht aus. In solchen Fällen ist die Untersuchung und Auflösung der Datenträger-E/A-Leistung der nächste logische Schritt.
  • Eine Antivirensoftware oder eine andere Überwachungssoftware stört SQLDumper.exe. In einigen Fällen detour software detour ReadProcessMemory-Funktion von Drittanbietern. Dies kann die Speicherabbilddauer erheblich erhöhen. Um die meisten dieser Probleme zu beheben, deaktivieren Sie die störende Software, oder fügen Sie einer Ausschlussliste SQLDumper.exe hinzu.

Abbildtypen

Die folgenden Methoden können verwendet werden, um drei verschiedene Arten von Dumps zu generieren: Miniabbilder, vollständige Dumps und gefilterte Dumps.

Miniabbilder mit Referenzspeicher

Dieser Speicherabbildtyp ist eine Momentaufnahme aller aktiven Threads des Prozesses ("Threadstapel"), zusammen mit einem begrenzten Extrakt des Speichers, auf den die Threadstapel und einige andere Schlüsselprozess- oder Threaddaten verweisen. Sie sind in der Regel ein paar Megabyte groß und schnell zu generieren (von weniger als einer Sekunde bis zu einigen Sekunden). Noch größere Serversysteme (mit Hunderten von CPU, die indirekt eine massive Anzahl von Threads im SQL Server-Prozess steuern) überschreiten selten 20-30 MB: Die Größe eines Miniabbilds wächst nicht mit der Größe des SQL Server-Prozesses. Dieser Dumptyp ist der Standardtyp, der von SQL Server verwendet wird, wenn Speicherabbilder automatisch für Ausnahmen, Zeitplanprobleme, Klammerprobleme, Datenbankbeschädigungen und Assertionen generiert werden.

Notiz

SQL Server generiert im Rahmen der integrierten Instrumentierung in bestimmten Situationen automatisierte "Diagnose-Miniabbilder". Dieser Vorgang gilt daher als sicher genug, damit SQL Server sie bei Bedarf automatisch auslösen kann.

Vollständige Dumps

Ein vollständiges Speicherabbild ist eine vollständige Kopie des aktiven Zielprozessbereichs. Dies würde daher alle Threadzustände, alle prozessgebundenen Arbeitsspeicher und alle geladenen Module umfassen. Vollständige Dumps weisen daher eine Größe auf, die ungefähr dem gleichen SQL Server-Prozess entspricht, was wiederum fast so groß wie der gesamte System-RAM sein kann. Auf großen Servern, die einer einzelnen SQL Server-Instanz zugeordnet sind, die eine Datei bedeuten kann, die mehrere Hundert Gigabyte oder mehr ist. Unnötigerweise dauert eine solche Datei viel Zeit, um eine solche Datei zu generieren und wird daher längeres Einfrieren auslösen. Die Datenträgerleistung für das Dateiziel des Dumps wirkt sich erheblich auf die Fixierungszeit aus. Diese Art von Dump wird heutzutage selten für SQL Server verwendet, wie in der folgenden Erläuterung beschrieben.

Gefilterte Dumps

Da die RAM-Größe typischer Server, auf denen SQL Server ausgeführt wird, stetig zunimmt, werden vollständige Dumps unübersichtlicher. Gefilterte Dumps werden daher implementiert. Ein gefiltertes Dump ist eine Teilmenge eines vollständigen Speicherabbilds, in dem große Bereiche des SQL Server-Speichers dynamisch ausgeschlossen und nicht auf den Datenträger geschrieben werden. In der Regel bringt der ausgeschlossene Speicher keinen Mehrwert zur Problembehandlung. Beispiele sind Daten-/Indexseiten und einige interne Caches wie Hekaton-Datenseiten und Log Pool-Speicher. Dieses gefilterte Dump führt zu einer kleineren Datei als ein vollständiges Dump, aber das Dump behält weiterhin fast alle seine Nützlichkeit bei. Gefilterte Dumps haben vollständige Dumps als bevorzugte Option in den meisten Fällen ersetzt, in denen Miniabbilder nicht ausreichen. Die Verkleinerung der Größe kann im Vergleich zu einem vollständigen Speicherabbild variieren, aber es handelt sich immer noch um eine ziemlich große Datei, die häufig 30 bis 60 Prozent der SQL Server-Prozessgröße beträgt. Daher ist es am besten, eine mögliche Größe so groß wie ein vollständiges Dump als schlechteste Option zu planen, was einen guten Sicherheitsrand hinterlässt. Ein gefiltertes Dump ist möglicherweise nicht notwendigerweise schneller zu generieren als ein vollständiges Dump in jedem Fall: Es ist eine Frage, ob die Gewinne im Zusammenhang mit der Anzahl der vermiedenen E/A-Dateien die Zeit überschreiten, die zum Implementieren der Filterlogik erforderlich ist (Datenträgergeschwindigkeit und CPU/RAM-Geschwindigkeit beeinflusst dies).

Sie können die folgende Abfrage verwenden, um eine grobe Schätzung der größe des gefilterten Dumps zu erhalten. Obwohl die Erwartung besteht, dass die meisten Daten- oder Indexseiten vom Dump ausgeschlossen werden, werden die Daten oder Indexseiten, die ausschließlich gesperrt und geändert werden, nicht ausgelassen.

SELECT SUM(pages_kb)
FROM sys.dm_os_memory_clerks
WHERE type != 'MEMORYCLERK_SQLBUFFERPOOL'

Da Sie Sqldumper.exe verwenden können, um eine Speicherabbilddatei bei Bedarf für eine beliebige Microsoft Windows-Anwendung zu generieren, können Sie die Option für gefilterte Dumps in Betracht ziehen. Eine gefilterte Speicherabbilddatei ist jedoch nur im Kontext von SQL Server anwendbar und aussagekräftig. Sie können weiterhin ein Miniabbild, eine vollständige Speicherabbilddatei oder Nicht-SQL Server-Anwendungen erfolgreich generieren.

Der SQL Server-Prozess ruft das Sqldumper.exe Tool intern auf, um eine Speicherabbilddatei zu generieren, wenn der Prozess Ausnahmen erlebt. SQL Server übergibt Parameter an Sqldumper.exe. Sie können Ablaufverfolgungskennzeichnungen verwenden, um die Parameter zu ändern, die SQL Server standardmäßig an das Tool übergibt, wenn eine Ausnahme oder Assertion auftritt. Diese Spurenkennzeichnungen liegen zwischen 2540 und 2559. Sie können eines dieser Ablaufverfolgungskennzeichnungen verwenden, um den Standardabbildtyp zu ändern, SQLDumper.exe generiert werden (der Standardwert ist ein Miniabbild mit referenziertem Speicher). Zum Beispiel:

  • Ablaufverfolgungskennzeichnung 2551: Erzeugt ein gefiltertes Speicherabbild.
  • Ablaufverfolgungskennzeichnung 2544: Erzeugt ein vollständiges Speicherabbild.
  • Ablaufverfolgungskennzeichnung 8026: SQL Server löscht einen Dumptrigger, nachdem das Dump einmal generiert wurde.

Wenn mindestens zwei Ablaufverfolgungskennzeichnungen aktiv sind, wird die Option, die angibt, dass das größte Speicherabbild berücksichtigt wird. Wenn beispielsweise Ablaufverfolgungskennzeichnungen 2551 und 2544 verwendet werden, erstellt SQL Server ein vollständiges Speicherabbild.

Generieren eines Speicherabbilds für Clusterfailover

In Clusterfailoverszenarien kann die SQL Server-Ressourcen-DLL eine Speicherabbilddatei abrufen, bevor das Failover auftritt, um die Problembehandlung zu unterstützen. Wenn die Ressourcen-DDL in SQL Server feststellt, dass es bei einer SQL Server-Ressource zu einem Fehler kam, verwendet die Ressourcen-DLL in SQL Server das Hilfsprogramm Sqldumper.exe, um ein Speicherabbild des SQL Server-Prozesses abzurufen. Um sicherzustellen, dass das Sqldumper.exe Tool die Dumpdatei erfolgreich generiert, müssen Sie die folgenden drei Eigenschaften als Voraussetzungen festlegen:

  • SqlDumperDumpTimeOut

    Ein vom Benutzer angegebenes Timeout. Die Ressourcen-DLL wartet, bis die Speicherabbilddatei abgeschlossen ist, bevor die Ressourcen-DLL den SQL Server-Dienst beendet.

  • SqlDumperDumpPath

    Der Speicherort, an dem das Sqldumper.exe Tool die Speicherabbilddatei generiert.

  • SqlDumperDumpFlags

    Flags, die Sqldumper.exe verwendet.

Wenn eine der Eigenschaften nicht festgelegt ist, kann Sqldumper.exe die Speicherabbilddatei nicht generieren. Eine Warnmeldung wird sowohl im Ereignisprotokoll als auch im Clusterprotokoll protokolliert, wenn die Ressource online gestellt wird.

Clusterkonfiguration für SQLDumper in SQL Server 2012 und höheren Versionen

Sie können den ALTER SERVER CONFIGURATION Befehl (T-SQL) verwenden, um diese Eigenschaften zu ändern. Zum Beispiel:

ALTER SERVER CONFIGURATION SET FAILOVER CLUSTER PROPERTY SqlDumperDumpTimeOut = 0;
ALTER SERVER CONFIGURATION SET FAILOVER CLUSTER PROPERTY SqlDumperDumpPath = 'C:\temp\';
ALTER SERVER CONFIGURATION SET FAILOVER CLUSTER PROPERTY SqlDumperDumpFlags = 296;

Alternativ können Sie PowerShell-Skripts verwenden. Beispiel: für eine benannte Instanz SQL2017AG:

Get-ClusterResource -Name "SQL Server (SQL2017AG)" | Set-ClusterParameter -Name "SqlDumperDumpPath" -Value "C:\temp"
Get-ClusterResource -Name "SQL Server (SQL2017AG)" | Set-ClusterParameter -Name "SqlDumperDumpFlags" -Value 296
Get-ClusterResource -Name "SQL Server (SQL2017AG)" | Set-ClusterParameter -Name "SqlDumperDumpTimeOut" -Value 0

Um zu überprüfen, ob die Einstellungen angewendet werden, können Sie den folgenden PowerShell-Befehl ausführen:

Get-ClusterResource -Name "SQL Server (SQL2017AG)" | Get-ClusterParameter

Clusterkonfiguration für SQLDumper auf SQL Server 2008/2008 R2 oder Windows 2012 und früheren Versionen

Führen Sie die folgenden Schritte aus, um die Sqldumper.exe Hilfsprogrammeigenschaften für das Clusterfailover mithilfe des Befehls "Clusterressource " festzulegen:

  1. Wählen Sie "Start ausführen"> aus, geben Sie cmd ein, und wählen Sie dann "OK" aus.
  2. Geben Sie für jede Eigenschaft den entsprechenden Befehl an der Eingabeaufforderung ein, und drücken Sie dann die EINGABETASTE:
    • Die SqlDumperDumpFlags-Eigenschaft.

      Um die SqlDumperDumpFlags Eigenschaft für eine bestimmte Speicherabbilddatei festzulegen, geben Sie den entsprechenden Befehl an der Eingabeaufforderung ein, und drücken Sie dann die EINGABETASTE:

      • Vollständige Threadabbilddatei

        • Standardinstanz

          cluster resource "SQL Server" /priv SqlDumperDumpFlags = 0x01100
          
        • Benannte Instanz

          cluster resource "SQL Server (INSTANCE1)" /priv SqlDumperDumpFlags = 0x01100
          
      • Alle Thread-Miniabbilddatei

        • Standardinstanz

          cluster resource "SQL Server" /priv SqlDumperDumpFlags = 0x0120
          
        • Benannte Instanz

          cluster resource "SQL Server (INSTANCE1)" /priv SqlDumperDumpFlags = 0x0120
          
      • Alle Threadabbilddatei gefiltert

        • Standardinstanz

          cluster resource "SQL Server" /priv SqlDumperDumpFlags = 0x8100
          
        • Benannte Instanz

          cluster resource "SQL Server  (INSTANCE1)" /priv SqlDumperDumpFlags = 0x8100
          
    • Die SqlDumperDumpPath-Eigenschaft.

      cluster resource "SQL Server" /priv SqlDumperDumpPath = <DirectoryPath>
      

      Notiz

      <DirectoryPath> ist ein Platzhalter für das Verzeichnis, in dem die Dumpdatei generiert wird, und es sollte in Anführungszeichen (" ") angegeben werden.

    • Die SqlDumperDumpTimeOut-Eigenschaft.

      cluster resource "SQL Server" /priv SqlDumperDumpTimeOut = <Timeout>
      

      Notiz

      <Timeout ist ein Platzhalter für das Timeout> in Millisekunden (ms).

Die Zeit, die das Tool benötigt, um eine Abbilddatei eines SQL Server-Prozesses zu generieren, hängt von der Computerkonfiguration ab. Für einen Computer mit einer großen Arbeitsspeichermenge kann die Zeit erheblich sein. Um die für den Prozess erforderliche Zeit zu schätzen, verwenden Sie das Sqldumper.exe Tool, um manuell eine Speicherabbilddatei zu generieren. Die gültigen Werte für die SqlDumperDumpTimeOut Eigenschaft liegen zwischen 10.000 ms und MAXDWORD. MAXDWORD stellt den höchsten Wert im Bereich des DWORD-Datentyps (4294967295) dar.

Um zu überprüfen, ob die Einstellungen aktiviert sind, können Sie den folgenden Befehl ausführen:

cluster resource "SQL Server" /priv

Entfernen Sqldumper.exe Eigenschaften für Clusterfailover

Führen Sie die folgenden Schritte aus, um die Sqldumper.exe-Tooleigenschaften für das Clusterfailover zu entfernen:

  1. Wählen Sie "Start ausführen"> aus, geben Sie cmd ein, und wählen Sie dann "OK" aus.

  2. Geben Sie für eine bestimmte Eigenschaft den entsprechenden Befehl an der Eingabeaufforderung ein, und drücken Sie dann die EINGABETASTE:

    • Die SqlDumperDumpFlags-Eigenschaft.

      • Standardinstanz

          cluster resource "SQL Server" /priv:SqlDumperDumpFlags /usedefault
        
      • Benannte Instanz

          cluster resource "SQL Server (INSTANCE1)" /priv:SqlDumperDumpFlags /usedefault
        
    • Die SqlDumperDumpPath-Eigenschaft.

      • Standardinstanz

        cluster resource "SQL Server" /priv:SqlDumperDumpPath /usedefault
        
      • Benannte Instanz

        cluster resource "SQL Server (INSTANCE1)" /priv:SqlDumperDumpPath /usedefault
        
    • Die SqlDumperDumpTimeOut-Eigenschaft.

      • Standardinstanz

        cluster resource "SQL Server" /priv:SqlDumperDumpTimeOut /usedefault
        
      • Benannte Instanz

        cluster resource "SQL Server (INSTANCE1)" /priv:SqlDumperDumpTimeOut /usedefault
        

Verwenden von DBCC STACKDUMP

Mit DBCC STACKDUMP dem Befehl können Sie ein Speicherabbild im LOG-Verzeichnis Ihrer SQL Server-Instanzinstallation erstellen. Der Befehl erstellt standardmäßig einen Minidump mit allen Threads, die eine begrenzte Größe aufweisen und dem Status des SQL Server-Prozesses entsprechen. Führen Sie den folgenden Befehl in einem SQL Server-Client aus:

DBCC STACKDUMP

Erweiterte Funktionen in DBCC STACKDUMP SQL Server 2019 finden Sie unter Erweiterte DBCC STACKDUMP-Funktionalität, die in SQL Server 2019 eingeführt wurde.

Um diese Methode zum Erstellen eines gefilterten Dumps zu aktivieren, aktivieren Sie ablaufverfolgungskennzeichnungen 2551 mithilfe des folgenden Befehls:

DBCC TRACEON(2551, -1)
GO
DBCC STACKDUMP

Verwenden Sie zum Erstellen eines vollständigen Dumps das Ablaufverfolgungskennzeichnung 2544.

Nachdem Sie die Speicherabbilddatei abgerufen haben, sollten Sie das Ablaufverfolgungsflaggen mithilfe des Befehls DBCC TRACEOFF (<TraceNumber>, -1); deaktivieren, um zu vermeiden, dass alle weiteren SELBSTdiagnose-Minidumps von SQL Server versehentlich auf größere Abbilder aktualisiert werden. Im Befehl ist TraceNumber> das Ablaufverfolgungskennzeichnung, <das Sie zuvor wie 2551 oder 2544 aktiviert haben. Zum Beispiel:

DBCC TRACEOFF(2551, -1)

Wenn Sie nicht sicher sind, welche Ablaufverfolgungskennzeichnung aktiv bleibt, führen Sie den folgenden Befehl aus:

DBCC TRACESTATUS(-1)

Ein leeres Resultset gibt an, dass keine Ablaufverfolgungskennzeichnung aktiv ist. Wenn 2551 dagegen noch aktiv ist, würden Sie Folgendes sehen:

TraceFlag Status Global Sitzung
2551 1 1 0

Notiz

Die aktivierung durch wird zurückgesetzt (entfernt) nach einem Dienstneustart.The traceflag enabled by DBCC TRACEON are reset (removed) after a service restart.

Erweiterte DBCC STACKDUMP-Funktionalität, die in SQL Server 2019 eingeführt wurde

Ab SQL Server 2019 CU2 wurde der DBCC STACKDUMP Befehl erweitert, um das Generieren von Dumps verschiedener Typen zu unterstützen: Mini-, gefilterte und vollständige Abbilder. Dieser Befehl beseitigt die Notwendigkeit der Verwendung von Ablaufverfolgungskennzeichnungen. Außerdem können Sie die Textausgabe in der anderen Textdatei einschränken, die mit dem Speicherabbild generiert wird. Dies kann zu einer sichtbaren Leistungssteigerung in der Zeit führen, die SQLDumper.exe zum Generieren eines Speicherabbilds benötigt.

DBCC STACKDUMP WITH MINI_DUMP | FILTERED_DUMP | FULL_DUMP [, TEXT_DUMP = LIMITED | DETAILED]

Dies TEXT_DUMP = LIMITED ist die Standardoption. Wenn Sie eine detaillierte Ausgabe in der SQLDump000X.txt-Datei erhalten möchten, können Sie dies verwenden TEXT_DUMP = DETAILED.

Führen Sie den folgenden Befehl aus, um ein gefiltertes Dump mit eingeschränkter Ausgabe in der .txt-Datei zu generieren:

DBCC STACKDUMP WITH FILTERED_DUMP , TEXT_DUMP = LIMITED

Verwenden eines PowerShell-Skripts zum Generieren einer Abbilddatei mit SQLDumper

  • Speichern Sie den folgenden Code als PS1-Datei, z . B. SQLDumpHelper.ps1:

    Codedetails

    $isInt = $false
    $isIntValDcnt = $false
    $isIntValDelay = $false
    $SqlPidInt = 0
    $NumFoler = ""
    $OneThruFour = ""
    $SqlDumpTypeSelection = ""
    $SSASDumpTypeSelection = ""
    $SSISDumpTypeSelection = ""
    $SQLNumfolder = 0
    $SQLDumperDir = ""
    $OutputFolder = ""
    $DumpType = "0x0120"
    $ValidPid
    $SharedFolderFound = $false
    $YesNo = ""
    $ProductNumber = ""
    $ProductStr = ""
    
    Write-Host ""
    Write-Host "`******************************************************************"
    Write-Host "This script helps you generate one or more SQL Server memory dumps"
    Write-Host "It presents you with choices on:`
                -target SQL Server process (if more than one)
                -type of memory dump
                -count and time interval (if multiple memory dumps)
    You can interrupt this script using CTRL+C"
    Write-Host "***********************************************************************"
    
    # check for administrator rights
    # debugging tools like SQLDumper.exe require Admin privileges to generate a memory dump
    
    if (-not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))
    {
        Write-Warning "Administrator rights are required to generate a memory dump!`nPlease re-run this script as an Administrator!"
        return
    }
    
    # what product would you like to generate a memory dump
    while ($true)
    {
        Write-Host "Which product would you like to generate a memory dump of?" -ForegroundColor Yellow
        Write-Host "1) SQL Server"
        Write-Host "2) SSAS (Analysis Services)"
        Write-Host "3) SSIS (Integration Services)"
        Write-Host "4) SSRS (Reporting Services)"
        Write-Host "5) SQL Server Agent"
        Write-Host ""
        $ProductNumber = Read-Host "Enter 1-5>"
    
        if ($ProductNumber -in 1,2,3,4,5)
        {
            break
        }
        Write-Host "`nPlease enter a valid number from list above!`n"
        Start-Sleep -Milliseconds 300
    }
    
    if ($ProductNumber -eq "1")
    {
        $SqlTaskList = Tasklist /SVC /FI "imagename eq sqlservr*" /FO CSV | ConvertFrom-Csv
        $ProductStr = "SQL Server"
    }
    elseif ($ProductNumber -eq "2")
    {
        $SqlTaskList = Tasklist /SVC /FI "imagename eq msmdsrv*" /FO CSV | ConvertFrom-Csv
        $ProductStr = "SSAS (Analysis Services)"
    }
    elseif ($ProductNumber -eq "3")
    {
        $SqlTaskList = Tasklist /SVC /FI "imagename eq msdtssrvr*" /FO CSV | ConvertFrom-Csv
        $ProductStr = "SSIS (Integration Services)"
    }
    elseif ($ProductNumber -eq "4")
    {
        $SqlTaskList = Tasklist /SVC /FI "imagename eq reportingservicesservice*" /FO CSV | ConvertFrom-Csv
        $ProductStr = "SSRS (Reporting Services)"
    }
    elseif ($ProductNumber -eq "5")
    {
        $SqlTaskList = Tasklist /SVC /FI "imagename eq sqlagent*" /FO CSV | ConvertFrom-Csv
        $ProductStr = "SQL Server Agent"
    }
    
    if ($SqlTaskList.Count -eq 0)
    {
        Write-Host "There are currently no running instances of $ProductStr. Exiting..." -ForegroundColor Green
        break
    }
    
    # if multiple SQL Server instances, get the user to input PID for desired SQL Server
    if ($SqlTaskList.Count -gt 1)
    {
        Write-Host "More than one $ProductStr instance found."
    
        $SqlTaskList | Select-Object PID, "Image name", Services | Out-Host
    
        # check input and make sure it is a valid integer
        while ($true)
        {
            Write-Host "Please enter the PID for the desired SQL service from list above" -ForegroundColor Yellow
            $SqlPidStr = Read-Host ">"
    
            if( $SqlPidStr -in $SqlTaskList.PID)
            {
                $SqlPidInt = [int]$SqlPidStr
                break
            }
        }
    
        Write-Host "Using PID=$SqlPidInt for generating a $ProductStr memory dump" -ForegroundColor Green
        Write-Host ""
    
    }
    else # if only one SQL Server/SSAS on the box, go here
    {
        $SqlTaskList | Select-Object PID, "Image name", Services | Out-Host
        $SqlPidInt = [convert]::ToInt32($SqlTaskList.PID)
    
        Write-Host "Using PID=", $SqlPidInt, " for generating a $ProductStr memory dump" -ForegroundColor Green
        Write-Host ""
    }
    
    # dump type
    
    if ($ProductNumber -eq "1")  # SQL Server memory dump
    {
        # ask what type of SQL Server memory dump
        while($true)
        {
            Write-Host "Which type of memory dump would you like to generate?" -ForegroundColor Yellow
            Write-Host "1) Mini-dump"
            Write-Host "2) Mini-dump with referenced memory " -NoNewLine; Write-Host "(Recommended)"
            Write-Host "3) Filtered dump " -NoNewline; Write-Host "(Not Recommended)" -ForegroundColor Red
            Write-Host "4) Full dump  " -NoNewline; Write-Host "(Do Not Use on Production systems!)" -ForegroundColor Red
            Write-Host ""
            $SqlDumpTypeSelection = Read-Host "Enter 1-4>"
    
            if ($SqlDumpTypeSelection -in 1,2,3,4)
            {
                break
            }
            Write-Host "`nPlease enter a valid type of memory dump!`n"
            Start-Sleep -Milliseconds 300
        }
    
        Write-Host ""
    
        switch ($SqlDumpTypeSelection)
        {
            "1" { $DumpType="0x0120"; break }
            "2" { $DumpType="0x0128"; break }
            "3" { $DumpType="0x8100"; break }
            "4" { $DumpType="0x01100"; break }
            default { "0x0120"; break }
        }
    }
    elseif ($ProductNumber -eq "2")  # SSAS dump
    {
        # ask what type of SSAS memory dump
        while($true)
        {
            Write-Host "Which type of memory dump would you like to generate?" -ForegroundColor Yellow
            Write-Host "1) Mini-dump"
            Write-Host "2) Full dump  " -NoNewline; Write-Host "(Do Not Use on Production systems!)" -ForegroundColor Red
            Write-Host ""
            $SSASDumpTypeSelection = Read-Host "Enter 1-2>"
    
            if ($SSASDumpTypeSelection -in 1,2)
            {
                break
            }
            Write-Host "`nPlease enter a valid type of memory dump!`n"
            Start-Sleep -Milliseconds 300
        }
    
        Write-Host ""
    
        switch ($SSASDumpTypeSelection)
        {
            "1" {$DumpType="0x0";break}
            "2" {$DumpType="0x34";break}
            default {"0x0120"; break}
        }
    }
    elseif ($ProductNumber -in 3,4,5)  # SSIS/SSRS/SQL Agent dump
    {
        # ask what type of SSIS memory dump
        while($true)
        {
            Write-Host "Which type of memory dump would you like to generate?" -ForegroundColor Yellow
            Write-Host "1) Mini-dump"
            Write-Host "2) Full dump"
            Write-Host ""
            $SSISDumpTypeSelection = Read-Host "Enter 1-2>"
    
            if ($SSISDumpTypeSelection -in 1,2)
            {
                break
            }
            Write-Host "`nPlease enter a valid type of memory dump!`n"
            Start-Sleep -Milliseconds 300
        }
    
        Write-Host ""
    
        switch ($SSISDumpTypeSelection)
        {
            "1" { $DumpType="0x0"; break }
            "2" { $DumpType="0x34"; break }
            default { "0x0120"; break }
        }
    }
    
    # Sqldumper.exe PID 0 0x0128 0 c:\temp
    # output folder
    while($OutputFolder -eq "" -or !(Test-Path -Path $OutputFolder))
    {
        Write-Host ""
        Write-Host "Where would your like the memory dump stored (output folder)?" -ForegroundColor Yellow
        $OutputFolder = Read-Host "Enter an output folder with no quotes (e.g. C:\MyTempFolder or C:\My Folder)"
        if ($OutputFolder -eq "" -or !(Test-Path -Path $OutputFolder))
        {
            Write-Host "'" $OutputFolder "' is not a valid folder. Please, enter a valid folder location" -ForegroundColor Yellow
        }
    }
    
    # strip the last character of the Output folder if it is a backslash "\". Else Sqldumper.exe will fail
    if ($OutputFolder.Substring($OutputFolder.Length-1) -eq "\")
    {
        $OutputFolder = $OutputFolder.Substring(0, $OutputFolder.Length-1)
        Write-Host "Stripped the last '\' from output folder name. Now folder name is  $OutputFolder"
    }
    
    # find the highest version of SQLDumper.exe on the machine
    $NumFolder = dir "C:\Program Files\Microsoft SQL Server\1*" | Select-Object @{name = "DirNameInt"; expression={[int]($_.Name)}}, Name, Mode | Where-Object Mode -Match "da*" | Sort-Object DirNameInt -Descending
    
    for( $j=0; $j -lt $NumFolder.Count; $j++)
    {
        $SQLNumfolder = $NumFolder.DirNameInt[$j]   # start with the highest value from sorted folder names - latest version of dumper
        $SQLDumperDir = "C:\Program Files\Microsoft SQL Server\" + $SQLNumfolder.ToString() + "\Shared\"
        $TestPathDumperDir = $SQLDumperDir + "sqldumper.exe"
    
        if (Test-Path -Path $SQLDumperDir)
        {
            break
        }
    }
    
    # build the SQLDumper.exe command e.g. (Sqldumper.exe 1096 0 0x0128 0 c:\temp\)
    
    $cmd = "$([char]34)"+$SQLDumperDir + "sqldumper.exe$([char]34)"
    $arglist = $SqlPidInt.ToString() + " 0 " +$DumpType +" 0 $([char]34)" + $OutputFolder + "$([char]34)"
    Write-Host "Command for dump generation: ", $cmd, $arglist -ForegroundColor Green
    
    # do-we-want-multiple-dumps section
    Write-Host ""
    Write-Host "This utility can generate multiple memory dumps, at a certain interval"
    Write-Host "Would you like to collect multiple memory dumps (2 or more)?" -ForegroundColor Yellow
    
    # validate Y/N input
    while ($true)
    {
        $YesNo = Read-Host "Enter Y or N>"
    
        if ($YesNo -in "y","n")
        {
            break
        }
        Write-Host "Not a valid 'Y' or 'N' response"
    }
    
    # get input on how many dumps and at what interval
    if ($YesNo -eq "y")
    {
        [int]$DumpCountInt=0
        while (1 -ge $DumpCountInt)
        {
            Write-Host "How many dumps would you like to generate for this $ProductStr ?" -ForegroundColor Yellow
            $DumpCountStr = Read-Host ">"
    
            if ([int]::TryParse($DumpCountStr, [ref]$DumpCountInt) -and $DumpCountInt -gt 1)
            {
                break
            }
            Write-Host "Please enter a number greater than one." -ForegroundColor Red
        }
    
        [int]$DelayIntervalInt=0
        while ($true)
        {
            Write-Host "How frequently (in seconds) would you like to generate the memory dumps?" -ForegroundColor Yellow
            $DelayIntervalStr = Read-Host ">"
    
            if ([int]::TryParse($DelayIntervalStr, [ref]$DelayIntervalInt) -and $DelayIntervalInt -gt 0)
            {
                break
            }
            Write-Host "Please enter a number greater than zero." -ForegroundColor Red
        }
    
        Write-Host "Generating $DumpCountInt memory dumps at a $DelayIntervalStr-second interval" -ForegroundColor Green
    
        # loop to generate multiple dumps
        $cntr = 0
        while ($true)
        {
            Start-Process -FilePath $cmd -Wait -Verb runAs -ArgumentList $arglist
            $cntr++
    
            Write-Host "Generated $cntr memory dump(s)." -ForegroundColor Green
    
            if ($cntr -ge $DumpCountInt)
            {
                break
            }
            Start-Sleep -S $DelayIntervalInt
        }
    
        # print what files exist in the output folder
        Write-Host ""
        Write-Host "Here are all the memory dumps in the output folder '$OutputFolder'" -ForegroundColor Green
        $MemoryDumps = $OutputFolder + "\SQLDmpr*"
        Get-ChildItem -Path $MemoryDumps
    
        Write-Host ""
        Write-Host "Process complete"
    }
    else # produce just a single dump
    {
        Start-Process -FilePath $cmd -Wait -Verb runAs -ArgumentList $arglist
    
        # print what files exist in the output folder
        Write-Host ""
        Write-Host "Here are all the memory dumps in the output folder '$OutputFolder'" -ForegroundColor Green
        $MemoryDumps = $OutputFolder + "\SQLDmpr*"
        Get-ChildItem -Path $MemoryDumps
    
        Write-Host ""
        Write-Host "Process complete"
    }
    
    Write-Host "For errors and completion status, review SQLDUMPER_ERRORLOG.log created by SQLDumper.exe in the output folder '$OutputFolder'.`nOr if SQLDumper.exe failed, look in the folder from which you are running this script."
    
  • Führen Sie sie über die Eingabeaufforderung als Administrator mithilfe des folgenden Befehls aus:

    Powershell.exe -File SQLDumpHelper.ps1
    
  • Oder führen Sie sie über die Windows PowerShell-Konsole aus, und führen Sie sie mithilfe des folgenden Befehls als Administrator aus:

    .\SQLDumpHelper.ps1
    

Notiz

Wenn Sie noch nie PowerShell-Skripts auf Ihrem System ausgeführt haben, wird möglicherweise die folgende Fehlermeldung angezeigt:

"Datei ... SQLDumpHelper.ps1 kann nicht geladen werden, da die Ausführung von Skripts auf diesem System deaktiviert ist."

Führen Sie die folgenden Schritte aus, um die Ausführung der Befehle zu ermöglichen:

  1. Starten Sie die Windows PowerShell-Konsole mithilfe der Option "Als Administrator ausführen". Nur Mitglieder der Gruppe "Administratoren" auf dem Computer können die Ausführungsrichtlinie ändern.

  2. Aktivieren Sie das Ausführen von nicht signierten Skripts mit dem folgenden Befehl:

    Set-ExecutionPolicy RemoteSigned
    

    Notiz

    Auf diese Weise können Sie nicht signierte Skripts ausführen, die Sie auf Ihrem lokalen Computer und signierten Skripts aus dem Internet erstellen.