Udostępnij za pośrednictwem


Generowanie pliku zrzutu w programie SQL Server przy użyciu narzędzia Sqldumper.exe

Ten artykuł zawiera ogólne wytyczne dotyczące narzędzia Sqldumper.exe dołączonego do programu SQL Server. To narzędzie służy do generowania różnych rodzajów plików zrzutu.

Oryginalna wersja produktu: SQL Server 2019, SQL Server 2017, SQL Server 2016, SQL Server 2014, SQL Server 2012, SQL Server 2008, SQL Server 2005
Oryginalny numer KB: 917825

Podsumowanie

Narzędzie Sqldumper.exe jest dołączone do programu Microsoft SQL Server. Generuje pliki zrzutu pamięci programu SQL Server i powiązane procesy debugowania. W tym artykule opisano sposób używania Sqldumper.exe do generowania pliku zrzutu dla zadań raportowania błędów lub debugowania programu Watson.

W artykule opisano również dwie inne metody generowania plików zrzutu:

  • Dołączony skrypt programu PowerShell automatyzuje SQLDumper.exe opcji wiersza polecenia.
  • Do wygenerowania pliku zrzutu w programie SQL Server można użyć polecenia DBCC STACKDUMP Transact-SQL (T-SQL).

Jak uruchomić Sqldumper.exe ręcznie

Uruchom narzędzie Sqldumper.exe w kontekście folderu, w którym program SQL Server pierwotnie zainstalował narzędzie.

Domyślnie ścieżka instalacji Sqldumper.exe to <SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\90\Shared\SQLDumper.exe. Zwróć uwagę, że <dysk> SQLServerInstall jest symbolem zastępczym dysku, na którym zainstalowano program SQL Server.

Aby wygenerować plik zrzutu przy użyciu narzędzia Sqldumper.exe, wykonaj następujące kroki:

  1. Otwórz <dysk> SQLServerInstall:\Program Files\Microsoft SQL Server\<number>\Shared folder.

    W tej ścieżce folderu <numer> jest symbolem zastępczym jednej z następujących wersji:

    • 150 dla programu SQL Server 2019
    • 140 dla programu SQL Server 2017
    • 130 dla programu SQL Server 2016
    • 120 dla programu SQL Server 2014
    • 110 dla programu SQL Server 2012
    • 100 dla programu SQL Server 2008
    • 90 dla programu SQL Server 2005
  2. Upewnij się, że plik Dbghelp.dll znajduje się w tym folderze.

  3. Wybierz pozycję Uruchom start>, wpiszcmd, a następnie wybierz przycisk OK.

  4. W wierszu polecenia wpisz następujące polecenie, a następnie naciśnij Enter:

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

    Uwaga

    W tej ścieżce folderu numer> jest tym samym symbolem zastępczym, <który zmienia się w wersji programu SQL Server, jak opisano wcześniej.

  5. Aby wygenerować określony rodzaj pliku zrzutu, wpisz odpowiednie polecenie w wierszu polecenia, a następnie naciśnij Enter:

    • Pełny plik zrzutu:

      Sqldumper.exe <ProcessID> 0 0x01100
      
    • Plik mini-zrzutu:

      Sqldumper.exe <ProcessID> 0 0x0120
      
    • Plik mini-zrzutu, który zawiera pośrednio przywoływane pamięci (jest to zalecana opcja i jest również używany przez program SQL Server domyślnie podczas automatycznego generowania plików zrzutu pamięci):

      Sqldumper.exe <ProcessID> 0 0x0128
      
    • Filtrowany plik zrzutu:

      Sqldumper.exe <ProcessID> 0 0x8100
      

    Uwaga

    <ProcessID> jest symbolem zastępczym identyfikatora procesu aplikacji systemu Windows, dla której chcesz wygenerować plik zrzutu.

Jeśli Sqldumper.exe działa pomyślnie, narzędzie generuje plik zrzutu w folderze, w którym jest zainstalowane narzędzie.

Plik zrzutu generowany przez Sqldumper.exe ma wzorzec nazwy pliku podobny do pliku SQLDmpr<xxxx.mdmp>.

W tym wzorcu <xxxx> jest coraz większą liczbą określaną na podstawie innych plików, które mają podobną nazwę pliku w tym samym folderze. Jeśli w folderze znajdują się pliki zgodne z określonym wzorcem, rozważ porównanie ich dat i godzin tworzenia w celu znalezienia żądanego pliku.

Jak uzyskać identyfikator procesu aplikacji systemu Microsoft Windows

