Generowanie pliku zrzutu w programie SQL Server za pomocą narzędzia Sqldumper.exe
Ten artykuł zawiera ogólne wskazówki 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 na potrzeby 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 tym artykule opisano również dwie inne metody generowania plików zrzutu:
- Dołączony skrypt programu PowerShell automatyzuje SQLDumper.exe opcje wiersza polecenia.
- Polecenie TRANSact-SQL (T-SQL) DBCC STACKDUMP może służyć do generowania pliku zrzutu w programie SQL Server.
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:
Otwórz plik <SQLServerInstall Drive>:\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
Upewnij się, że plik Dbghelp.dll znajduje się w tym folderze.
Wybierz pozycję Uruchom,> wpisz cmd, a następnie wybierz przycisk OK.
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 16.
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.
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 zawierający pośrednio przywołyną pamięć (jest to zalecana opcja i jest również używany przez program SQL Server domyślnie, gdy automatycznie generuje pliki zrzutu pamięci):
Sqldumper.exe <ProcessID> 0 0x0128
Filtrowany plik zrzutu:
Sqldumper.exe <ProcessID> 0 0x8100
Uwaga 16.
<ProcessID> to symbol zastępczy 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, który Sqldumper.exe generuje, ma wzorzec nazwy pliku podobny do SQLDmpr<xxxx.mdmp>.
W tym wzorcu <xxxx> jest coraz większą liczbą, która jest określana 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 dat i godzin tworzenia, aby znaleźć żądany plik.
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órej chcesz wygenerować plik zrzutu. Poniżej przedstawiono sposób uzyskiwania identyfikatora procesu:
- Naciśnij Ctrl+Alt+Delete i wybierz pozycję Menedżer zadań.
- W oknie dialogowym Menedżer zadań systemu Windows wybierz kartę Procesy.
- W menu Widok wybierz pozycję Wybierz kolumny.
- W oknie dialogowym Wybieranie kolumn zaznacz pole wyboru PID (identyfikator procesu), a następnie wybierz przycisk OK.
- Zwróć uwagę na identyfikator procesu aplikacji systemu Windows, dla której chcesz wygenerować plik zrzutu. W przypadku aplikacji programu SQL Server zanotuj identyfikator procesu Sqlservr.exe .
- Zamknij okno Menedżer 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 procesu Sqlservr.exe .
Ścieżka wyjściowa dla plików zrzutu pamięci
SQLDumper.exe przede wszystkim generuje pliki zrzutu pamięci dla procesu programu SQL Server, gdy potrzebny jest zrzut pamięci, aby rozwiązać określone problemy, takie jak wyjątki, asertywne lub harmonogramy niewydajne. 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 za duży, możesz zmodyfikować ścieżkę, wykonując następujące kroki:
- Otwórz program SQL Server Configuration Manager.
- W obszarze Usługi programu SQL Server znajdź wystąpienie programu SQL Server, które jest badane.
- Kliknij prawym przyciskiem myszy ten wpis, wybierz pozycję Właściwości, a następnie przejdź do karty Zaawansowane .
- Zmień ten katalog zrzutu na żądaną ścieżkę, a następnie wybierz przycisk OK.
- Uruchom ponownie program SQL Server (jeśli to możliwe), aby nowe ustawienie zaczęły obowiązywać.
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 przez aplikację systemu Windows. Upewnij się, że na dysku jest dostępna wystarczająca ilość miejsca, na którym Sqldumper.exe zapisuje plik zrzutu.
Określ niestandardowy folder wyjściowy w poleceniu
Możesz określić katalog, w którym chcesz, aby narzędzie Sqldumper.exe zapisywało 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. W poniższych krokach przedstawiono przykład sposobu określania lokalizacji pliku mini-zrzutu:
Wybierz pozycję Uruchom,> wpisz cmd, a następnie wybierz przycisk OK.
W wierszu polecenia wpisz następujące polecenie, a następnie naciśnij Enter:
cd <SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\<number>\Shared
W wierszu polecenia wpisz następujące polecenie, a następnie naciśnij Enter:
Sqldumper.exe ProcessID 0 0x0128 0 <MdumpPath>
Uwaga 16.
<MdumpPath> to symbol zastępczy katalogu, w którym chcesz, aby narzędzie Sqldumper.exe zapisywało plik zrzutu. Domyślnie plik jest zapisywany w bieżącym folderze.
Jeśli określisz plik pełnego zrzutu lub filtrowany plik zrzutu do wygenerowania, Sqldumper.exe wygenerowanie pliku zrzutu może potrwać kilka minut. Czas, który jest 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, które jest członkiem grupy administratora na komputerze.
- Użyj tego samego konta użytkownika, w którym jest uruchomiona usługa SQL Server.
Aby narzędzie Sqldumper.exe działało pomyślnie za pośrednictwem pulpitu zdalnego lub usług terminalowych, należy uruchomić pulpit zdalny lub usługi terminalowe w trybie konsoli. Aby na przykład uruchomić pulpit zdalny w trybie konsoli, wybierz pozycję Uruchom,> wpisz mstsc /console, a następnie wybierz przycisk OK. Jeśli serwer docelowy uruchamia system Windows 2000, opcja /console jest dyskretnie ignorowana. Możesz nawiązać połączenie z serwerem za pośrednictwem pulpitu zdalnego, ale nie będziesz używać sesji konsoli.
Jeśli okaże się, że plik zrzutu nie został wygenerowany w bieżącym folderze po uruchomieniu Sqldumper.exe, 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 |
---|---|
"0x57 openProcess nie powiodło się — parametr jest niepoprawny" | Nieprawidłowy identyfikator procesu został przekazany do narzędzia Sqldumper.exe. |
"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 elementów, 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 zrzutów
Gdy zażądano pliku zrzutu procesu trybu użytkownika (zgodnie z opisem w tym artykule, w przeciwieństwie do zrzutów jądra systemu operacyjnego, które znajdują się poza naszym zakresem), docelowy proces (tutaj SQLServer.exe) jest zamrożony przez czas trwania serializacji zawartości zrzutu do jego 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 Wygląda żywa w klastrze systemu Windows (zobacz sekcję Zrzuty pamięci w trybie failover klastra, aby uzyskać szczegółowe informacje na temat sposobu obsługi tej sytuacji). Każdy limit czasu, który opiera się na zegarze ściany może być również naruszone z powodu zamrożenia.
Na podstawie poprzedniej instrukcji czas trwania zamrożenia jest czynnikiem krytycznym w tym miejscu, opartym na następujących kwestiach:
- Wybrany typ 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 element docelowy zrzutu.
Ponadto należy zaplanować rozmiar pliku zrzutu na dysku, zwłaszcza jeśli istnieje możliwość wielokrotnego zrzutu i jeśli wybrano duże, inne niż domyślne typy zrzutów. Upewnij się, że przeglądasz typy zrzutów, aby wiedzieć, 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 danymi i dyskiem 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 wyzwalanie trybu failover zasobów w kontekstach zawsze włączone (zarówno wystąpienie klastra trybu failover, jak i grupę dostępności). Generowanie zrzutu różnych procesów wpływa na zasoby inaczej. Uważnie przeczytaj sekcje Wpływ generowania zrzutów i typów zrzutów.
W przypadku przechwytywania 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 może przejść w tryb failover do innego węzła, jeśli zrzut trwa zbyt długo. Może to być szczególnie problematyczne w systemach korzystających z dużych ilości pamięci RAM lub generowania filtrowanego lub pełnego zrzutu pamięci. Aby zapobiec przejściu w tryb failover, przed przechwyceniem pliku zrzutu użyj następujących ustawień. Zmiana może zostać przywrócona po pobraniu 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 uruchom ponownie na karcie Zasady .
- Na karcie Właściwości zwiększ limit czasu kontroli kondycji. Na przykład ustaw wartość właściwości na 180 sekund lub wyższą. Jeśli ten limit czasu zostanie osiągnięty, zasady Jeśli zasób zakończy się niepowodzeniem, nie uruchom ponownie , zostanie zignorowany i zasób zostanie uruchomiony ponownie.
- 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 polecenie Właściwości. Zmień pole Limit czasu sesji (w sekundach) na 120 sekund. Aby uzyskać więcej informacji, zobacz Zmienianie limitu czasu sesji dla repliki dostępności (SQL Server).
- Zmień automatyczne przejście w tryb failover wszystkich replik na ręczne przejście w tryb failover. W programie SSMS kliknij prawym przyciskiem myszy replikę, wybierz pozycję Właściwości i zmień automatyczne przejście w tryb 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 map bitowych
- Eliminacja powtarzających się zrzutów w tym samym problemie
- Skrócone dane wyjściowe w dzienniku błędów
- Równoległa kompresja zrzutów pamięci
Mechanizm filtrowania map bitowych
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. W dzienniku błędów programu SQL Server są wyświetlane następujące komunikaty, gdy mapa bitowa jest odpowiednio włączona lub wyłączona:
Page exclusion bitmap is enabled.
i Page exclusion bitmap is disabled.
SQL Server 2016
Począwszy od programu SQL Server 2016 SP2 CU13, filtrowanie map bitowych jest domyślnie włączone.
SQL Server 2017
- Nie jest to dostępne w wersji RTM do CU15.
- W programie SQL Server 2017 CU16 można włączyć filtrowanie map bitowych za pośrednictwem T8089 i wyłączyć go, wyłączając funkcję T8089.
- Począwszy od programu SQL Server 2017 CU20, filtrowanie map bitowych jest domyślnie włączone. Flaga śledzenia T8089 nie będzie już stosowana i zostanie zignorowana w przypadku włączenia. Filtrowanie map bitowych można wyłączyć za pośrednictwem 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 zostały wyeliminowane. Korzystając z podpisu stosu, aparat SQL śledzi, czy wystąpił już wyjątek i nie utworzy 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 powoduje tymczasowego zablokowania procesu w celu wygenerowania zrzutu. Dodano je 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 być nie tylko 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 drukował informacje dla każdej sesji lub wątku, gdy na przykład użytkownik wyzwolił ręczne zrzuty.
Równoległa kompresja zrzutów pamięci
Aby szybciej wygenerować zrzuty i zmniejszyć ich rozmiar, w programie SQL Server 2022 CU8 i PROGRAMIE SQL Server 2019 CU23 wprowadzono funkcję zrzutu pamięci skompresowanej. Po aktywowaniu Sqldumper.exe tworzy wiele wątków w celu jednoczesnego odczytywania pamięci procesu, kompresowania go, a następnie zapisywania go w pliku zrzutu. Ta wielowątkowa kompresja równoległa zmniejsza rozmiar pliku i przyspiesza proces dumpingu w przypadku użycia z pełnymi i filtrowanych zrzutów.
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żesz 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żna również ograniczyć liczbę rdzeni Sqldumper.exe użyć do utworzenia skompresowanego zrzutu przy użyciu parametru -cpu:X
, gdzie X jest liczbą 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, aby powodować opóźnienia lub zapobiegać tworzeniu zrzutów pamięci.
- Ścieżka we/wy, w której zapisywane są zrzuty pamięci, działają źle. W takich przypadkach badanie i rozwiązywanie problemów z wydajnością we/wy dysku jest następnym krokiem logicznym.
- Oprogramowanie antywirusowe lub inne oprogramowanie monitorujące zakłóca działanie SQLDumper.exe. W niektórych przypadkach funkcja ReadProcessMemory innej firmy. Może to znacznie zwiększyć czas trwania zrzutu. Aby rozwiązać większość tych problemów, wyłącz oprogramowanie zakłócające działanie 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 zrzuty, pełne zrzuty i odfiltrowane zrzuty.
Mini zrzuty z przywołyną pamięcią
Ten typ zrzutu pamięci to migawka wszystkich aktywnych wątków procesu ("stosy wątków"), wraz z ograniczonym wyodrębnieniem pamięci, do których odwołuje się stosy wątków, oraz niektóre inne kluczowe dane procesu lub wątku. Zazwyczaj są to kilka megabajtów rozmiaru i są szybko generowane (od mniej niż sekundy do kilku sekund). Nawet większe systemy serwerowe (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 zatrzaskiem, uszkodzenia bazy danych i asercjów.
Uwaga 16.
Program SQL Server w ramach wbudowanej instrumentacji wygeneruje automatyczne "mini zrzuty diagnostyczne" w niektórych konkretnych sytuacjach. W związku z tym ta operacja jest uważana za wystarczająco bezpieczną, że program SQL Server może wyzwolić ją automatycznie w razie potrzeby.
Pełne zrzuty
Pełny zrzut pamięci to kompletna kopia aktywnego obszaru procesu docelowego. W związku z tym obejmuje to cały stan wątku, wszystkie przydzielone pamięci procesu i wszystkie załadowane moduły. Pełne zrzuty będą zatem miały rozmiar, który jest mniej więcej taki sam w procesie programu SQL Server, co z kolei może być prawie tak duże, jak całkowita pamięć RAM systemu. Na dużych serwerach dedykowanych pojedynczemu wystąpieniu programu SQL Server, które może oznaczać plik, czyli kilkaset gigabajtów lub więcej. Nie trzeba powiedzieć, że wygenerowanie takiego pliku zajmie dużo czasu i w związku z tym wywoła długotrwałe zamrożenie. Wydajność dysku docelowego pliku zrzutu będzie znacząco wpływać na czas zamrażania. Ten typ zrzutu jest rzadko używany w przypadku programu SQL Server w dzisiejszych czasach, zgodnie z opisem w poniższym wyjaśnieniu.
Przefiltrowane zrzuty
Ponieważ rozmiar pamięci RAM typowych serwerów z uruchomionym programem SQL Server stale rośnie, pełne zrzuty stają się coraz bardziej niewygodne. W związku z tym przefiltrowane zrzuty są implementowane. Filtrowany zrzut to podzbiór pełnego zrzutu, w którym duże obszary pamięci programu SQL Server są wykluczone na bieżąco i nie są zapisywane na dysku. Zwykle wykluczona pamięć nie przynosi żadnej wartości dodanej do rozwiązywania problemów. Przykłady to strony danych/indeksu i niektóre wewnętrzne pamięci podręczne, takie jak strony danych Hekaton i pamięć puli dzienników. Ten filtrowany zrzut powoduje zmniejszenie rozmiaru pliku niż pełny zrzut, ale zrzut nadal zachowuje prawie całą jego użyteczność. 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 z pełnym zrzutem, ale nadal jest to dość duży plik, który często wynosi 30–60 procent rozmiaru procesu programu SQL Server. Dlatego najlepiej zaplanować możliwie duży rozmiar jako pełny zrzut jako najgorszą opcję, co pozostawia dobry margines bezpieczeństwa. Filtrowany zrzut może nie być koniecznie szybszy do wygenerowania niż pełny zrzut w każdym przypadku: jest to kwestia tego, 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ędzie mieć wpływ na to).
Poniższe zapytanie umożliwia uzyskanie przybliżonego oszacowania rozmiaru przefiltrowanego zrzutu. Chociaż oczekuje się, że większość stron danych lub indeksów jest wykluczona ze zrzutu, te, które są całkowicie zatrzasane i modyfikowane, nie zostaną pominięte.
SELECT SUM(pages_kb)
FROM sys.dm_os_memory_clerks
WHERE type != 'MEMORYCLERK_SQLBUFFERPOOL'
Ponieważ można użyć Sqldumper.exe do wygenerowania pliku zrzutu na żądanie dla dowolnej aplikacji systemu Microsoft Windows, możesz rozważyć użycie opcji filtrowanego zrzutu. Jednak filtrowany plik zrzutu ma zastosowanie tylko i znaczenie w kontekście programu SQL Server. Nadal można wygenerować mini-zrzut, pełny plik zrzutu lub aplikacje inne niż SQL Server pomyślnie.
Proces programu SQL Server wywołuje narzędzie Sqldumper.exe wewnętrznie w celu wygenerowania pliku zrzutu, gdy proces napotyka wszelkie wyjątki. Program SQL Server przekazuje parametry do Sqldumper.exe. Flagi śledzenia umożliwiają zmianę parametrów, które program SQL Server przekazuje do narzędzia domyślnie 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ć (wartość domyślna to mini-zrzut z przywołyną pamięcią). Na przykład:
- Flaga śledzenia 2551: tworzy filtrowany zrzut pamięci.
- Flaga śledzenia 2544: tworzy pełny zrzut 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, opcja wskazująca największy zrzut pamięci jest honorowany. Jeśli na przykład są używane flagi śledzenia 2551 i 2544, program SQL Server tworzy pełny zrzut pamięci.
Generowanie zrzutu pamięci w trybie failover klastra
W scenariuszach trybu failover klastra biblioteka DLL zasobu programu SQL Server może uzyskać plik zrzutu, zanim nastąpi przejście w tryb failover w celu ułatwienia rozwiązywania problemów. Gdy biblioteka DLL zasobu programu SQL Server ustali, że zasób programu SQL Server zakończył się niepowodzeniem, biblioteka 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. Biblioteka DLL zasobu czeka na ukończenie pliku zrzutu, zanim biblioteka DLL zasobu 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 którakolwiek 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 w tryb 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żesz 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żesz 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:
- Wybierz pozycję Uruchom,> wpisz cmd, a następnie wybierz przycisk OK.
- 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ć
SqlDumperDumpFlags
właściwość dla określonego pliku zrzutu, wpisz odpowiednie polecenie w wierszu polecenia, a następnie naciśnij Enter:Cały plik zrzutu pełnego 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ątku
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 16.
<DirectoryPath> jest symbolem zastępczym katalogu, w którym zostanie wygenerowany plik zrzutu, i powinien zostać określony w cudzysłowie (" ").
Właściwość
SqlDumperDumpTimeOut
cluster resource "SQL Server" /priv SqlDumperDumpTimeOut = <Timeout>
Uwaga 16.
<Limit> czasu jest symbolem zastępczym limitu czasu w milisekundach (ms).
Czas potrzebny na wygenerowanie 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 do tego 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żesz 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:
Wybierz pozycję Uruchom,> wpisz cmd, a następnie wybierz przycisk OK.
W przypadku 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
How to use 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 jest odpowiednie do odzwierciedlenia stanu procesu programu SQL Server. Uruchom następujące polecenie w kliencie programu SQL Server:
DBCC STACKDUMP
Aby uzyskać rozszerzone funkcje programu w programie SQL Server 2019, zobacz Rozszerzone funkcje DBCC STACKDUMP
DBCC STACKDUMP wprowadzone w programie SQL Server 2019.
Aby włączyć tę metodę do 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ąć przypadkowo uaktualniania wszystkich dalszych minidumps samoobsługowych minidumps programu SQL Server do większych zrzutów. W poleceniu TraceNumber> jest flagą ś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 wartość 2551 jest nadal aktywna, zobaczysz:
TraceFlag | Stan | Globalnie | Sesja |
---|---|---|---|
2551 | 1 | 1 | 0 |
Uwaga 16.
Włączone traceflag
przez DBCC TRACEON
program są resetowane (usunięte) 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 w celu obsługi 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 przy użyciu zrzutu pamięci. Może to zapewnić widoczny wzrost wydajności w czasie potrzebnym SQLDumper.exe wygenerowania zrzutu pamięci.
DBCC STACKDUMP WITH MINI_DUMP | FILTERED_DUMP | FULL_DUMP [, TEXT_DUMP = LIMITED | DETAILED]
Jest TEXT_DUMP = LIMITED
to opcja domyślna. 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 użyć skryptu programu PowerShell do wygenerowania pliku 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 poziomu wiersza polecenia jako administrator, używając następującego polecenia:
Powershell.exe -File SQLDumpHelper.ps1
Możesz też uruchomić go z poziomu konsoli programu Windows PowerShell i uruchomić jako administrator przy użyciu następującego polecenia:
.\SQLDumpHelper.ps1
Uwaga 16.
Jeśli nigdy nie uruchamiasz skryptów programu PowerShell w systemie, może zostać wyświetlony następujący komunikat o błędzie:
"Plik ... Nie można załadować pliku SQLDumpHelper.ps1, ponieważ uruchamianie skryptów jest wyłączone w tym systemie.
Aby włączyć możliwość uruchamiania poleceń, wykonaj następujące kroki:
Uruchom konsolę programu Windows PowerShell przy użyciu opcji Uruchom jako administrator . Tylko członkowie grupy administratorów na komputerze mogą zmienić zasady wykonywania.
Włącz uruchamianie niepodpisanych skryptów za pomocą następującego polecenia:
Set-ExecutionPolicy RemoteSigned
Uwaga 16.
Umożliwi to uruchamianie niepodpisanych skryptów utworzonych na komputerze lokalnym i podpisanych skryptów z Internetu.