使用 Sqldumper.exe 工具來在 SQL Server 中產生傾印檔案
本文提供 SQL Server 隨附之Sqldumper.exe工具的一般指導方針。 此工具可用來產生不同類型的傾印檔案。
原始產品版本: SQL Server 2019、SQL Server 2017、SQL Server 2016、SQL Server 2014、SQL Server 2012、SQL Server 2008、SQL Server 2005
原始 KB 編號: 917825
摘要
Sqldumper.exe工具隨附於 SQL Server Microsoft。 它會產生 SQL Server 的記憶體轉儲檔案和相關進程以進行偵錯。 本文說明如何使用 Sqldumper.exe 來產生 Watson 錯誤報告或偵錯工作的傾印檔案。
本文也會說明另外兩種方法來產生傾印檔案:
- 連結的 PowerShell 腳本 會自動SQLDumper.exe命令行選項。
- DBCC STACKDUMP Transact-SQL (T-SQL) 命令可用來在 SQL Server 中產生傾印檔案。
如何手動執行Sqldumper.exe
在 SQL Server 原本安裝此工具的資料夾內容下執行Sqldumper.exe工具。
根據預設,Sqldumper.exe的安裝路徑是 SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\90\Shared\SQLDumper.exe。< 請注意, <SQLServerInstall 磁碟驅動器> 是安裝 SQL Server 之磁碟驅動器的佔位符。
若要使用 Sqldumper.exe 工具來產生傾印檔案,請遵循下列步驟:
開啟 SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\<number>\Shared 資料夾。<
在此資料夾路徑中, <number> 是下列其中一個版本的佔位元:
- 150 for SQL Server 2019
- 140 for SQL Server 2017
- 130 for SQL Server 2016
- 120 for SQL Server 2014
- 110 for SQL Server 2012
- 100 for SQL Server 2008
- 90 for SQL Server 2005
請確定 Dbghelp.dll 檔案位於此資料夾中。
選取 [啟動>執行],輸入 cmd,然後選取 [確定]。
在命令提示字元中輸入下列命令,然後按 Enter:
cd <SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\<number>\Shared
注意
在此資料夾路徑中, <number> 與 SQL Server 版本變更的佔位元相同,如先前所述。
若要產生特定類型的傾印檔案,請在命令提示字元輸入對應的命令,然後按 Enter:
完整傾印檔案:
Sqldumper.exe <ProcessID> 0 0x01100
迷你傾印檔案:
Sqldumper.exe <ProcessID> 0 0x0120
包含間接參考記憶體的迷你傾印檔案(這是建議的選項,而且 SQL Server 預設也會在自動產生記憶體轉儲檔案時使用):
Sqldumper.exe <ProcessID> 0 0x0128
篩選的傾印檔案:
Sqldumper.exe <ProcessID> 0 0x8100
注意
<ProcessID> 是您要為其產生傾印檔案之 Windows 應用程式之進程標識碼的佔位元元。
如果Sqldumper.exe執行成功,此工具會在安裝工具的資料夾中產生傾印檔案。
Sqldumper.exe產生的傾印檔案具有類似 SQLDmpr<xxxx.mdmp> 的檔名模式。
在此模式中, <xxxx> 是以相同資料夾中具有類似檔名的其他檔案決定的遞增數目。 如果資料夾中有符合指定模式的檔案,請考慮比較其建立日期和時間,以尋找您想要的檔案。
如何取得Microsoft Windows 應用程式進程標識碼
若要使用 Sqldumper.exe 工具產生傾印檔案,您必須具有您想要為其產生傾印檔案的 Windows 應用程式進程標識碼。 以下說明如何取得進程識別碼:
- 按 Ctrl+Alt+Delete,然後選取 [任務管理器]。
- 在 [ Windows 任務管理器] 對話框中,選取 [ 行程 ] 索引標籤。
- 在 [ 檢視] 功能表上,選取 [ 選取數據行]。
- 在 [ 選取數據行 ] 對話框中,選取 [PID (進程標識符)] 複選框,然後選取 [ 確定]。
- 請注意您要為其產生傾印檔案的 Windows 應用程式進程標識碼。 針對 SQL Server 應用程式,請注意Sqlservr.exe進程的進程識別碼。
- 關閉 [工作管理員]。
或者,使用 SQL Server 錯誤記錄檔來取得電腦上執行之 SQL Server 應用程式的進程識別碼。 SQL Server 錯誤記錄檔的一部分類似下列範例:
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.
出現的Server process ID
數位是Sqlservr.exe進程的進程標識碼。
記憶體轉儲檔案的輸出路徑
當需要記憶體轉儲來解決特定問題時,SQLDumper.exe主要會產生 SQL Server 進程的記憶體轉儲檔案,例如例外狀況、判斷提示或非產生排程器。 在這種情況下,SQL Server 會叫用 SQLDumper.exe,以產生其進程的記憶體轉儲檔案。 根據預設,記憶體傾印檔案會儲存在 SQL 實例 MSSQL\LOG\ 目錄中。
如何變更預設路徑
例如,如果傾印檔案大小太大,您可以遵循下列步驟來修改路徑:
- 開啟 [SQL Server 組態管理員] 。
- 在 [SQL Server 服務] 下,找出正在調查的 SQL Server 實例。
- 以滑鼠右鍵按兩下該專案,選取 [屬性],然後移至 [ 進階 ] 索引卷標。
- 將傾印目錄變更為所需的路徑,然後選取 [ 確定]。
- 重新啟動 SQL Server (可能的話),讓新設定生效。
當手動使用 Sqldumper.exe 工具來產生任何 Windows 應用程式的傾印檔案時,傾印檔案可能會和 Windows 應用程式目前使用的記憶體一樣大。 請確定Sqldumper.exe寫入傾印檔案的磁碟驅動器上有足夠的磁碟空間。
在命令中指定自訂輸出資料夾
您可以指定您要Sqldumper.exe工具寫入傾印檔案的目錄。 執行Sqldumper.exe之前,目錄必須已經存在。 否則,Sqldumper.exe會失敗。 請勿使用 UNC (通用命名慣例) 路徑作為傾印檔案的位置。 下列步驟提供如何指定迷你傾印檔案位置的範例:
選取 [啟動>執行],輸入 cmd,然後選取 [確定]。
在命令提示字元中輸入下列命令,然後按 Enter:
cd <SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\<number>\Shared
在命令提示字元中輸入下列命令,然後按 Enter:
Sqldumper.exe ProcessID 0 0x0128 0 <MdumpPath>
注意
<MdumpPath> 是您要Sqldumper.exe工具寫入傾印檔案之目錄的佔位符。 根據預設,檔案會寫入目前資料夾。
如果您指定要產生的完整傾印檔案或篩選的傾印檔案,Sqldumper.exe可能需要幾分鐘的時間才能產生傾印檔案。 所花費的時間取決於下列變數:
- Sqlservr.exe目前使用的記憶體數量。
- 工具用來儲存傾印檔案的磁碟驅動器寫入速度。
在此期間,Sqldumper.exe工具不會處理命令。 您會發現伺服器停止回應。 此外,可能會發生叢集故障轉移。
權限需求
若要執行Sqldumper.exe,您必須使用下列其中一種方法登入 Windows:
- 使用屬於計算機上系統管理員群組成員的帳戶。
- 使用執行 SQL Server 服務的相同用戶帳戶。
若要讓Sqldumper.exe工具透過遠端桌面或終端機服務順利運作,您必須在主控台模式中啟動遠端桌面或終端機服務。 例如,若要在主控台模式中啟動遠端桌面,請選取 [啟動>執行],輸入 mstsc /console,然後選取 [確定]。 如果目標伺服器執行 Windows 2000, 則會以無訊息方式忽略 /console 選項。 您可以透過遠端桌面連線到伺服器,但不會使用主控台工作階段。
如果您在執行 Sqldumper.exe 之後發現目前資料夾中尚未產生任何傾印檔案,請檢查工具所產生的命令行輸出,以識別失敗的潛在原因。 此資訊也會記錄在 目前目錄中的 Sqldumper_errorlog.log 檔案中。 以下是兩個可能的錯誤訊息及其原因:
訊息 | 原因 |
---|---|
「OpenProcess 失敗0x57 - 參數不正確」 | 無效的進程標識碼已傳遞至Sqldumper.exe公用程式。 |
「線程識別碼的值無效 - <參數錯誤無效> 」 | 無效的參數已傳遞至Sqldumper.exe公用程式。 |
如果產生類似下列其中一項的錯誤訊息,您可以放心地忽略此訊息:
- 「迷你傾印 6 期間的未知回呼類型」
- 「迷你傾印 7 期間的未知回呼類型」
傾印產生的影響
要求使用者模式進程的傾印檔案時(如本文所述,與超出我們範圍的操作系統核心傾印不同),目標進程(此處為SQLServer.exe)在將傾印內容串行化至其檔案目標時會凍結。
凍結表示進程無法執行任何使用者要求或任何內部作業,包括任何資源輪詢機制,例如實作 Windows 叢集的 IsAlive 和 Looks Alive(如需如何處理這種情況的詳細數據,請參閱 叢集故障轉移上的記憶體傾印一節 )。 任何依賴時鐘時間的逾時,也可能會因為凍結而遭到入侵。
根據上一個語句,凍結的持續時間是這裡的關鍵因素,由下列因素驅動:
- 選取的傾印類型。
- 記憶體中的 SQL Server 進程大小,在單一作用中實例執行預設參數的情況下,通常會接近伺服器的總實體 RAM。
- 作為傾印目標之磁碟的效能。
此外, 應該規劃磁碟上的傾印檔案 大小,特別是如果有多個傾印是可能的,而且選取大型的非預設傾印類型時。 請務必檢閱 傾印類型 ,以瞭解預期的情況。 根據預設,某些傾印方法會在 SQL Server 實例的 \Log 資料夾中建立傾印,在預設的簡單設定中,也會是 SQL Server 的系統磁碟和數據+記錄磁碟。 讓該磁碟飽和對 SQL Server 和/或系統可用性造成嚴重影響。
管理對叢集系統的影響
進程會在傾印產生期間暫時暫停。 這可能會影響 Always On 內容中的 SQL Server 服務可用性,並觸發資源故障轉移(故障轉移叢集實例和可用性群組)。 不同進程的傾印產生會以不同的方式影響資源。 仔細閱讀傾印產生和傾印類型的影響小節。
當您在故障轉移叢集實例或 SQL Server 的可用性群組 (AG) 實例上擷取 SQL Server 傾印時,如果傾印花費太多時間才能完成,叢集 SQL Server 或 AG 可能會故障轉移至另一個節點。 對於使用大量 RAM 的系統上,或如果您要產生已篩選或完整記憶體轉儲,這可能會特別有問題。 若要防止故障轉移,請先使用下列設定,再擷取傾印檔案。 在擷取傾印檔案之後,可以還原變更:
- 針對故障轉移叢集實例 (FCI):
- 以滑鼠右鍵按兩下 [叢集管理員] 中的 [SQL Server 資源],選取 [如果資源失敗,請勿在 [原則] 索引卷標上重新啟動。
- 在 [ 屬性] 索引標籤上 ,增加 [健康情況檢查逾時]。 例如,將屬性值設定為 180 秒或更新版本。 如果達到此逾時, 原則如果資源失敗,則不會忽略重新啟動 ,並重新啟動資源。
- 在 [ 屬性] 索引標籤上,將 FailureConditionLevel 值變更為零。
- 針對 AG,請套用下列所有設定:
- 增加會話逾時,例如,所有複本的 120 秒。 在 SQL Server Management Studio (SSMS) 中,以滑鼠右鍵按兩下要設定的複本,然後選取 [ 屬性]。 將 [ 工作階段逾時(秒)] 字段變更為 120 秒。 如需詳細資訊,請參閱變更可用性複本的會話逾時期間(SQL Server)。
- 將所有復本的自動故障轉移變更為手動故障轉移。 在 SSMS 中,以滑鼠右鍵按下複本,選取 [屬性],然後將所有複本的自動故障轉移變更為 [屬性] 索引卷標上的手動故障轉移。如需詳細資訊,請參閱變更可用性複本的故障轉移模式(SQL Server)。
- 將 LeaseTimeout 增加到 60,000 毫秒(60 秒),並將 HealthCheckTimeout 變更為 90,000 毫秒(90 秒)。 在 [叢集管理員] 中,以滑鼠右鍵按兩下 [AG 資源],選取 [屬性],然後切換至 [屬性] 索引卷標以修改這兩個設定。 如需詳細資訊,請參閱< Configure HealthCheckTimeout Property Settings>。
降低對 SQL Server 影響的產品改進
SQL Server 的最新版本已新增四個主要改善,以減少傾印檔案的大小和/或產生記憶體轉儲的時間:
位圖篩選機制
SQL Server 會配置點陣圖,以追蹤要從篩選的傾印中排除的記憶體頁面。 Sqldumper.exe 會讀取點陣圖並篩選出頁面,而不需要讀取任何其他記憶體管理員中繼資料。 當點陣圖分別啟用或停用時,您會在 SQL Server 錯誤記錄檔中看到下列訊息:
Page exclusion bitmap is enabled.
和 Page exclusion bitmap is disabled.
SQL Server 2016
從 SQL Server 2016 SP2 CU13 開始,預設會啟用位圖篩選。
SQL Server 2017
- 這無法在 RTM 中透過 CU15 使用。
- 在 SQL Server 2017 CU16 中,您可以透過 T8089 啟用位圖篩選,並關閉 T8089 加以停用。
- 從 SQL Server 2017 CU20 開始,預設會啟用位圖篩選。 追蹤旗標 T8089 將不再套用,如果開啟則會忽略。 您可以透過 T8095 停用位圖篩選。
SQL Server 2019
SQL Server 2019 RTM 預設會啟用此功能。 您可以透過 T8095 加以停用。
在相同問題上消除重複傾印
會消除相同問題的重複記憶體轉儲。 使用堆棧簽章時,SQL 引擎會持續追蹤是否已發生例外狀況,而且如果已經有例外狀況,則不會產生新的記憶體轉儲。 這適用於存取違規、堆疊溢位、判斷提示和索引損毀例外狀況。 這可大幅減少記憶體轉儲所使用的磁碟空間量,而且不會暫時凍結進程以產生傾印。 這是在 SQL Server 2019 中新增的。
錯誤記錄檔中的縮短輸出
從單一記憶體傾印在 SQL Server 錯誤記錄檔中產生的內容不僅可能壓倒性,而且也會因為將所有這些資訊串行化為錯誤記錄檔中文字格式所需的時間,而降低產生記憶體轉儲的程式速度。 在 SQL Server 2019 中,在傾印產生時儲存在錯誤記錄檔中的內容已大幅減少,而且看起來可能像這樣:
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.
先前,當使用者觸發手動傾印時,SQL Server 會列印每個會話或線程的資訊。
記憶體傾印的平行壓縮
為了更快產生傾印並使其大小較小,SQL Server 2022 CU8 和 SQL Server 2019 CU23 中引進了壓縮記憶體轉儲功能。 啟用時,Sqldumper.exe建立多個線程以同時讀取進程的記憶體、壓縮它,然後將它儲存至傾印檔案。 這個多線程的平行壓縮可減少檔案大小,並在搭配完整和篩選的傾印使用時加速傾印程式。
您可以開啟追蹤旗標 2610 以啟用壓縮記憶體轉儲:
DBCC TRACEON (2610,-1)
GO
DBCC STACKDUMP with FILTERED_DUMP
GO
DBCC TRACEOFF (2610,-1)
或者,您可以將 作為啟動參數新增 -T2610
至 SQL Server 實例,使其一律會建立壓縮的記憶體轉儲。
如果您手動執行Sqldumper.exe,您可以使用 -zdmp
參數來擷取壓縮的記憶體轉儲。 例如:
Sqldumper.exe <ProcessID> 0 0x8100 0 d:\temp -zdmp
您也可以使用 參數來限制Sqldumper.exe可用來建立壓縮傾印 -cpu:X
的核心數目,其中 X 是 CPU 數目。 只有在您從命令行手動執行Sqldumper.exe時,才能使用此參數:
Sqldumper.exe <ProcessID> 0 0x8100 0 d:\temp -zdmp -cpu:8
防止或延遲建立記憶體轉儲的因素
已知下列因素會導致延遲或防止建立記憶體轉儲。
- 寫入記憶體轉儲的IO路徑效能不佳。 在這種情況下,若要調查和解析磁碟 I/O 效能,是下一個邏輯步驟。
- 防病毒軟體或其他監視軟體干擾SQLDumper.exe。 在某些情況下,第三方軟體會繞道 ReadProcessMemory 函式。 這可能會大幅增加傾印持續時間。 若要解決大部分的問題,請停用干擾軟體,或將SQLDumper.exe新增至排除清單。
傾印類型
下列方法可用來產生三種不同類型的傾印:迷你傾印、完整傾印和篩選傾印。
具有參考記憶體的迷你傾印
這種類型的記憶體轉儲是進程所有使用中線程的快照集(「線程堆棧」),以及線程堆疊所參考的記憶體有限擷取,以及其他一些重要進程或線程數據。 它們通常大小為幾 MB,而且能夠快速產生(從不到一秒到幾秒)。 即使是較大的伺服器系統(在 SQL Server 進程中間接驅動大量線程的數百個 CPU)也很少會超過 20-30 MB:小型傾印的大小不會隨著 SQL Server 進程的大小而成長。 此傾印類型是 SQL Server 在例外狀況、排程器問題、閂鎖問題、資料庫損毀和判斷提示時自動產生記憶體傾印時所使用的默認類型。
注意
SQL Server 是其內建檢測的一部分,會在某些特定情況下產生自動化的「診斷迷你傾印」。 因此,此作業會被視為安全無虞,因此 SQL Server 可以在需要時自動觸發它。
完整傾印
完整記憶體轉儲是使用中目標進程空間的完整複本。 因此,這包括所有線程狀態、所有進程配置的記憶體,以及所有已載入的模組。 因此,完整傾印的大小大致與 SQL Server 進程相同,這反過來可能 幾乎與系統 RAM 總計一樣大。 在專用於單一 SQL Server 實例的大型伺服器上,這可能表示檔案,也就是數百 GB 以上的檔案。 不用說,這類檔案需要很長的時間才能產生,因此會引發長時間凍結。 傾印檔案目標的磁碟效能將大幅影響凍結時間。 這種類型的傾印目前很少用於 SQL Server,如下列說明所述。
篩選的傾印
隨著執行 SQL Server 之一般伺服器的 RAM 大小穩步增加,完整傾印會變得更不笨手笨腳。 因此會實作篩選的傾印。 篩選的傾印是完整傾印的子集,其中大量 SQL Server 記憶體區域會即時排除,而不會寫入磁碟。 一般而言,排除的記憶體不會為疑難解答帶來額外的值。 範例包括數據/索引頁面和一些內部快取,例如Hekaton數據頁和記錄集區內存。 這個篩選的傾印會產生比完整傾印更小的檔案,但傾印仍會保留幾乎所有的效用。 在絕大多數迷你傾印不足的情況下,篩選的傾印已取代為慣用選項。 與完整傾印相比,大小減少可能會有所不同,但它仍然是相當大型的檔案,通常是 SQL Server 進程大小的 30-60%。 因此,最好規劃大小盡可能大為完整傾印作為最差的選項,這留下了良好的安全邊界。 在每種情況下,篩選的傾印可能不一定比完整傾印更快:與避免IO數目相關的收益是否超過實作篩選邏輯所需的時間(磁碟速度和CPU/RAM速度會影響這一點)。
您可以使用下列查詢來取得篩選傾印大小的粗略估計。 雖然預期大部分的數據或索引頁面都會從傾印中排除,但不會省略完全閂鎖和修改的數據頁。
SELECT SUM(pages_kb)
FROM sys.dm_os_memory_clerks
WHERE type != 'MEMORYCLERK_SQLBUFFERPOOL'
由於您可以使用 Sqldumper.exe,視需要產生任何Microsoft Windows 應用程式的傾印檔案,因此您可以考慮使用篩選的傾印選項。 不過,篩選的傾印檔案只有在 SQL Server 的內容中才適用且有意義。 您仍然可以成功產生迷你傾印、完整傾印檔案或非 SQL Server 應用程式。
當進程遇到任何例外狀況時,SQL Server進程會在內部呼叫 Sqldumper.exe 工具,以產生傾印檔案。 SQL Server 會將參數傳遞至Sqldumper.exe。 您可以使用追蹤旗標,在發生例外狀況或判斷提示時,變更 SQL Server 預設傳遞給工具的參數。 這些追蹤旗標的範圍是從 2540 到 2559。 您可以使用其中一個追蹤旗標來變更SQLDumper.exe產生的預設傾印類型(預設值是具有參考記憶體的迷你傾印)。 例如:
- 追蹤旗標 2551:產生篩選的記憶體傾印。
- 追蹤旗標 2544:產生完整記憶體轉儲。
- 追蹤旗標 8026:SQL Server 會在產生傾印一次之後清除傾印觸發程式。
如果兩個以上的追蹤旗標為使用中,表示接受最大記憶體轉儲的選項。 例如,如果使用追蹤旗標 2551 和 2544,SQL Server 會建立完整的記憶體轉儲。
在叢集故障轉移上產生記憶體轉儲
在叢集故障轉移案例中,SQL Server 資源 DLL 可以在故障轉移發生之前取得傾印檔案,以協助進行疑難解答。 當 SQL Server 資源 DLL 判斷 SQL Server 資源失敗時,SQL Server 資源 DLL 會使用 Sqldumper.exe 公用程式取得 SQL Server 流程的傾印檔案。 若要確定Sqldumper.exe工具已成功產生傾印檔案,您必須將下列三個屬性設定為必要條件:
SqlDumperDumpTimeOut
使用者指定的逾時。資源 DLL 會在資源 DLL 停止 SQL Server 服務之前等候傾印檔案完成。
SqlDumperDumpPath
Sqldumper.exe工具產生傾印檔案的位置。
SqlDumperDumpFlags
Sqldumper.exe使用的旗標。
如果未設定任何一個屬性,Sqldumper.exe無法產生傾印檔案。 每當資源上線時,都會在事件記錄檔和叢集記錄檔中記錄警告訊息。
SQL Server 2012 和更新版本的 SQLDumper 叢集組態
您可以使用 ALTER SERVER CONFIGURATION
(T-SQL) 命令來修改這些屬性。 例如:
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;
或者,您可以使用 PowerShell 腳本。 例如,針對具名實例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
若要檢查是否已套用設定,您可以執行下列 PowerShell 命令:
Get-ClusterResource -Name "SQL Server (SQL2017AG)" | Get-ClusterParameter
SQL Server 2008/2008 R2 或 Windows 2012 和舊版上的 SQLDumper 叢集設定
若要使用 叢集資源 命令設定叢集故障轉移Sqldumper.exe公用程式屬性,請遵循下列步驟:
- 選取 [啟動>執行],輸入 cmd,然後選取 [確定]。
- 針對每個屬性,在命令提示字元輸入對應的命令,然後按 Enter:
SqlDumperDumpFlags
屬性若要設定
SqlDumperDumpFlags
特定傾印檔案的屬性,請在命令提示字元輸入對應的命令,然後按 Enter:所有線程完整傾印檔案
預設執行個體
cluster resource "SQL Server" /priv SqlDumperDumpFlags = 0x01100
具名執行個體
cluster resource "SQL Server (INSTANCE1)" /priv SqlDumperDumpFlags = 0x01100
所有線程迷你傾印檔案
預設執行個體
cluster resource "SQL Server" /priv SqlDumperDumpFlags = 0x0120
具名執行個體
cluster resource "SQL Server (INSTANCE1)" /priv SqlDumperDumpFlags = 0x0120
已篩選所有線程傾印檔案
預設執行個體
cluster resource "SQL Server" /priv SqlDumperDumpFlags = 0x8100
具名執行個體
cluster resource "SQL Server (INSTANCE1)" /priv SqlDumperDumpFlags = 0x8100
SqlDumperDumpPath
屬性cluster resource "SQL Server" /priv SqlDumperDumpPath = <DirectoryPath>
注意
<DirectoryPath> 是傾印檔案將產生所在的目錄佔位符,而且應該在引號內指定它 (“ ” ) 。
SqlDumperDumpTimeOut
屬性cluster resource "SQL Server" /priv SqlDumperDumpTimeOut = <Timeout>
注意
<逾時> 是以毫秒為單位的逾時佔位元(毫秒)。
工具產生 SQL Server 進程的傾印檔案所花費的時間取決於計算機組態。 對於具有大量記憶體的計算機,時間可能相當重要。 若要估計程式所需的時間,請使用 Sqldumper.exe 工具來手動產生傾印檔案。 屬性的有效值為 SqlDumperDumpTimeOut
從 10,000 毫秒 到 MAXDWORD。MAXDWORD 代表 DWORD 數據類型範圍中的最高值(4294967295)。
若要確認設定已啟用,您可以執行下列命令:
cluster resource "SQL Server" /priv
拿掉叢集故障轉移的Sqldumper.exe屬性
若要移除叢集故障轉移Sqldumper.exe工具屬性,請遵循下列步驟:
選取 [啟動>執行],輸入 cmd,然後選取 [確定]。
針對特定屬性,在命令提示字元中輸入對應的命令,然後按 Enter:
SqlDumperDumpFlags
屬性預設執行個體
cluster resource "SQL Server" /priv:SqlDumperDumpFlags /usedefault
具名執行個體
cluster resource "SQL Server (INSTANCE1)" /priv:SqlDumperDumpFlags /usedefault
SqlDumperDumpPath
屬性預設執行個體
cluster resource "SQL Server" /priv:SqlDumperDumpPath /usedefault
具名執行個體
cluster resource "SQL Server (INSTANCE1)" /priv:SqlDumperDumpPath /usedefault
SqlDumperDumpTimeOut
屬性預設執行個體
cluster resource "SQL Server" /priv:SqlDumperDumpTimeOut /usedefault
具名執行個體
cluster resource "SQL Server (INSTANCE1)" /priv:SqlDumperDumpTimeOut /usedefault
如何使用 DBCC STACKDUMP
DBCC STACKDUMP
命令可協助您在 SQL Server 實例安裝的 LOG 目錄中建立記憶體轉儲。 根據預設,此命令會建立具有所有線程的小型傾印,其大小有限且足以反映 SQL Server 進程的狀態。 在 SQL Server 用戶端中執行下列命令:
DBCC STACKDUMP
如需 SQL Server 2019 的擴充功能 DBCC STACKDUMP
,請參閱 SQL Server 2019 中引進的擴充 DBCC STACKDUMP 功能。
若要啟用此方法以建立篩選的傾印,請使用下列命令開啟追蹤旗標 2551:
DBCC TRACEON(2551, -1)
GO
DBCC STACKDUMP
若要建立完整傾印,請使用追蹤旗標 2544。
取得傾印檔案之後,您應該使用 命令 DBCC TRACEOFF (<TraceNumber>, -1);
來停用追蹤旗標,以避免不小心將所有進一步的 SQL Server 自我診斷迷你傾印升級至較大的傾印。 在命令中, <TraceNumber> 是您先前啟用的追蹤旗標,例如 2551 或 2544。 例如:
DBCC TRACEOFF(2551, -1)
如果您不確定哪個追蹤旗標維持使用中狀態,請執行下列命令:
DBCC TRACESTATUS(-1)
空的結果集表示沒有作用中的追蹤旗標。 相反地,如果 2551 仍在使用中,您會看到:
TraceFlag | 狀態 | 全球 | 會議 |
---|---|---|---|
2551 | 1 | 1 | 0 |
注意
啟用的 DBCC TRACEON
會在traceflag
服務重新啟動後重設(移除)。
SQL Server 2019 中引進的擴充 DBCC STACKDUMP 功能
從 SQL Server 2019 CU2 開始, DBCC STACKDUMP
命令已擴充以支持產生不同類型的傾印:迷你、篩選和完整傾印。 此命令不需要使用追蹤旗標。 它也可讓您限制使用記憶體傾印所產生的其他文本檔中的文字輸出。 這樣做可能會在產生記憶體轉儲SQLDumper.exe所需的時間中提供可見的效能提升。
DBCC STACKDUMP WITH MINI_DUMP | FILTERED_DUMP | FULL_DUMP [, TEXT_DUMP = LIMITED | DETAILED]
TEXT_DUMP = LIMITED
是預設選項。 如果您想要在 SQLDump000X.txt 檔案中收到詳細的輸出,您可以使用 TEXT_DUMP = DETAILED
。
若要在 .txt 檔案中產生具有有限輸出的篩選傾印,請執行下列命令:
DBCC STACKDUMP WITH FILTERED_DUMP , TEXT_DUMP = LIMITED
如何使用PowerShell腳本搭配 SQLDumper 產生傾印檔案
將下列程式代碼儲存為 PS1 檔案,例如 SQLDumpHelper.ps1:
程式碼詳細資料
$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."
使用下列命令,以系統管理員身分從命令提示字元執行它:
Powershell.exe -File SQLDumpHelper.ps1
或者,從 Windows PowerShell 控制台執行它,並使用下列命令以系統管理員身分執行:
.\SQLDumpHelper.ps1
注意
如果您從未在系統上執行 PowerShell 文稿,您可能會收到下列錯誤訊息:
「檔案...無法載入 SQLDumpHelper.ps1,因為此系統上已停用執行腳本。」
若要啟用執行命令的能力,請遵循下列步驟:
使用 [ 以系統管理員 身分執行] 選項啟動 Windows PowerShell 控制台。 只有電腦上的系統管理員群組成員可以變更執行原則。
透過下列命令啟用執行未簽署的文稿:
Set-ExecutionPolicy RemoteSigned
注意
這可讓您執行在本機計算機上建立的未簽署腳本,以及從因特網簽署的腳本。