Aby wygenerować plik zrzutu przy użyciu narzędzia Sqldumper.exe, musisz mieć identyfikator procesu aplikacji systemu Windows, dla których chcesz wygenerować plik zrzutu. Poniżej przedstawiono sposób uzyskiwania identyfikatora procesu:

  1. Naciśnij Ctrl+Alt+Usuń, a następnie wybierz pozycję Menedżer zadań.
  2. W oknie dialogowym Menedżer zadań systemu Windows wybierz kartę Procesy .
  3. W menu Widok wybierz pozycję Wybierz kolumny.
  4. W oknie dialogowym Wybieranie kolumn zaznacz pole wyboru PID (Identyfikator procesu), a następnie wybierz przycisk OK.
  5. Zanotuj identyfikator procesu aplikacji systemu Windows, dla których chcesz wygenerować plik zrzutu. W przypadku aplikacji programu SQL Server zanotuj identyfikator procesu Sqlservr.exe .
  6. Zamknij Menedżera zadań.

Alternatywnie użyj pliku dziennika błędów programu SQL Server, aby uzyskać identyfikator procesu aplikacji programu SQL Server uruchomionej na komputerze. Część pliku dziennika błędów programu SQL Server przypomina następujący przykład:

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.

Liczba wyświetlana po Server process ID jest identyfikatorem procesu dla procesuSqlservr.exe .

Ścieżka wyjściowa dla plików zrzutu pamięci

SQLDumper.exe generuje przede wszystkim pliki zrzutu pamięci dla procesu programu SQL Server, gdy zrzut pamięci jest potrzebny do rozwiązania określonych problemów, takich jak wyjątki, potwierdzenia lub harmonogramy, które nie dają wydajności. W takich przypadkach program SQL Server wywołuje SQLDumper.exe w celu wygenerowania pliku zrzutu pamięci procesu. Domyślnie plik zrzutu pamięci jest przechowywany w katalogu MSSQL\LOG\ wystąpienia SQL.

Jak zmienić ścieżkę domyślną

Jeśli na przykład rozmiar pliku zrzutu jest zbyt duży, możesz zmodyfikować ścieżkę, wykonując następujące kroki:

  1. Otwórz program SQL Server Configuration Manager.
  2. W obszarze SQL Server Services znajdź badane wystąpienie programu SQL Server.
  3. Kliknij prawym przyciskiem myszy ten wpis, wybierz pozycję Właściwości, a następnie przejdź do karty Zaawansowane .
  4. Zmień ten katalog zrzutu na żądaną ścieżkę, a następnie wybierz przycisk OK.
  5. Uruchom ponownie program SQL Server (jeśli to możliwe), aby nowe ustawienie weszło w życie.

Gdy narzędzie Sqldumper.exe jest używane ręcznie do generowania pliku zrzutu dla dowolnej aplikacji systemu Windows, plik zrzutu może być tak duży, jak pamięć używana obecnie przez aplikację systemu Windows. Upewnij się, że na dysku, na którym Sqldumper.exe jest zapisywany plik zrzutu, jest dostępna wystarczająca ilość miejsca na dysku.

Określanie niestandardowego folderu wyjściowego w poleceniu

Możesz określić katalog, w którym narzędzie Sqldumper.exe ma napisać plik zrzutu. Katalog musi już istnieć przed uruchomieniem Sqldumper.exe. W przeciwnym razie Sqldumper.exe kończy się niepowodzeniem. Nie używaj ścieżki UNC (Universal Naming Convention) jako lokalizacji pliku zrzutu. Poniższe kroki zawierają przykład sposobu określania lokalizacji pliku mini-zrzutu:

  1. Wybierz pozycję Uruchom start>, wpiszcmd, a następnie wybierz przycisk OK.

  2. W wierszu polecenia wpisz następujące polecenie, a następnie naciśnij Enter:

    cd <SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\<number>\Shared
    
  3. W wierszu polecenia wpisz następujące polecenie, a następnie naciśnij Enter:

    Sqldumper.exe ProcessID 0 0x0128 0 <MdumpPath>
    

    Uwaga

    <MdumpPath> jest symbolem zastępczym katalogu, w którym narzędzie Sqldumper.exe ma napisać plik zrzutu. Domyślnie plik jest zapisywany w bieżącym folderze.

Jeśli określisz pełny plik zrzutu lub filtrowany plik zrzutu do wygenerowania, wygenerowanie pliku zrzutu może potrwać kilka minut Sqldumper.exe. Czas potrzebny zależy od następujących zmiennych:

  • Ilość pamięci, która Sqlservr.exe jest obecnie używana.
  • Szybkość zapisu dysku używanego przez narzędzie do przechowywania pliku zrzutu.

W tym czasie narzędzie Sqldumper.exe nie przetwarza poleceń. Zauważysz, że serwer przestaje odpowiadać. Ponadto może wystąpić tryb failover klastra.

Wymagania dotyczące uprawnień

Aby uruchomić Sqldumper.exe, musisz zalogować się do systemu Windows przy użyciu jednej z następujących metod:

  • Użyj konta należącego do grupy administratora na komputerze.
  • Użyj tego samego konta użytkownika, na którym działa usługa PROGRAMU SQL Server.

