Verwenden Sie das Tool Sqldumper.exe zum Generieren einer Dumpdatei 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 die Befehlszeilenoptionen für SQLDumper.exe.
  • 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 im Ordner 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 den Ordner <SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\<number>\Shared.

    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, 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 <number> 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 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 (Prozess-ID)", 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 nach Server process ID erscheint, 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, Assertions oder nicht reagierende 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 der SQL-Instanz MSSQL\LOG\ 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 eine beliebige 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.

Benutzerdefinierten Ausgabeordner im Befehl angeben

Sie können das Verzeichnis angeben, in dem das Sqldumper.exe Tool die Dumpdatei speichern 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, 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 im aktuellen Ordner geschrieben.

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

  • Die Speichermenge, die Sqlservr.exe derzeit belegt.
  • Schreibgeschwindigkeit des Laufwerks, das das Tool zum Speichern der Dumpdatei verwendet.

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, geben Sie mstsc /console ein, und wählen Sie dann OK aus. Wenn der Zielserver Windows 2000 ausführt, wird die Option /console stillschweigend 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 fehlgeschlagen 0x57 - Der Parameter ist falsch An das Hilfsprogramm Sqldumper.exe wurde eine ungültige Prozess-ID übergeben.
Ungültiger Wert für Thread-ID - <ungültiger Parameter> 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 Callback-Typ während minidump 6
  • Unbekannter Callback-Typ 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 und keinen internen Vorgang ausführen kann, einschließlich eines beliebigen Mechanismus für die Ressourcenabfrage, wie etwa der Implementierung von IsAlive und Looks Alive von Windows Clustering (weitere Informationen zur Behandlung dieser Situation finden Sie im Abschnitt „Speicherabbilder bei Clusterfailovern“). Jedes Timeout, das auf die Systemzeit angewiesen ist, kann auch aufgrund des Einfrierens überschritten werden.

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

  • Der ausgewählte Dump-Typ.
  • Die Größe des SQL Server-Prozesses im Arbeitsspeicher, der bei einer einzelnen aktiven Instanz, die mit Standardparametern ausgeführt wird, 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 bei der Planung berücksichtigt werden, insbesondere wenn mehrere Speicherabbilder möglich 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 den Dump im Ordner \Log der SQL Server-Instanz, der in der einfachen Standardkonfiguration auch der Systemdatenträger sowie der Daten- und Protokolldatenträger für SQL Server ist. Wenn dieser Datenträger ausgelastet wird, hat dies schwerwiegende Auswirkungen auf die VERFÜGBARKEIT von SQL Server und/oder System.

Verwalten der Auswirkungen auf Cluster-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, führt der geclusterte SQL Server bzw. die AG möglicherweise ein Failover auf einen anderen Knoten durch, 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 wiederhergestellt werden, nachdem eine Speicherabbilddatei erstellt wurde:

  • Für Failoverclusterinstanz (FCI):
    • Klicken Sie mit der rechten Maustaste auf die SQL Server-Ressource im Clusteradministrator, wählen Sie auf der Registerkarte „Richtlinien“ die Option „Bei Ressourcenfehler nicht neu starten“ aus.
    • 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 Bei Ressourcenfehler nicht neu starten 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 neueren 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 einschließlich CU15 nicht verfügbar.
    • In SQL Server 2017 CU16 können Sie die Bitmapfilterung über T8089 aktivieren und durch Deaktivieren von T8089 deaktivieren.
    • Ab SQL Server 2017 CU20 ist die Bitmapfilterung standardmäßig aktiviert. Das Traceflag T8089 wird nicht mehr angewendet und wird ignoriert, wenn es 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.

Vermeidung wiederholter Dumps für dasselbe Problem

Wiederholte Speicherauszüge für dasselbe Problem werden beseitigt. Bei Verwendung einer Stack-Signatur verfolgt die SQL-Engine nach, ob bereits eine Ausnahme aufgetreten ist, und erzeugt keinen neuen Speicherabbild-Dump, wenn bereits einer vorhanden ist. Dies gilt für Zugriffsverletzungen, Stapelüberlauf, Assertionen und Indexbeschädigungsausnahmen. Dadurch wird die Menge an Festplattenspeicher reduziert, der für Speicherabbilder verwendet wird, und der Prozess wird nicht vorübergehend eingefroren, 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 die Erstellung eines Speicherabbilds aufgrund der Zeit verlangsamen, die erforderlich ist, um alle diese Informationen im Fehlerprotokoll als Text 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 druckte SQL Server Informationen für jede Sitzung oder jeden Thread, 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 den Speicher und speichert ihn dann in der Speicherabbilddatei. Diese Multithread-Parallelkomprimierung reduziert die Dateigröße und beschleunigt den Dumpingprozess bei Verwendung mit vollständigen und gefilterten Dumps.

Sie können das Traceflag 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 dafür bekannt, Verzögerungen zu verursachen oder die Erstellung von Speicherabbildern zu verhindern.

  • Der E/A-Pfad, in den Speicherabbilder geschrieben werden, arbeitet langsam. In solchen Fällen ist die Untersuchung und Behebung von Datenträger-E/A-Leistungsproblemen der nächste logische Schritt.
  • Eine Antivirensoftware oder eine andere Überwachungssoftware beeinträchtigt SQLDumper.exe. In einigen Fällen leitet Software von Drittanbietern die Funktion ReadProcessMemory um. 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.

Dump-Typen

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

Minidumps mit referenziertem Speicher

