Verwenden des tools Sqldumper.exe zum Generieren einer Speicherabbilddatei in SQL Server
Dieser Artikel enthält allgemeine Richtlinien für das in SQL Server enthaltene Sqldumper.exe-Tool. 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:
Öffnen Sie <SQLServerInstall Drive>:\Programme\Microsoft SQL Server\<number>\Shared folder.
In diesem Ordnerpfad <ist number> 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
Stellen Sie sicher, dass sich die Dbghelp.dll-Datei in diesem Ordner befindet.
Wählen Sie Ausführung starten> aus, geben Sie cmd ein, und wählen Sie dann OK aus.
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.
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 auch von SQL Server standardmäßig 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 der Ordner Dateien enthält, die dem angegebenen Muster entsprechen, sollten Sie deren Erstellungsdaten und -uhrzeiten vergleichen, um die gewünschte Datei zu finden.
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:
- Drücken Sie STRG+ALT+ENTF, und wählen Sie Task-Manager aus.
- Wählen Sie im Dialogfeld Windows-Task-Manager die Registerkarte Prozesse aus.
- Wählen Sie im Menü Ansicht die Option Spalten auswählen aus.
- Aktivieren Sie im Dialogfeld Spalten auswählen das Kontrollkästchen PID (Prozessbezeichner) und dann OK.
- 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.
- 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 in erster Linie Speicherabbilddateien für den SQL Server-Prozess generiert, wenn ein Speicherabbild erforderlich ist, um bestimmte Probleme zu beheben, z. B. Ausnahmen, Assertionen oder 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 MSSQL\LOG\ der SQL-Instanz gespeichert.
Ändern des Standardpfads
Wenn z. B. die Speicherabbilddatei zu groß ist, können Sie den Pfad ändern, indem Sie die folgenden Schritte ausführen:
- Öffnen Sie den SQL Server-Konfigurations-Manager.
- Suchen Sie unter SQL Server-Dienste die SQL Server-Instanz, die untersucht wird.
- Klicken Sie mit der rechten Maustaste auf diesen Eintrag, wählen Sie Eigenschaften aus, und wechseln Sie dann zur Registerkarte Erweitert .
- Ändern Sie dieses Speicherabbildverzeichnis in den gewünschten Pfad, und wählen Sie dann OK aus.
- 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 (Universal Naming Convention) als Speicherort für die Speicherabbilddatei. Die folgenden Schritte enthalten ein Beispiel für die Angabe des Speicherorts der Minidumpdatei:
Wählen Sie Ausführung starten> aus, geben Sie cmd ein, und wählen Sie dann OK aus.
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
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 Schreibgeschwindigkeit des Laufwerks, das vom Tool zum Speichern der Speicherabbilddatei verwendet wird.
Während dieser Zeit verarbeitet das Sqldumper.exe-Tool keine Befehle. Sie werden feststellen, dass der Server nicht mehr reagiert. Darüber hinaus kann ein Clusterfailover auftreten.
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 im aktuellen Ordner nach dem Ausführen von Sqldumper.exe keine Speicherabbilddatei 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. 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 in sein 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.
Basierend auf der vorherigen Aussage ist die Dauer des Einfrierens hier der kritische Faktor, der von folgendem gesteuert wird:
- Der Typ des ausgewählten Speicherabbilds .
- Die Größe des SQL Server-Prozesses im Arbeitsspeicher, der im Fall einer einzelnen aktiven Instanz, die Standardparameter ausführt, häufig in der Nähe des 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 der SQL Server-Instanz, der in der einfachen Standardkonfiguration auch Systemdatenträger und Daten-/Protokolldatenträger für SQL Server ist. Die Sättigung dieses Datenträgers hat schwerwiegende Auswirkungen auf die SQL Server- und/oder 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 (sowohl Failoverclusterinstanz als auch Verfügbarkeitsgruppe) auslösen. Die Speicherabbildgenerierung verschiedener Prozesse wirkt sich auf Ressourcen unterschiedlich aus. Lesen Sie die Abschnitte Auswirkungen der Speicherabbildgenerierung und Sicherungstypen sorgfältig durch.
Wenn Sie ein SQL Server-Speicherabbild auf einer Failoverclusterinstanz oder einer Verfügbarkeitsgruppeninstanz von SQL Server erfassen, kann für die gruppierte SQL Server- oder Verfügbarkeitsgruppe ein Failover auf einen anderen Knoten ausgeführt werden, wenn die Sicherung zu lange dauert. Dies kann besonders auf Systemen problematisch sein, die 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 Failoverclusterinstanzen (FCI):
- Klicken Sie im Clusteradministrator mit der rechten Maustaste auf SQL Server-Ressource, und wählen Sie auf der Registerkarte Richtliniendie Option Wenn die Ressource fehlschlägt, 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 Wenn ressource fehlschlägt, 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 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).For more information, see Change the Failover Mode of an Availability Replica (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
- Beseitigung wiederholter Speicherabbilder für dasselbe Problem
- Gekürzte Ausgabe im Fehlerprotokoll
- Parallele Komprimierung von Speicherabbildern
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 in SQL Server 2019 RTM standardmäßig 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. Dies wurde in SQL Server 2019 hinzugefügt.
Gekürzte Ausgabe im Fehlerprotokoll
Der Inhalt, der im SQL Server-Fehlerprotokoll 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 ist, 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.
Bisher hat 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 zu verkleinern, wurde in SQL Server 2022 CU8 und SQL Server2019 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 Ihrer SQL Server-Instanz als Startparameter hinzufügen -T2610
, damit 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. 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üsselprozess- 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 im SQL Server-Prozess steuern) überschreiten selten 20-30 MB: Die Größe eines Minidumps nimmt nicht mit der Größe des SQL Server-Prozesses zu. Dieser Speicherabbildtyp ist der Standardtyp, der von SQL Server beim automatischen Generieren von Speicherabbildern bei Ausnahmen, Schedulerproblemen, Latchproblemen, Datenbankbeschädigungen und Assertionen verwendet wird.
Hinweis
SQL Server generiert als Teil 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 dem SQL Server-Prozess entspricht, der wiederum fast so groß sein kann wie der gesamte System-RAM. Auf großen Servern, die für eine einzelne SQL Server-Instanz reserviert 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 wird, 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 des SQL Server-Arbeitsspeichers dynamisch 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 Prozent 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 unbedingt 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). Beispiel:
- Ablaufverfolgungsflag 2551: Erzeugt ein gefiltertes Speicherabbild.
- Ablaufverfolgungsflag 2544: Erzeugt ein vollständiges Speicherabbild.
- Ablaufverfolgungsflag 8026: SQL Server löscht einen Speicherabbildtrigger, 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, erstellt SQL Server ein vollständiges Speicherabbild.
Generieren eines Speicherabbilds bei Clusterfailovern
In Clusterfailoverszenarien kann die SQL Server-Ressourcen-DLL vor dem Failover eine Speicherabbilddatei 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 Sicherungsdatei, 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. 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. 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 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:
- Wählen Sie Ausführung starten> aus, geben Sie cmd ein, und wählen Sie dann OK aus.
- Geben Sie für jede Eigenschaft den entsprechenden Befehl an der Eingabeaufforderung ein, und drücken Sie dann die EINGABETASTE:
Die
SqlDumperDumpFlags
-EigenschaftUm die
SqlDumperDumpFlags
Eigenschaft für eine bestimmte Speicherabbilddatei festzulegen, geben Sie den entsprechenden Befehl an der Eingabeaufforderung ein, und drücken Sie dann die EINGABETASTE:Vollständige Threadabbilddatei
Standardinstanz
cluster resource "SQL Server" /priv SqlDumperDumpFlags = 0x01100
Benannte Instanz
cluster resource "SQL Server (INSTANCE1)" /priv SqlDumperDumpFlags = 0x01100
Minidumpdatei für alle Threads
Standardinstanz
cluster resource "SQL Server" /priv SqlDumperDumpFlags = 0x0120
Benannte Instanz
cluster resource "SQL Server (INSTANCE1)" /priv SqlDumperDumpFlags = 0x0120
Alle Threadabbilddatei gefiltert
Standardinstanz
cluster resource "SQL Server" /priv SqlDumperDumpFlags = 0x8100
Benannte Instanz
cluster resource "SQL Server (INSTANCE1)" /priv SqlDumperDumpFlags = 0x8100
Die
SqlDumperDumpPath
-Eigenschaftcluster 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
-Eigenschaftcluster 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 mit einer großen Menge an Arbeitsspeicher kann die Zeit erheblich sein. Um die für den Prozess benötigte Zeit zu schätzen, verwenden Sie das tool Sqldumper.exe, um eine Speicherabbilddatei manuell zu generieren. Die gültigen Werte für die SqlDumperDumpTimeOut
Eigenschaft liegen zwischen 10.000 ms und MAXDWORD. MAXDWORD stellt den höchsten Wert im Bereich des DWORD-Datentyps (4294967295) dar.
Um zu überprüfen, ob die Einstellungen aktiviert sind, können Sie den folgenden Befehl ausführen:
cluster resource "SQL Server" /priv
Entfernen Sqldumper.exe Eigenschaften für clusterfailover
Führen Sie die folgenden Schritte aus, um die Eigenschaften des Sqldumper.exe Tools für das Clusterfailover zu entfernen:
Wählen Sie Ausführung starten> aus, geben Sie cmd ein, und wählen Sie dann OK aus.
Geben Sie für eine bestimmte Eigenschaft den entsprechenden Befehl an der Eingabeaufforderung ein, und drücken Sie dann die EINGABETASTE:
Die
SqlDumperDumpFlags
-EigenschaftStandardinstanz
cluster resource "SQL Server" /priv:SqlDumperDumpFlags /usedefault
Benannte Instanz
cluster resource "SQL Server (INSTANCE1)" /priv:SqlDumperDumpFlags /usedefault
Die
SqlDumperDumpPath
-EigenschaftStandardinstanz
cluster resource "SQL Server" /priv:SqlDumperDumpPath /usedefault
Benannte Instanz
cluster resource "SQL Server (INSTANCE1)" /priv:SqlDumperDumpPath /usedefault
Die
SqlDumperDumpTimeOut
-EigenschaftStandardinstanz
cluster resource "SQL Server" /priv:SqlDumperDumpTimeOut /usedefault
Benannte Instanz
cluster resource "SQL Server (INSTANCE1)" /priv:SqlDumperDumpTimeOut /usedefault
Verwenden von DBCC STACKDUMP
Der DBCC STACKDUMP
Befehl kann Ihnen helfen, ein Speicherabbild im LOG-Verzeichnis Ihrer SQL Server-Instanzinstallation zu erstellen. Der Befehl erstellt standardmäßig einen Minidump mit allen Threads, der eine begrenzte Größe aufweist und für den Zustand des SQL Server-Prozesses geeignet ist. Führen Sie den folgenden Befehl in einem SQL Server-Client aus:
DBCC STACKDUMP
Informationen zu erweiterten Funktionen 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 erhalten haben, sollten Sie das Ablaufverfolgungsflag mithilfe des Befehls DBCC TRACEOFF (<TraceNumber>, -1);
deaktivieren, um zu vermeiden, dass versehentlich alle weiteren SELBSTdiagnose-Minidumps von SQL Server auf größere Speicherabbilder aktualisiert werden. Im Befehl ist TraceNumber> das Ablaufverfolgungsflag, <das Sie zuvor wie 2551 oder 2544 aktiviert haben. 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 2551 hingegen 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 Speicherabbildern 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 die 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:
Starten Sie die Windows PowerShell-Konsole mithilfe der Option Als Administrator ausführen . Nur Mitglieder der Administratorgruppe auf dem Computer können die Ausführungsrichtlinie ändern.
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.