Aby narzędzie Sqldumper.exe działało pomyślnie za pośrednictwem pulpitu zdalnego lub usług terminalowych, należy uruchomić usługę pulpitu zdalnego lub usług terminalowych w trybie konsoli. Aby na przykład uruchomić pulpit zdalny w trybie konsoli, wybierz pozycję Uruchom uruchom>, wpiszmstsc /console, a następnie wybierz przycisk OK. Jeśli na serwerze docelowym działa system Windows 2000, opcja /console jest ignorowana w trybie dyskretnym. Możesz nawiązać połączenie z serwerem za pośrednictwem pulpitu zdalnego, ale nie będziesz używać sesji konsoli.

Jeśli po uruchomieniu Sqldumper.exe nie wygenerowano żadnego pliku zrzutu w bieżącym folderze, sprawdź dane wyjściowe wiersza polecenia wygenerowane przez narzędzie, aby zidentyfikować potencjalną przyczynę błędu. Te informacje są również rejestrowane w pliku Sqldumper_errorlog.log w bieżącym katalogu. Poniżej przedstawiono dwa możliwe komunikaty o błędach i ich przyczyny:

Komunikat Przyczyna
"Nie można 0x57 openprocess — parametr jest niepoprawny" Do narzędzia Sqldumper.exe przekazano nieprawidłowy identyfikator procesu.
"Nieprawidłowa wartość identyfikatora wątku — <nieprawidłowy błąd parametru> " Do narzędzia Sqldumper.exe przekazano nieprawidłowy parametr.

Jeśli zostanie wygenerowany komunikat o błędzie podobny do jednego z następujących, możesz bezpiecznie zignorować ten komunikat:

  • "Nieznany typ wywołania zwrotnego podczas minidump 6"
  • "Nieznany typ wywołania zwrotnego podczas minidump 7"

Wpływ generowania zrzutu

W przypadku żądania pliku zrzutu procesu w trybie użytkownika (zgodnie z opisem w tym artykule, w przeciwieństwie do zrzutów jądra systemu operacyjnego, które wykraczają poza nasz zakres), proces docelowy (tutaj SQLServer.exe) jest zamrożony na czas potrzebny do serializacji zawartości zrzutu do miejsca docelowego pliku.

Zamrożone oznacza, że proces nie będzie mógł uruchomić żadnego żądania użytkownika ani żadnej operacji wewnętrznej, w tym żadnego mechanizmu sondowania zasobów, takiego jak implementacja funkcji IsAlive i looks Alive klastra windows (zobacz sekcję Zrzuty pamięci w trybie failover klastra , aby uzyskać szczegółowe informacje o sposobie obsługi tej sytuacji). Każdy limit czasu, który opiera się na czasie zegara ściennego może również zostać naruszony z powodu zamrożenia.

Na podstawie poprzedniej instrukcji czas trwania zamrożenia jest tutaj czynnikiem krytycznym, napędzanym przez następujące elementy:

  • Typ wybranego zrzutu.
  • Rozmiar procesu programu SQL Server w pamięci, który w przypadku pojedynczego aktywnego wystąpienia z uruchomionymi parametrami domyślnymi jest często zbliżony do całkowitej fizycznej pamięci RAM serwera.
  • Wydajność dysku używanego jako cel zrzutu.

Ponadto należy zaplanować rozmiar pliku zrzutu na dysku, zwłaszcza jeśli istnieje możliwość wielu zrzutów, a w przypadku wybrania dużych, innych niż domyślne typy zrzutów. Upewnij się, że przejrzysz typy zrzutów , aby dowiedzieć się, czego się spodziewać. Domyślnie niektóre metody zrzutu tworzą zrzut w folderze \Log wystąpienia programu SQL Server, który w domyślnej prostej konfiguracji będzie również dyskiem systemowym i dyskiem danych i dziennika dla programu SQL Server. Przeniesienie tego dysku do nasycenia ma poważny wpływ na dostępność programu SQL Server i/lub systemu.

Zarządzanie wpływem na systemy klastrowane

Proces jest tymczasowo zawieszony podczas generowania zrzutu. Może to mieć wpływ na dostępność usługi PROGRAMU SQL Server i wyzwalać tryb failover zasobów w kontekstach Zawsze włączone (zarówno wystąpienie klastra trybu failover, jak i grupa dostępności). Generowanie zrzutów różnych procesów wpływa na zasoby w różny sposób. Uważnie przeczytaj sekcje Wpływ generowania zrzutów i Typów zrzutów .

