Verwenden Sie das Sqldumper.exe-Tool, um eine Speicherabbilddatei 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 Speicherabbilddateien zu generieren.

Ursprüngliche Produktversion: 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

Zusammenfassung

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

In diesem Artikel werden auch zwei weitere Methoden zum Generieren von Speicherabbilddateien 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 Sqldumper.exe-Tool im Kontext des Ordners aus, in dem SQL Server das Tool ursprünglich installiert hat.

Standardmäßig lautet der Installationspfad von Sqldumper.exe SQLServerInstall Drive>:\Programme\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 mithilfe des tools Sqldumper.exe eine Speicherabbilddatei zu generieren:

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

    In diesem Ordnerpfad <ist number> ein Platzhalter für eine der folgenden Optionen:

    • 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 Ausführung starten> 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
    

    Hinweis

    In diesem Ordnerpfad ist number> derselbe Platzhalter, <der sich mit der SQL Server-Version ändert, wie weiter oben beschrieben.

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

    • Vollständige Speicherabbilddatei:

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

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

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

      Sqldumper.exe <ProcessID> 0 0x8100
      

    Hinweis

    <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 Sicherungsdatei in dem Ordner, in dem das Tool installiert ist.

Die von Sqldumper.exe generierte Sicherungsdatei weist ein Dateinamenmuster auf, das SQLDmpr<xxxx.mdmp> ähnelt.

In diesem Muster <ist xxxx> eine steigende Zahl, die basierend auf anderen Dateien bestimmt wird, die einen ähnlichen Dateinamen im selben Ordner haben. Wenn Sie bereits Über Dateien im Ordner mit Dateinamen im angegebenen Muster verfügen, müssen Sie möglicherweise das Datum und die Uhrzeit der Erstellung der Datei vergleichen, um die gewünschte Datei zu identifizieren.

Abrufen eines Microsoft Windows-Anwendungsprozessbezeichners

Um mithilfe des tools Sqldumper.exe eine Speicherabbilddatei zu generieren, benötigen Sie den Prozessbezeichner der Windows-Anwendung, für die Sie eine Speicherabbilddatei generieren möchten. So rufen Sie den Prozessbezeichner ab:

  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 dann OK.
  5. Notieren Sie sich den Prozessbezeichner der Windows-Anwendung, für die Sie eine Speicherabbilddatei generieren möchten. Notieren Sie sich für die SQL Server-Anwendung den Prozessbezeichner des Sqlservr.exe Prozesses.
  6. Schließen Sie den Task-Manager.

Alternativ können Sie die SQL Server Fehlerprotokolldatei verwenden, 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 danach Server process ID angezeigt wird, ist der Prozessbezeichner für den Sqlservr.exe Prozess.

Ausgabepfad für Speicherabbilddateien