Dieser Speicherabbildtyp ist eine Momentaufnahme aller aktiven Threads des Prozesses ("Threadstapel"), zusammen mit einem begrenzten Auszug des Speichers, auf den die Threadstapel verweisen, sowie einigen anderen wichtigen Prozess- oder Threaddaten. 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 CPUs, die indirekt zu einer massiven Anzahl von Threads im SQL Server-Prozess führen) ü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, Schedulerprobleme, Latch-Probleme, Datenbankbeschädigungen und Assertionen generiert werden.

Notiz

SQL Server generiert im Rahmen der integrierten Instrumentierung in bestimmten Situationen automatisierte „diagnostische Minidumps“. Dieser Vorgang gilt daher als sicher genug, damit SQL Server ihn bei Bedarf automatisch auslösen kann.

vollständige Speicherabbilder

Ein vollständiger Speicherauszug ist eine vollständige Kopie des Adressraums des aktiven Zielprozesses. Dies würde daher alle Threadzustände, den gesamten dem Prozess zugewiesenen Arbeitsspeicher und alle geladenen Module umfassen. Vollständige Dumps weisen daher eine Größe auf, die ungefähr so groß wie der SQL Server-Prozess ist, was wiederum fast so groß wie der gesamte System-RAM sein kann. Auf großen Servern, die einer einzelnen SQL Server-Instanz zugeordnet sind, kann das eine Datei bedeuten, die mehrere hundert Gigabyte groß ist oder mehr. Es versteht sich von selbst, dass die Erstellung einer solchen Datei lange dauert und daher ein längeres Einfrieren verursacht. Die Datenträgerleistung für das Dateiziel des Dumps wirkt sich erheblich auf die Dauer des Einfrierens aus. Diese Art von Dump wird heutzutage selten für SQL Server verwendet, wie in der folgenden Erläuterung beschrieben.

Gefilterte Speicherabbilder

Da die RAM-Größe typischer Server, auf denen SQL Server ausgeführt wird, stetig zunimmt, werden vollständige Dumps unübersichtlicher. Gefilterte Dumps sind daher implementiert. Ein gefiltertes Speicherabbild 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 für die Problembehandlung. Beispiele sind Daten-/Indexseiten und einige interne Caches wie Hekaton-Datenseiten und Log Pool-Speicher. Diese gefilterte Sicherung führt zu einer kleineren Datei als eine vollständige Sicherung, aber die Sicherung bleibt fast vollständig nutzbar. Gefilterte Dumps haben vollständige Dumps als bevorzugte Option in der überwiegenden Mehrheit der Fälle ersetzt, in denen Miniabbilder nicht ausreichen. Die Größenreduzierung 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, für eine mögliche Größe so groß wie ein vollständiges Dump im schlimmsten Fall 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-Vorgänge die Zeit überschreiten, die zum Implementieren der Filterlogik erforderlich ist (Datenträgergeschwindigkeit und CPU/RAM-Geschwindigkeit beeinflussen 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 mit einem Latch versehen sind 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 erfolgreich ein Miniabbild oder eine vollständige Speicherabbilddatei für SQL Server oder Nicht-SQL Server-Anwendungen generieren.

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

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

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

Speicherabbild bei Cluster-Failovern generieren

In Clusterfailoverszenarien kann die SQL Server-Ressourcen-DLL eine Speicherabbilddatei erstellen, bevor das Failover auftritt, um die Problembehandlung zu unterstützen. Wenn die Ressourcen-DLL 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 fertiggestellt wurde, 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 oder frühere Versionen

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

  1. Wählen Sie Start>Ausführen, 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 Eingabe:
    • 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 EINGABETASTE:

      • Vollständige Thread-Dump-Datei

        • Standardinstanz

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

          cluster resource "SQL Server (INSTANCE1)" /priv SqlDumperDumpFlags = 0x01100
          
      • Miniabbilddatei aller Threads

        • Standardinstanz

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

          cluster resource "SQL Server (INSTANCE1)" /priv SqlDumperDumpFlags = 0x0120
          
      • Alle Thread-Dump-Dateien 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 Dumpdatei zu generieren. Die gültigen Werte für die SqlDumperDumpTimeOut Eigenschaft reichen von 10.000 ms bis 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

Sqldumper.exe-Eigenschaften für Clusterfailover entfernen

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
        
    • Das SqlDumperDumpPath-Attribut.

      • 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, der eine begrenzte Größe hat und ausreicht, um den Status des SQL Server-Prozesses widerzuspiegeln. Führen Sie den folgenden Befehl in einem SQL Server-Client aus:

DBCC STACKDUMP

Zur erweiterten Funktionalität von DBCC STACKDUMP in SQL Server 2019 siehe Erweiterte DBCC STACKDUMP-Funktionalität, die in SQL Server 2019 eingeführt wurde.

Damit diese Methode einen gefilterten Dump erstellen kann, aktivieren Sie die Traceflags 2551 mithilfe des folgenden Befehls:

DBCC TRACEON(2551, -1)
GO
DBCC STACKDUMP

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

Nachdem Sie die Speicherabbilddatei abgerufen haben, sollten Sie das Traceflag 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 Traceflag, das Sie zuvor wie 2551 oder 2544 aktiviert haben. Zum Beispiel:

DBCC TRACEOFF(2551, -1)

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

DBCC TRACESTATUS(-1)

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

TraceFlag Status Global Sitzung
2551 1 1 0

Notiz

Die durch DBCC TRACEON aktivierten traceflag werden nach einem Dienstneustart zurückgesetzt (entfernt).

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

Ab SQL Server 2019 CU2 wurde der DBCC STACKDUMP-command 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 Traceflags. Außerdem können Sie die Textausgabe in der anderen Textdatei einschränken, die mit dem Speicherabbild generiert wird. Dies kann zu einer spürbaren Verkürzung 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]

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

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:

    Code-Details

    $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 erstellen, sowie signierte Skripts aus dem Internet.