Po przechwyceniu zrzutu programu SQL Server w wystąpieniu klastra trybu failover lub wystąpieniu grupy dostępności programu SQL Server klastrowany program SQL Server lub grupa dostępności mogą zostać przełączone w tryb failover do innego węzła, jeśli ukończenie zrzutu trwa zbyt długo. Może to być szczególnie problematyczne w systemach korzystających z dużych ilości pamięci RAM lub w przypadku generowania filtrowanego lub pełnego zrzutu pamięci. Aby zapobiec przełączeniu w tryb failover, przed przechwyceniem pliku zrzutu użyj następujących ustawień. Zmiana może zostać przywrócona po wykonaniu pliku zrzutu:

  • W przypadku wystąpienia klastra trybu failover (FCI):
    • Kliknij prawym przyciskiem myszy zasób programu SQL Server w obszarze Administrator klastra, wybierz pozycję Jeśli zasób zakończy się niepowodzeniem, nie uruchamiaj ponownie na karcie Zasady .
    • Na karcie Właściwości zwiększ limit czasu sprawdzania kondycji. Na przykład ustaw wartość właściwości na co najmniej 180 sekund. Jeśli ten limit czasu zostanie osiągnięty, zasady Jeśli zasób ustępuje, nie uruchamiaj ponownie, są ignorowane, a zasób jest ponownie uruchamiany.
    • Na karcie Właściwości zmień wartość FailureConditionLevel na zero.
  • W przypadku grupy dostępności zastosuj wszystkie następujące ustawienia:
    • Zwiększ limit czasu sesji, na przykład 120 sekund dla wszystkich replik. W programie SQL Server Management Studio (SSMS) kliknij prawym przyciskiem myszy replikę do skonfigurowania, a następnie wybierz pozycję Właściwości. Zmień pole Limit czasu sesji (sekundy) na 120 sekund. Aby uzyskać więcej informacji, zobacz Zmienianie okresu Session-Timeout dla repliki dostępności (SQL Server).
    • Zmień automatyczne przełączanie wszystkich replik w tryb failover na ręczne przechodzenie w tryb failover. W programie SSMS kliknij prawym przyciskiem myszy replikę, wybierz pozycję Właściwości i zmień automatyczną pracę w trybie failover wszystkich replik na ręczne przejście w tryb failover na karcie Właściwości. Aby uzyskać więcej informacji, zobacz Zmienianie trybu failover repliki dostępności (SQL Server).
    • Zwiększ wartość LeaseTimeout do 60 000 ms (60 sekund) i zmień wartość HealthCheckTimeout na 90 000 ms (90 sekund). W obszarze Administrator klastra kliknij prawym przyciskiem myszy zasób grupy dostępności, wybierz pozycję Właściwości, a następnie przejdź do karty Właściwości , aby zmodyfikować oba ustawienia. Aby uzyskać więcej informacji, zobacz Konfigurowanie ustawień właściwości HealthCheckTimeout.

Ulepszenia produktu w celu zmniejszenia wpływu na program SQL Server

Do najnowszych wersji programu SQL Server dodano cztery główne ulepszenia w celu zmniejszenia rozmiaru pliku zrzutu i/lub czasu generowania zrzutu pamięci:

Mechanizm filtrowania mapy bitowej

Program SQL Server przydziela mapę bitową, która śledzi strony pamięci, które mają zostać wykluczone z filtrowanego zrzutu. Sqldumper.exe odczytuje mapę bitową i filtruje strony bez konieczności odczytywania innych metadanych menedżera pamięci. Po włączeniu lub wyłączeniu mapy bitowej w dzienniku błędów programu SQL Server w dzienniku błędów programu SQL Server są wyświetlane następujące komunikaty:

Page exclusion bitmap is enabled. i Page exclusion bitmap is disabled.

  • SQL Server 2016

    Począwszy od programu SQL Server 2016 SP2 CU13, filtrowanie mapy bitowej jest domyślnie włączone.

  • SQL Server 2017

    • Ta funkcja nie jest dostępna w usłudze RTM do CU15.
    • W programie SQL Server 2017 CU16 można włączyć filtrowanie mapy bitowej za pośrednictwem protokołu T8089 i wyłączyć je, wyłączając funkcję T8089.
    • Począwszy od programu SQL Server 2017 CU20, filtrowanie mapy bitowej jest domyślnie włączone. Flaga śledzenia T8089 nie będzie już stosowana i zostanie zignorowana po włączeniu. Filtrowanie mapy bitowej można wyłączyć za pośrednictwem protokołu T8095.
  • SQL Server 2019

    Jest to domyślnie włączone w programie SQL Server 2019 RTM. Można go wyłączyć za pośrednictwem T8095.

Eliminacja powtarzających się zrzutów w tym samym problemie

Powtarzające się zrzuty pamięci w tym samym problemie są eliminowane. Przy użyciu sygnatury stosu aparat SQL śledzi, czy wyjątek już wystąpił i nie będzie generował nowego zrzutu pamięci, jeśli już istnieje. Dotyczy to naruszeń dostępu, przepełnienia stosu, asercji i wyjątków uszkodzenia indeksu. Znacznie zmniejsza to ilość miejsca na dysku używanego przez zrzuty pamięci i nie blokuje tymczasowo procesu generowania zrzutu. Zostało to dodane w programie SQL Server 2019.

Skrócone dane wyjściowe w dzienniku błędów

Zawartość wygenerowana w dzienniku błędów programu SQL Server z pojedynczego zrzutu pamięci może nie tylko być przytłaczająca, ale może również spowolnić proces generowania zrzutu pamięci ze względu na czas wymagany do serializacji wszystkich tych informacji w formacie tekstowym w dzienniku błędów. W programie SQL Server 2019 zawartość przechowywana w dzienniku błędów podczas generowania zrzutu została znacznie zmniejszona i może wyglądać następująco:

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.