SQLDumper.exe gibt es in erster Linie zum Generieren von Speicherabbilddateien für den SQL Server-Prozess in Szenarien, in denen ein Speicherabbild erforderlich ist, um bestimmte Probleme zu beheben (z. B. Ausnahmen, Asserts, nicht liefernde 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 SQL instance MSSQL\LOG\ gespeichert.

Ändern des Standardpfads

Wenn beispielsweise die Speicherabbilddatei zu groß ist, können Sie den Pfad wie folgt ändern:

  1. Öffnen Sie SQL Server-Konfigurations-Manager.
  2. Suchen Sie unter SQL Server Services den SQL Server instance, der 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 Speicherabbildverzeichnis in den gewünschten Pfad, und wählen Sie dann OK aus.
  5. Starten Sie SQL Server (wenn 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, kann die Speicherabbilddatei so groß sein wie der Speicher, den die Windows-Anwendung derzeit verwendet. Stellen Sie sicher, dass auf dem Laufwerk, auf das Sqldumper.exe die Speicherabbilddatei schreibt, ausreichend Speicherplatz verfügbar ist.

Angeben eines benutzerdefinierten Ausgabeordners im Befehl

Sie können das Verzeichnis angeben, in das das Sqldumper.exe-Tool die Speicherabbilddatei 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 als Speicherort für die Speicherabbilddatei. Im Folgenden finden Sie ein Beispiel für die Angabe des Speicherorts der Speicherabbilddatei der Minidumpdatei:

  1. Wählen Sie Ausführung starten> 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>
    

    Hinweis

    <MdumpPath> ist ein Platzhalter für das Verzeichnis, in das das Sqldumper.exe Tool die Speicherabbilddatei 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 Sqldumper.exe einige Minuten dauern, bis die Speicherabbilddatei generiert wird. Die benötigte Zeit hängt von den folgenden Variablen ab:

  • Die Menge an Arbeitsspeicher, die Sqlservr.exe derzeit verwendet.
  • Die Geschwindigkeit des Laufwerks, auf das das Tool die Speicherabbilddatei schreibt.

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

Berechtigungsanforderungen

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

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

Damit das Sqldumper.exe-Tool erfolgreich über Remotedesktop oder terminale Dienste funktioniert, müssen Sie Remotedesktop oder Terminaldienste im Konsolenmodus starten. Wenn Sie z. B. Remotedesktop im Konsolenmodus starten möchten, wählen Sie Ausführen starten> aus, geben Sie mstsc /console ein, und wählen Sie dann OK aus. Wenn auf dem Zielserver Windows 2000 ausgeführt wird, wird die Option /console im Hintergrund ignoriert. Sie können über Remotedesktop eine Verbindung mit dem Server herstellen, die Konsolensitzung wird jedoch nicht verwendet.

Wenn Sie feststellen, dass nach dem Ausführen von Sqldumper.exe keine Speicherabbilddatei im aktuellen Ordner generiert wurde, überprüfen Sie die Informationen, die das Tool in der Befehlszeile generiert hat, um die mögliche Ursache des Fehlers zu ermitteln. Diese Informationen werden auch in der Sqldumper_errorlog.log-Datei im aktuellen Verzeichnis protokolliert. Im Folgenden sind zwei mögliche Fehlermeldungen und deren Ursachen aufgeführt:

Nachricht Ursache
"Fehler bei OpenProcess 0x57 – Der Parameter ist falsch" Eine ungültige Prozess-ID wurde an das hilfsprogramm Sqldumper.exe übergeben.
"Ungültiger Wert für Thread-ID – <Ungültiger Parameterparameterfehler> " Ein ungültiger Parameter wurde an das hilfsprogramm Sqldumper.exe übergeben.

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

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

Auswirkungen der Speicherabbildgenerierung

Wenn eine Speicherabbilddatei eines Benutzermodusprozesses angefordert wird (wie in diesem Artikel 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 Speicherabbildinhalts auf das Dateiziel benötigt wird.

Fixiert bedeutet, dass der Prozess keine Benutzeranforderungen oder internen Vorgänge ausführen kann, einschließlich eines Ressourcenabfragemechanismus wie der Implementierung von IsAlive und Looks Alive von Windows Clustering (siehe Abschnitt Speicherabbilder bei Clusterfailovern ). Jedes Timeout, das auf der Wanduhrzeit basiert, kann auch aufgrund des Einfrierens verletzt werden.

Wie aus der vorherigen Anweisung abgeleitet werden kann, ist daher die Dauer des Einfrierens hier der kritische Faktor und wird durch Folgendes gesteuert:

  • Der Typ des ausgewählten Speicherabbilds .
  • Die Größe SQL Server Prozesses im Arbeitsspeicher, der bei einem einzelnen aktiven instance ausgeführten Standardparametern oft nahe am gesamten physischen RAM des Servers liegt.
  • Die Leistung des Datenträgers, der als Ziel für das Speicherabbild verwendet wird.

Darüber hinaus sollte die Größe der Speicherabbilddatei auf dem Datenträger geplant werden, insbesondere wenn mehrere Speicherabbilder möglich sind und wenn große, nicht standardmäßige Speicherabbildtypen ausgewählt werden. Überprüfen Sie unbedingt die Dumptypen , um zu wissen, was Sie erwarten können. Standardmäßig erstellen einige Speicherabbildmethoden das Speicherabbild im Ordner \Log SQL Server Instanz, der in der einfachen Standardkonfiguration auch Systemdatenträger und Daten- und Protokolldatenträger für SQL Server ist. Die Sättigung dieses Datenträgers hat schwerwiegende Auswirkungen auf SQL Server und/oder die Systemverfügbarkeit.

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 ein Ressourcenfailover in Always On Kontexten auslösen (sowohl Failovercluster instance als auch Verfügbarkeitsgruppe). Die Speicherabbildgenerierung verschiedener Prozesse wirkt sich auf Ressourcen unterschiedlich aus. Lesen Sie die Abschnitte Auswirkungen der Speicherabbildgenerierung und Sicherungstypen sorgfältig durch.

Beim Erfassen eines SQL Server-Speicherabbilds auf einem failoverclusterten instance oder einer Verfügbarkeitsgruppe (Verfügbarkeitsgruppe) instance von SQL Server kann für die gruppierte SQL Server oder Verfügbarkeitsgruppe ein Failover auf einen anderen Knoten ausgeführt werden, wenn die Ausführung des Speicherabbilds zu lange dauert. Dies kann besonders auf Systemen problematisch sein, die sehr große Mengen an RAM verwenden, oder wenn Sie ein gefiltertes oder vollständiges Speicherabbild generieren. Um ein Failover zu verhindern, verwenden Sie die folgenden Einstellungen, bevor Sie die Speicherabbilddatei erfassen. Die Änderung kann zurückgesetzt werden, nachdem eine Speicherabbilddatei erstellt wurde:

  • Für failoverclustered instance (FCI):
    • Klicken Sie im Clusteradministrator mit der rechten Maustaste auf SQL Server Ressource, und wählen Sie auf der Registerkarte Richtliniennicht 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 Wenn Ressource fehlschlägt, nicht neu starten ignoriert, und die Ressource wird trotzdem neu gestartet.
    • Ändern Sie auf der Registerkarte Eigenschaften den Wert FailureConditionLevel in Null.
  • Wenden Sie für Verfügbarkeitsgruppen 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 Sitzungstimeout (Sekunden) in 120 Sekunden. Weitere Informationen finden Sie unter Ändern des Session-Timeout Zeitraums 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 auf der Registerkarte Eigenschaften in manuelles Failover. Weitere Informationen finden Sie unter Ändern des Failovermodus eines Verfügbarkeitsreplikats (SQL Server).
    • Erhöhen Sie 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 Verfügbarkeitsgruppenressource, wählen Sie Eigenschaften aus, und wechseln Sie dann zur Registerkarte Eigenschaften , um beide Einstellungen zu ändern. Weitere Informationen finden Sie unter Konfigurieren von HealthCheckTimeout-Eigenschafteneinstellungen.

Produktverbesserungen zur Verringerung der Auswirkungen auf SQL Server

Den aktuellen Versionen von SQL Server wurden vier wichtige Verbesserungen hinzugefügt, um die Größe der Speicherabbilddatei und/oder die Zeit für die Generierung des Speicherabbilds zu reduzieren:

Bitmapfiltermechanismus

SQL Server weist eine Bitmap zu, die Speicherseiten nachverfolgt, die von einem gefilterten Speicherabbild ausgeschlossen werden sollen. Sqldumper.exe liest die Bitmap und filtert Seiten heraus, ohne dass andere Speicher-Manager-Metadaten 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. Das Ablaufverfolgungsflag T8089 gilt nicht mehr und wird ignoriert, wenn es aktiviert ist. Die Bitmapfilterung kann über T8095 deaktiviert werden.
  • SQL Server 2019

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

Beseitigung wiederholter Speicherabbilder für dasselbe Problem

Wiederholte Speicherabbilder für dasselbe Problem werden beseitigt. Mithilfe einer Stapelsignatur verfolgt die SQL-Engine, ob bereits eine Ausnahme aufgetreten ist, und erzeugt kein neues Speicherabbild, wenn bereits ein Speicherabbild vorhanden ist. Dies gilt für Zugriffsverletzungen, Stapelüberlauf, Asserts und Indexbeschädigungsausnahmen. Dadurch wird der von Speicherabbildern belegte Speicherplatz erheblich reduziert, und der Prozess zum Generieren eines Speicherabbilds wird nicht vorübergehend fixiert. Diese wurde SQL Server 2019 hinzugefügt.

Gekürzte Ausgabe im Fehlerprotokoll

Der Inhalt, der im SQL Server Fehlerprotokolls aus einem einzelnen Speicherabbild generiert wird, kann nicht nur überwältigend sein, sondern auch den Prozess der Generierung eines Speicherabbilds aufgrund der Zeit verlangsamen, die für die Serialisierung all dieser Informationen in ein Textformat im Fehlerprotokoll erforderlich ist. In SQL Server 2019 wurde der Inhalt, der bei der Generierung des Speicherabbilds im Fehlerprotokoll gespeichert wurde, erheblich reduziert, und er 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 haben SQL Server Informationen für jede Sitzung oder jeden Thread ausgegeben, wenn z. B. ein manuelles Speicherabbild vom Benutzer ausgelöst wurde.

Parallele Komprimierung von Speicherabbildern

Um Speicherabbilder schneller zu generieren und verkleinern zu können, wurde in SQL Server 2022 CU8 und SQL Server 2019 CU23 ein Feature für komprimierte Speicherabbilder eingeführt. Bei aktivierung erstellt Sqldumper.exe mehrere Threads, um den Arbeitsspeicher eines Prozesses gleichzeitig zu lesen, komprimiert ihn und speichert ihn dann in der Speicherabbilddatei. Diese Multithread-, parallele Komprimierung reduziert die Dateigröße und beschleunigt den Dumpingprozess bei Verwendung mit vollständigen und gefilterten Dumps.

Sie können das Ablaufverfolgungsflag 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 Ihrem SQL Server instance als 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 zum Erstellen des komprimierten Speicherabbilds verwenden können, indem Sie den -cpu:X Parameter verwenden, 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

Es ist bekannt, dass die folgenden Faktoren Verzögerungen verursachen oder die Erstellung von Speicherabbildern verhindern.

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

Speicherabbildtypen

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

Miniabbilder mit referenziertem Speicher

Diese Art von Speicherabbild ist eine Momentaufnahme aller aktiven Threads des Prozesses ("Threadstapel"), zusammen mit einer begrenzten Extraktion des Arbeitsspeichers, auf den die Threadstapel und einige andere Schlüsselprozesse oder Threaddaten verweisen. Sie sind in der Regel ein paar Megabyte groß und lassen sich schnell generieren (von weniger als einer Sekunde bis zu einigen Sekunden). Selbst größere Serversysteme (mit Hunderten von CPU-Instanzen, die indirekt eine große Anzahl von Threads in SQL Server Prozess steuern) überschreiten selten 20-30 MB: Die Größe eines Minidumps wächst nicht mit der Größe SQL Server Prozesses. Dieser Speicherabbildtyp ist der Standardtyp, der von SQL Server beim automatischen Generieren von Speicherabbildern bei Ausnahmen, Schedulerproblemen, Latchproblemen, Datenbankbeschädigungen, Asserts verwendet wird.

Hinweis

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

Vollständige Speicherabbilder

Ein vollständiges Speicherabbild ist eine vollständige Kopie des aktiven Zielprozessbereichs. Dies würde daher den gesamten Threadzustand, den gesamten prozesszugeteilten Arbeitsspeicher und alle geladenen Module umfassen. Vollständige Speicherabbilder haben daher eine Größe, die in etwa mit SQL Server Prozess identisch ist, der wiederum fast so groß sein kann wie der gesamte System-RAM. Auf großen Servern, die einem einzelnen SQL Server instance zugeordnet sind, kann dies eine Datei bedeuten, die mehrere Hundert Gigabyte oder mehr umfasst. Unnötig zu sagen, dass es lange dauert, eine solche Datei zu generieren und führt daher zu einem längeren Einfrieren. Die Datenträgerleistung für das Dateiziel des Speicherabbilds wirkt sich erheblich auf die Dauer des Einfrierens aus. Diese Art von Speicherabbild wird heutzutage selten für SQL Server verwendet, wie in der folgenden Erklärung beschrieben.

Gefilterte Speicherabbilder

Wenn die RAM-Größe typischer Server, auf denen SQL Server ausgeführt werden, stetig zunimmt, werden vollständige Speicherabbilder unübersichtlicher. Gefilterte Speicherabbilder werden daher implementiert. Ein gefiltertes Speicherabbild ist eine Teilmenge eines vollständigen Speicherabbilds, bei dem große Bereiche SQL Server Arbeitsspeichers während der Ausführung ausgeschlossen und nicht auf den Datenträger geschrieben werden. In der Regel bringt der ausgeschlossene Arbeitsspeicher keinen Mehrwert für die Problembehandlung. Beispiele hierfür sind Daten-/Indexseiten und einige interne Caches wie Hekaton-Datenseiten und Protokollpoolspeicher. Dieses gefilterte Speicherabbild führt zu einer kleineren Datei als ein vollständiges Speicherabbild, aber das Speicherabbild behält immer noch fast seinen gesamten Nutzen bei. Gefilterte Speicherabbilder haben vollständige Speicherabbilder als bevorzugte Option in den meisten Fällen ersetzt, in denen Minidumps nicht ausreichen. Die Verringerung 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 % der SQL Server Prozessgröße beträgt. Daher ist es am besten, eine mögliche Größe so groß wie eine vollständige Deponie als schlechteste Option zu planen, was eine gute Sicherheitsmarge hinterlässt. Ein gefiltertes Speicherabbild ist möglicherweise nicht in jedem Fall schneller zu generieren als ein vollständiges Speicherabbild: Es ist eine Frage, ob die Gewinne im Zusammenhang mit der Anzahl der vermiedenen E/A die zum Implementieren der Filterlogik erforderliche Zeit überschreiten (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 Speicherabbilds zu erhalten. Obwohl erwartet wird, dass die meisten Daten- oder Indexseiten aus dem Speicherabbild ausgeschlossen werden, werden diejenigen, die ausschließlich latched und geändert werden, nicht weggelassen.

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 jede Microsoft Windows-Anwendung zu generieren, können Sie die Option für gefilterte Speicherabbilder verwenden. Eine gefilterte Speicherabbilddatei ist jedoch nur im Kontext von SQL Server anwendbar und sinnvoll. Sie können weiterhin ein Minidump, 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 für den Prozess Ausnahmen auftreten. SQL Server übergibt Parameter an Sqldumper.exe. Sie können Ablaufverfolgungsflags verwenden, um die Parameter zu ändern, die SQL Server standardmäßig an das Tool übergibt, wenn eine Ausnahme oder Assertion auftritt. Diese Ablaufverfolgungsflags liegen im Bereich von 2540 bis 2559. Sie können eines dieser Ablaufverfolgungsflags verwenden, um den Standardabbildtyp zu ändern, SQLDumper.exe generieren (der Standardwert ist ein Minidump mit referenziertem Speicher). Zum Beispiel:

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

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

Generieren eines Speicherabbilds bei Clusterfailovern

In Clusterfailoverszenarien kann die SQL Server Ressourcen-DLL vor dem Failover eine Sicherungsdatei abrufen, um die Problembehandlung zu unterstützen. Wenn die SQL Server Ressourcen-DLL feststellt, dass bei einer SQL Server Ressource ein Fehler aufgetreten ist, verwendet die SQL Server-Ressourcen-DLL das Hilfsprogramm Sqldumper.exe, um eine Speicherabbilddatei des SQL Server Prozesses abzurufen. Um sicherzustellen, dass das Sqldumper.exe-Tool die Speicherabbilddatei erfolgreich generiert, müssen Sie die folgenden drei Eigenschaften als Voraussetzungen festlegen:

  • SqlDumperDumpTimeOut

    Ein vom Benutzer angegebenes Timeout. Die Ressourcen-DLL wartet auf den Abschluss der Speicherabbilddatei, 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, können Sqldumper.exe die Sicherungsdatei nicht generieren. Eine Warnmeldung wird sowohl im Ereignisprotokoll als auch im Clusterprotokoll protokolliert, sobald die Ressource online geschaltet wird.

Clusterkonfiguration für SQLDumper unter 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 einen benannten instance 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 wurden, können Sie den folgenden PowerShell-Befehl ausführen:

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

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

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

  1. Wählen Sie Ausführung starten> 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 Art von 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 instance

          cluster resource "SQL Server (INSTANCE1)" /priv SqlDumperDumpFlags = 0x01100
          
      • Minidumpdatei für alle Threads

        • Standardinstanz

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

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

        • Standardinstanz

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

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

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

      Hinweis

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

    • Die SqlDumperDumpTimeOut-Eigenschaft

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

      Hinweis

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

Die Zeit, die das Tool benötigt, um eine Speicherabbilddatei eines SQL Server Prozesses zu generieren, hängt von der Computerkonfiguration ab. Für einen Computer, der über viele Speicher verfügt, kann die Zeit erheblich sein. Um eine Schätzung der Zeit zu erhalten, die der Prozess benötigt, verwenden Sie das tool Sqldumper.exe, 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 wurden, 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 Eigenschaften des Sqldumper.exe Tools für das Clusterfailover zu entfernen:

  1. Wählen Sie Ausführung starten> 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 instance

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

      • Standardinstanz

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

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

      • Standardinstanz

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

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

Verwenden von DBCC STACKDUMP

Der DBCC STACKDUMP Befehl kann Ihnen beim Erstellen eines Speicherabbilds im LOG-Verzeichnis Ihrer SQL Server instance Installation helfen. Der Befehl erstellt standardmäßig einen Minidump mit allen Threads, der eine begrenzte Größe aufweist und geeignet ist, den Zustand SQL Server Prozesses widerzuspiegeln. Führen Sie den folgenden Befehl in einem SQL Server Client aus:

DBCC STACKDUMP

Informationen zur erweiterten Funktionalität von DBCC STACKDUMP in 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 Speicherabbilds zu aktivieren, aktivieren Sie die Ablaufverfolgungsflags 2551 mit dem folgenden Befehl:

DBCC TRACEON(2551, -1)
GO
DBCC STACKDUMP

Verwenden Sie zum Erstellen eines vollständigen Speicherabbilds das Ablaufverfolgungsflag 2544.

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

DBCC TRACEOFF(2551, -1)

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

DBCC TRACESTATUS(-1)

Ein leeres Resultset gibt an, dass kein Ablaufverfolgungsflag aktiv ist. Wenn dagegen 2551 noch aktiv ist, sehen Sie Folgendes:

TraceFlag Status Global Sitzung
2551 1 1 0

Hinweis

Die traceflag von aktivierten DBCC TRACEON 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 Befehl erweitert, um das DBCC STACKDUMP Generieren von Dumps verschiedener Typen zu unterstützen: Mini-, gefilterte und vollständige Speicherabbilder. Durch diesen Befehl ist die Verwendung von Ablaufverfolgungsflags nicht mehr erforderlich. Außerdem können Sie die Textausgabe in der anderen Textdatei einschränken, die mit dem Speicherabbild generiert wird. Dies kann zu einem sichtbaren Leistungsgewinn in der Zeit führen, die SQLDumper.exe benötigt wird, um ein Speicherabbild zu generieren.

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

Ist TEXT_DUMP = LIMITED die Standardoption. Wenn Sie eine ausführliche Ausgabe in der SQLDump000X.txt-Datei erhalten möchten, können Sie verwenden TEXT_DUMP = DETAILED.

Führen Sie den folgenden Befehl aus, um ein gefiltertes Speicherabbild 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 Sicherungsdatei 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 aus, indem Sie den folgenden Befehl verwenden:

    Powershell.exe -File SQLDumpHelper.ps1
    
  • Oder führen Sie sie über Windows PowerShell Konsole aus, und führen Sie sie mit dem folgenden Befehl als Administrator aus:

    .\SQLDumpHelper.ps1
    

Hinweis

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

"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 aktivieren:

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

  2. Aktivieren Sie die Ausführung von nicht signierten Skripts mit dem folgenden Befehl:

    Set-ExecutionPolicy RemoteSigned
    

    Hinweis

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