Wcześniej program SQL Server wyświetlał informacje dla każdej sesji lub wątku, gdy użytkownik wyzwolił na przykład zrzut ręczny.

Równoległa kompresja zrzutów pamięci

Aby szybciej generować zrzuty i zwiększać ich rozmiar, w programach SQL Server 2022 CU8 i SQL Server 2019 CU23 wprowadzono funkcję skompresowanego zrzutu pamięci. Po aktywowaniu Sqldumper.exe tworzy wiele wątków w celu jednoczesnego odczytu pamięci procesu, kompresuje ją, a następnie zapisuje w pliku zrzutu. Ta kompresja równoległa z wieloma wątkami zmniejsza rozmiar pliku i przyspiesza proces dumpingu, gdy jest używany z pełnymi i filtrowanymi zrzutami.

Możesz włączyć flagę śledzenia 2610, aby włączyć skompresowany zrzut pamięci:

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

Alternatywnie można dodać -T2610 jako parametr startowy do wystąpienia programu SQL Server, aby zawsze tworzyć skompresowane zrzuty pamięci.

Jeśli ręcznie uruchomisz Sqldumper.exe, możesz użyć parametru -zdmp do przechwycenia skompresowanego zrzutu pamięci. Na przykład:

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

Możesz również ograniczyć liczbę rdzeni, których Sqldumper.exe można użyć do utworzenia skompresowanego zrzutu przy użyciu parametru -cpu:X , gdzie X to liczba procesorów CPU. Ten parametr jest dostępny tylko po ręcznym uruchomieniu Sqldumper.exe z wiersza polecenia:

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

Czynniki, które uniemożliwiają lub opóźniają tworzenie zrzutów pamięci

Znane są następujące czynniki powodujące opóźnienia lub uniemożliwiające tworzenie zrzutów pamięci.

  • Ścieżka we/wy, w której są zapisywane zrzuty pamięci, działa słabo. W takich przypadkach badanie i rozwiązywanie problemów z wydajnością operacji we/wy dysku jest kolejnym logicznym krokiem.
  • Oprogramowanie antywirusowe lub inne oprogramowanie monitorujące zakłóca działanie SQLDumper.exe. W niektórych przypadkach funkcja readprocessMemory oprogramowania innych firm jest objaśniana. Może to znacznie zwiększyć czas trwania zrzutu. Aby rozwiązać większość tych problemów, wyłącz oprogramowanie zakłócające lub dodaj SQLDumper.exe do listy wykluczeń.

Typy zrzutów

Następujące metody mogą służyć do generowania trzech różnych typów zrzutów: mini zrzutów, pełnych zrzutów i filtrowanych zrzutów.

Mini zrzuty z pamięcią referencyjną

Ten typ zrzutu pamięci jest migawką wszystkich aktywnych wątków procesu ("stosy wątków") wraz z ograniczonym wyodrębniaczem pamięci przywoływanej przez stosy wątków i inne dane procesu klucza lub wątku. Zwykle mają rozmiar kilku megabajtów i są szybkie do wygenerowania (od mniej niż sekundy do kilku sekund). Nawet większe systemy serwerów (z setkami procesora CPU pośrednio napędzają ogromną liczbę wątków w procesie programu SQL Server) rzadko przekraczają 20–30 MB: rozmiar mini zrzutu nie rośnie wraz z rozmiarem procesu programu SQL Server. Ten typ zrzutu jest domyślnym typem używanym przez program SQL Server podczas automatycznego generowania zrzutów pamięci w przypadku wyjątków, problemów z harmonogramem, problemów z zatrzaśnięciem, uszkodzenia bazy danych i asercji.

Uwaga

Program SQL Server w ramach wbudowanej instrumentacji wygeneruje automatyczne "mini zrzuty diagnostyczne" w określonych sytuacjach. W związku z tym ta operacja jest uznawana za wystarczająco bezpieczną, aby program SQL Server mógł wyzwolić ją automatycznie w razie potrzeby.

Pełne zrzuty

Zrzut pełnej pamięci to kompletna kopia aktywnego docelowego obszaru procesu. W związku z tym obejmuje to cały stan wątku, całą przydzieloną pamięć procesu i wszystkie załadowane moduły. W związku z tym pełne zrzuty będą miały rozmiar, który jest mniej więcej taki sam jak proces programu SQL Server, który z kolei może być prawie tak duży, jak całkowita pamięć RAM systemu. Na dużych serwerach dedykowanych pojedynczemu wystąpieniu programu SQL Server może to oznaczać plik, który jest kilkaset gigabajtów lub więcej. Nie trzeba dodawać, że taki plik zajmie dużo czasu, aby wygenerować i w związku z tym wywoła długotrwałe zamrożenie. Wydajność dysku dla docelowego pliku zrzutu znacząco wpłynie na czas zamarzania. Ten typ zrzutu jest obecnie rzadko używany w programie SQL Server, zgodnie z opisem w poniższym objaśnieniu.

Przefiltrowane zrzuty

Wraz ze stałym zwiększaniem rozmiaru pamięci RAM typowych serwerów z programem SQL Server pełne zrzuty stają się bardziej nieporęczne. W związku z tym zaimplementowane są filtrowane zrzuty. Przefiltrowany zrzut jest podzbiorem pełnego zrzutu, gdzie duże obszary pamięci programu SQL Server są wykluczane na bieżąco i nie są zapisywane na dysku. Zazwyczaj wykluczona pamięć nie przynosi żadnej wartości dodanej do rozwiązywania problemów. Przykłady to strony danych/indeksów i niektóre wewnętrzne pamięci podręczne, takie jak strony danych Hekaton i pamięć puli dzienników. Ten filtrowany zrzut powoduje, że plik jest mniejszy niż pełny zrzut, ale zrzut nadal zachowuje niemal całą jego przydatność. Przefiltrowane zrzuty zastąpiły pełne zrzuty jako preferowaną opcję w zdecydowanej większości sytuacji, w których mini zrzuty nie są wystarczające. Spadek rozmiaru może się różnić w porównaniu do pełnego zrzutu, ale nadal jest to dość duży plik, który często stanowi od 30 do 60 procent rozmiaru procesu programu SQL Server. Dlatego najlepiej jest zaplanować możliwy rozmiar tak duży, jak pełny zrzut jako najgorszą opcję, co pozostawia dobry margines bezpieczeństwa. W każdym przypadku wygenerowanie przefiltrowanego zrzutu może nie być szybsze niż pełne zrzuty: chodzi o to, czy zyski związane z liczbą unikanych operacji we/wy przekraczają czas wymagany do zaimplementowania logiki filtru (szybkość dysku i szybkość procesora CPU/pamięci RAM będą miały na to wpływ).

Poniższe zapytanie umożliwia uzyskanie przybliżanego oszacowania rozmiaru przefiltrowanego zrzutu. Chociaż oczekuje się, że większość stron danych lub indeksów jest wykluczona ze zrzutu, te, które są wyłącznie zatrzaśnięte i modyfikowane, nie zostaną pominięte.

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

Ponieważ możesz użyć Sqldumper.exe do wygenerowania pliku zrzutu na żądanie dla dowolnej aplikacji systemu Microsoft Windows, możesz rozważyć użycie filtrowanego zrzutu. Jednak filtrowany plik zrzutu ma zastosowanie tylko i ma znaczenie w kontekście programu SQL Server. Nadal można pomyślnie wygenerować mini-zrzut, pełny plik zrzutu lub aplikacje inne niż sql server.

Proces programu SQL Server wywołuje narzędzie Sqldumper.exe wewnętrznie w celu wygenerowania pliku zrzutu, gdy proces napotka wyjątki. Program SQL Server przekazuje parametry do Sqldumper.exe. Flagi śledzenia umożliwiają domyślną zmianę parametrów, które program SQL Server przekazuje do narzędzia w przypadku wystąpienia wyjątku lub asercji. Te flagi śledzenia znajdują się w zakresie od 2540 do 2559. Możesz użyć jednej z tych flag śledzenia, aby zmienić domyślny typ zrzutu SQLDumper.exe wygenerować (domyślnie jest to mini-zrzut z pamięcią przywoływane). Na przykład:

  • Flaga śledzenia 2551: Tworzy przefiltrowany zrzut pamięci.
  • Flaga śledzenia 2544: Tworzy zrzut pełnej pamięci.
  • Flaga śledzenia 8026: program SQL Server wyczyści wyzwalacz zrzutu po wygenerowaniu zrzutu raz.

Jeśli co najmniej dwie flagi śledzenia są aktywne, jest zaznaczona opcja wskazująca największy zrzut pamięci. Jeśli na przykład są używane flagi śledzenia 2551 i 2544, program SQL Server tworzy zrzut pełnej pamięci.

Generowanie zrzutu pamięci w trybie failover klastra

W scenariuszach trybu failover klastra bibliotekę DLL zasobów programu SQL Server można uzyskać plik zrzutu przed przejściem w tryb failover, aby pomóc w rozwiązywaniu problemów. Gdy bibliotekę DLL zasobu programu SQL Server określa, że zasób programu SQL Server nie powiódł się, bibliotekę DLL zasobu programu SQL Server używa narzędzia Sqldumper.exe w celu uzyskania pliku zrzutu procesu programu SQL Server. Aby upewnić się, że narzędzie Sqldumper.exe pomyślnie generuje plik zrzutu, należy ustawić następujące trzy właściwości jako wymagania wstępne:

  • SqlDumperDumpTimeOut

    Limit czasu określony przez użytkownika. Zasób DLL czeka na ukończenie pliku zrzutu, zanim zasób DLL zatrzyma usługę programu SQL Server.

  • SqlDumperDumpPath

    Lokalizacja, w której narzędzie Sqldumper.exe generuje plik zrzutu.

  • SqlDumperDumpFlags

    Flagi używane przez Sqldumper.exe.

Jeśli żadna z właściwości nie jest ustawiona, Sqldumper.exe nie może wygenerować pliku zrzutu. Komunikat ostrzegawczy jest rejestrowany zarówno w dzienniku zdarzeń, jak i w dzienniku klastra za każdym razem, gdy zasób zostanie przeniesiony do trybu online.

Konfiguracja klastra dla programu SQLDumper w programie SQL Server 2012 i nowszych wersjach

Aby zmodyfikować te właściwości, możesz użyć ALTER SERVER CONFIGURATION polecenia (T-SQL). Na przykład:

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;

Alternatywnie można użyć skryptów programu PowerShell. Na przykład dla nazwanego wystąpienia 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

Aby sprawdzić, czy ustawienia są stosowane, można uruchomić następujące polecenie programu PowerShell:

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

Konfiguracja klastra dla programu SQLDumper w programie SQL Server 2008/2008 R2 lub Windows 2012 i starszych wersjach

Aby ustawić właściwości narzędzia Sqldumper.exe dla trybu failover klastra przy użyciu polecenia zasobu klastra , wykonaj następujące kroki:

  1. Wybierz pozycję Uruchom start>, wpiszcmd, a następnie wybierz przycisk OK.
  2. Dla każdej właściwości wpisz odpowiednie polecenie w wierszu polecenia, a następnie naciśnij Enter:
    • Właściwość SqlDumperDumpFlags

      Aby ustawić właściwość SqlDumperDumpFlags dla określonego pliku zrzutu, wpisz odpowiednie polecenie w wierszu polecenia, a następnie naciśnij Enter:

      • Cały plik pełnego zrzutu wątku

        • Wystąpienie domyślne

          cluster resource "SQL Server" /priv SqlDumperDumpFlags = 0x01100
          
        • Nazwane wystąpienie

          cluster resource "SQL Server (INSTANCE1)" /priv SqlDumperDumpFlags = 0x01100
          
      • Cały plik mini-zrzutu wątku

        • Wystąpienie domyślne

          cluster resource "SQL Server" /priv SqlDumperDumpFlags = 0x0120
          
        • Nazwane wystąpienie

          cluster resource "SQL Server (INSTANCE1)" /priv SqlDumperDumpFlags = 0x0120
          
      • Przefiltrowane wszystkie pliki zrzutu wątków

        • Wystąpienie domyślne

          cluster resource "SQL Server" /priv SqlDumperDumpFlags = 0x8100
          
        • Nazwane wystąpienie

          cluster resource "SQL Server  (INSTANCE1)" /priv SqlDumperDumpFlags = 0x8100
          
    • Właściwość SqlDumperDumpPath

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

      Uwaga

      <DirectoryPath> jest symbolem zastępczym katalogu, w którym zostanie wygenerowany plik zrzutu i powinien być określony w cudzysłowie (" ").

    • Właściwość SqlDumperDumpTimeOut

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

      Uwaga

      < > Limit czasu jest symbolem zastępczym limitu czasu w milisekundach (ms).

Czas potrzebny narzędziu do wygenerowania pliku zrzutu procesu programu SQL Server zależy od konfiguracji komputera. W przypadku komputera z dużą ilością pamięci czas może być znaczący. Aby oszacować czas wymagany dla procesu, użyj narzędzia Sqldumper.exe, aby ręcznie wygenerować plik zrzutu. Prawidłowe wartości właściwości SqlDumperDumpTimeOut to od 10 000 ms do MAXDWORD. MAXDWORD reprezentuje najwyższą wartość w zakresie typu danych DWORD (4294967295).

Aby sprawdzić, czy ustawienia są włączone, można uruchomić następujące polecenie:

cluster resource "SQL Server" /priv

Usuwanie właściwości Sqldumper.exe dla trybu failover klastra

Aby usunąć właściwości narzędzia Sqldumper.exe dla trybu failover klastra, wykonaj następujące kroki:

  1. Wybierz pozycję Uruchom start>, wpiszcmd, a następnie wybierz przycisk OK.

  2. Dla określonej właściwości wpisz odpowiednie polecenie w wierszu polecenia, a następnie naciśnij Enter:

    • Właściwość SqlDumperDumpFlags

      • Wystąpienie domyślne

          cluster resource "SQL Server" /priv:SqlDumperDumpFlags /usedefault
        
      • Nazwane wystąpienie

          cluster resource "SQL Server (INSTANCE1)" /priv:SqlDumperDumpFlags /usedefault
        
    • Właściwość SqlDumperDumpPath

      • Wystąpienie domyślne

        cluster resource "SQL Server" /priv:SqlDumperDumpPath /usedefault
        
      • Nazwane wystąpienie

        cluster resource "SQL Server (INSTANCE1)" /priv:SqlDumperDumpPath /usedefault
        
    • Właściwość SqlDumperDumpTimeOut

      • Wystąpienie domyślne

        cluster resource "SQL Server" /priv:SqlDumperDumpTimeOut /usedefault
        
      • Nazwane wystąpienie

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

Jak używać DBCC STACKDUMP

Polecenie DBCC STACKDUMP może pomóc w utworzeniu zrzutu pamięci w katalogu LOG instalacji wystąpienia programu SQL Server. Polecenie domyślnie utworzy minidump ze wszystkimi wątkami, które mają ograniczony rozmiar i są odpowiednie do odzwierciedlenia stanu procesu programu SQL Server. Uruchom następujące polecenie w kliencie programu SQL Server:

DBCC STACKDUMP

Aby uzyskać rozszerzoną DBCC STACKDUMP funkcjonalność programu SQL Server 2019, zobacz Rozszerzone funkcje DBCC STACKDUMP wprowadzone w programie SQL Server 2019.

Aby włączyć tę metodę w celu utworzenia filtrowanego zrzutu, włącz flagi śledzenia 2551 przy użyciu następującego polecenia:

DBCC TRACEON(2551, -1)
GO
DBCC STACKDUMP

Aby utworzyć pełny zrzut, użyj flagi śledzenia 2544.

Po pobraniu pliku zrzutu należy wyłączyć flagę śledzenia przy użyciu polecenia DBCC TRACEOFF (<TraceNumber>, -1); , aby uniknąć przypadkowego uaktualnienia wszystkich dalszych minidumps samo diagnostycznych programu SQL Server do większych zrzutów. W poleceniu TraceNumber> to flaga śledzenia, <która została wcześniej włączona, na przykład 2551 lub 2544. Na przykład:

DBCC TRACEOFF(2551, -1)

Jeśli nie masz pewności, która flaga śledzenia pozostaje aktywna, uruchom następujące polecenie:

DBCC TRACESTATUS(-1)

Pusty zestaw wyników wskazuje, że żadna flaga śledzenia nie jest aktywna. Z drugiej strony, jeśli 2551 jest nadal aktywny, zobaczysz:

TraceFlag Stan Globalne Sesja
2551 1 1 0

Uwaga

Włączone traceflag przez DBCC TRACEON są resetowane (usuwane) po ponownym uruchomieniu usługi.

Rozszerzona funkcja DBCC STACKDUMP wprowadzona w programie SQL Server 2019

Począwszy od programu SQL Server 2019 CU2, DBCC STACKDUMP polecenie zostało rozszerzone na obsługę generowania zrzutów różnych typów: mini, filtrowanych i pełnych zrzutów. To polecenie eliminuje konieczność używania flag śledzenia. Umożliwia również ograniczenie danych wyjściowych tekstu w innym pliku tekstowym generowanym za pomocą zrzutu pamięci. Może to zapewnić widoczny wzrost wydajności w czasie potrzebnym SQLDumper.exe na wygenerowanie zrzutu pamięci.

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

Jest to opcja domyślna TEXT_DUMP = LIMITED . Jeśli chcesz otrzymywać szczegółowe dane wyjściowe w pliku SQLDump000X.txt , możesz użyć polecenia TEXT_DUMP = DETAILED.

Aby wygenerować filtrowany zrzut z ograniczonymi danymi wyjściowymi w pliku .txt , uruchom następujące polecenie:

DBCC STACKDUMP WITH FILTERED_DUMP , TEXT_DUMP = LIMITED

Jak za pomocą skryptu programu PowerShell wygenerować plik zrzutu za pomocą narzędzia SQLDumper

  • Zapisz następujący kod jako plik PS1, na przykład SQLDumpHelper.ps1:

    Szczegóły kodu

    $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."
    
  • Uruchom go z wiersza polecenia jako administrator, używając następującego polecenia:

    Powershell.exe -File SQLDumpHelper.ps1
    
  • Możesz też uruchomić go z konsoli programu Windows PowerShell i uruchomić go jako administrator przy użyciu następującego polecenia:

    .\SQLDumpHelper.ps1
    

Uwaga

Jeśli nigdy nie uruchamiano skryptów programu PowerShell w systemie, może zostać wyświetlony następujący komunikat o błędzie:

"Nie można załadować pliku ...SQLDumpHelper.ps1, ponieważ uruchomione skrypty są wyłączone w tym systemie".

Aby umożliwić uruchamianie poleceń, wykonaj następujące kroki:

  1. Uruchom konsolę programu Windows PowerShell przy użyciu opcji Uruchom jako administrator . Tylko członkowie grupy administratorów na komputerze mogą zmienić zasady wykonywania.

  2. Włącz uruchamianie niepodpisanych skryptów za pomocą następującego polecenia:

    Set-ExecutionPolicy RemoteSigned
    

    Uwaga

    Umożliwi to uruchamianie niepodpisanych skryptów utworzonych na komputerze lokalnym i podpisanych skryptów z Internetu.