使用 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 工具隨附於 Microsoft SQL Server。 它會產生 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 工具產生傾印檔案,請遵循下列步驟:

  1. <啟 SQLServerInstall 磁碟驅動器>:\Program Files\Microsoft SQL Server\<number>\Shared 資料夾。

    在此資料夾路徑中, <number> 是下列其中一項的佔位元:

    • 2019年 SQL Server 150
    • 2017年 SQL Server 140
    • 2016年 SQL Server 130
    • 2014年 SQL Server 120
    • 2012年 SQL Server 110
    • 2008 SQL Server 100
    • 2005 SQL Server 90
  2. 請確定 Dbghelp.dll 檔案位於此資料夾中。

  3. 取 [開始>執行],輸入 cmd,然後選取 [ 確定]

  4. 在命令提示字元中輸入下列命令,然後按 Enter

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

    注意事項

    在此資料夾路徑中,<number> 是與 SQL Server 版本一起變更的相同佔位元,如先前所述。

  5. 若要產生特定類型的傾印檔案,請在命令提示字元中輸入對應的命令,然後按 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 應用程式的進程標識符。 以下說明如何取得進程識別碼:

  1. Ctrl+Alt+Delete,然後選取 [ 任務管理器]
  2. 在 [ Windows 任務管理器 ] 對話框中,選取 [ 行程] 索引 標籤。
  3. 在 [ 檢視] 功能表上,選 取 [選取數據行]
  4. 在 [ 選取 數據行] 對話框中,選取 [ PID (進程標識符) ] 複選框,然後選取 [ 確定]
  5. 請注意您想要為其產生傾印檔案之 Windows 應用程式的進程識別碼。 針對 SQL Server 應用程式,請記下 Sqlservr.exe 進程的進程標識碼。
  6. 關閉 任務管理員

或者,使用 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\ 目錄中。

如何變更預設路徑

例如,如果傾印檔案大小太大,您可以執行下列動作來修改路徑:

  1. 啟 SQL Server 組態管理員
  2. [SQL Server 服務] 底下,找出 SQL Server 正在調查的實例。
  3. 以滑鼠右鍵按兩下該專案,選取 [ 屬性],然後移至 [ 進階 ] 索引卷標。
  4. 將該傾印目錄變更為所需的路徑,然後選取 [ 確定]
  5. 盡可能重新啟動 SQL Server () 讓新設定生效。

當手動使用 Sqldumper.exe 工具來產生任何 Windows 應用程式的傾印檔案時,傾印檔案可能會和 Windows 應用程式目前使用的記憶體一樣大。 請確定 Sqldumper.exe 寫入傾印檔案的磁碟驅動器上有足夠的磁碟空間。

在命令中指定自訂輸出資料夾

您可以指定要讓 Sqldumper.exe 工具寫入傾印檔案的目錄。 在您執行 Sqldumper.exe 之前,目錄必須已經存在。 否則,Sqldumper.exe 將會失敗。 請勿使用 UNC 路徑作為傾印檔案的位置。 以下是如何指定迷你傾印檔案傾印檔案位置的範例:

  1. 取 [開始>執行],輸入 cmd,然後選取 [ 確定]

  2. 在命令提示字元中輸入下列命令,然後按 Enter

    cd <SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\<number>\Shared
    
  3. 在命令提示字元中輸入下列命令,然後按 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 和尋找運作 (請參閱叢 集故障轉移上的記憶體傾印一節 ,以取得如何處理該情況) 的詳細數據。 任何依賴時鐘時間的逾時也可能會因為凍結而中斷。

如同可以衍生自上一個語句,因此凍結的持續時間是此處的重要因素,並由下列因素驅動:

  • 取的傾印類型
  • 記憶體中 SQL Server 進程的大小,如果是執行預設參數的單一使用中實例,通常會接近伺服器的實體 RAM 總數
  • 作為傾印目標的磁碟效能。

此外,應該規劃磁碟上的 傾印檔案大小 ,特別是當有多個傾印的可能性,而且已選取大型的非預設傾印類型時。 請務必檢閱 傾印類型 ,以瞭解預期的結果。 根據預設,某些傾印方法會在 SQL Server 實例的 \Log 資料夾中建立傾印,在默認情況下,簡單的設定也會是系統磁碟和 SQL Server 的數據+記錄磁碟。 將該磁碟帶入飽和狀態會嚴重影響 SQL Server和/或系統可用性。

管理叢集系統的影響

在傾印產生期間,進程會暫時暫停。 這可能會影響 SQL Server 服務可用性,並在 Always On 內容中觸發資源故障轉移, (故障轉移叢集實例和可用性群組) 。 不同進程的傾印產生會以不同的方式影響資源。 請仔細閱讀 傾印產生傾印類型 的影響一節。

在故障轉移叢集實例或可用性群組上擷取 SQL Server 傾印 (AG) SQL Server 實例時,如果傾印花費太多時間來完成,叢集 SQL Server 或 AG 可能會故障轉移到另一個節點。 這在使用非常大量 RAM 的系統上,或如果您產生已篩選或完整記憶體轉儲的系統,可能會特別有問題。 若要防止故障轉移,請先使用下列設定,再擷取傾印檔案。 在擷取傾印檔案之後,可以還原變更:

  • 針對故障轉移叢集實例 (FCI) :
    • 以滑鼠右鍵按兩下 [叢集管理員] 中的 [SQL Server 資源],選取 [如果資源失敗,請勿在 [原則] 索引卷標上重新啟動。
    • 在 [ 屬性] 索引 標籤上,增加 [HealthCheck 逾時]。 例如,將屬性值設定為 180 秒或更高。 如果達到此逾時,原則 如果資源失敗,則不會忽略重新啟動 ,而且資源還是會重新啟動。
    • 在 [ 屬性] 索 引標籤上,將 FailureConditionLevel 值變更為零。
  • 針對 AG,套用下列所有設定:
    • 增加會話逾時,例如,所有複本的 120 秒。 在 SQL Server Management Studio (SSMS) 中,以滑鼠右鍵按鍵按下要設定的複本,然後選取 [屬性]。 將 [工作階段逾時 (秒) 字段變更為 120 秒。 如需詳細資訊,請參閱 (SQL Server) 變更可用性複本的 Session-Timeout 期間
    • 將所有復本的自動故障轉移變更為手動故障轉移。 在 SSMS 中,以滑鼠右鍵按兩下複本,選取 [屬性],然後在 [屬性] 索引標籤上將所有複本的自動故障轉移變更為手動故障轉移。如需詳細資訊,請參閱變更可用性複本的故障轉移模式 (SQL Server)
    • LeaseTimeout 增加到 60,000 毫秒 (60 秒) ,並將 HealthCheckTimeout 變更為 90,000 毫秒 (90 秒) 。 在 [ 叢集管理員] 中,以滑鼠右鍵按兩下 [AG 資源],選取 [ 屬性],然後切換至 [ 屬性] 索引卷標以修改這兩個設定。 如需詳細資訊, 請參閱設定 HealthCheckTimeout 屬性設定

產品改良可降低對 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 引擎會追蹤是否已發生例外狀況,如果已有例外狀況,就不會產生新的記憶體轉儲。 這適用於存取違規、堆疊溢位、判斷提示和索引損毀例外狀況。 這可大幅減少記憶體轉儲所使用的磁碟空間量,而且不會暫時凍結進程以產生傾印。 這已在 2019 SQL Server 新增。

錯誤記錄檔中的縮短輸出

從單一記憶體轉儲產生 SQL Server 錯誤記錄檔中的內容不但會很龐大,而且也會因為將所有資訊串行化為錯誤記錄檔中的文字格式所需的時間,而使產生記憶體轉儲的程式變慢。 在 2019 年 SQL Server,傾印產生時儲存在錯誤記錄檔中的內容已大幅減少,看起來可能像這樣:

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 Server2019 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

您也可以使用 -cpu:X 參數來限制 Sqldumper.exe 可用來建立壓縮傾印的核心數目,其中 X 是 CPU 數目。 只有當您從命令行手動執行 Sqldumper.exe 時,才能使用此參數:

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

防止或延遲建立記憶體轉儲的因素

已知下列因素會造成延遲或防止建立記憶體轉儲。

  • 寫入記憶體轉儲的IO路徑執行效能不佳。 在這種情況下,調查和解決磁碟 I/O 效能是下一個邏輯步驟。
  • 防病毒軟體或其他監視軟體會干擾 SQLDumper.exe。 在某些情況下,第三方軟體會繞道 ReadProcessMemory 函式。 這可能會大幅增加傾印持續時間。 若要解決大部分的問題,請停用干擾軟體或將 SQLDumper.exe 新增至排除清單。

傾印類型

下列方法可用來產生三種不同類型的傾印: 迷你傾印完整傾印篩選傾印

具有參考記憶體的迷你傾印

這種類型的記憶體轉儲是進程的所有使用中線程 (「線程堆棧」) 的快照集,以及線程堆疊所參考記憶體的有限擷取,以及其他一些索引鍵進程或線程數據。 它們的大小通常為數 MB,而且可以快速地產生 (,從不到一秒到幾秒) 。 更大型的伺服器系統 (數百個 CPU 間接驅動 SQL Server 進程) 中的大量線程,很少會超過 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數據頁和記錄集區內存。 此篩選傾印所產生的檔案比完整傾印小,但傾印仍然保留幾乎所有的實用性。 在大部分小型傾印不足的情況下,篩選的傾印已取代完整傾印作為慣用選項。 相較於完整傾印,大小的減少可能會有所不同,但它仍然是相當大的檔案,通常是進程大小的 30-60% SQL Server。 因此,最好是規劃可能的大小,如同完整傾印一樣大,做為最差選項,這會留下良好的安全邊界。 在每個情況下,篩選傾印的產生速度可能不一定比完整傾印快:與避免 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 公用程式屬性,請遵循下列步驟:

  1. 取 [開始>執行],輸入 cmd,然後選取 [ 確定]
  2. 針對每個屬性,在命令提示字元中輸入對應的命令,然後按 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 工具屬性,請遵循下列步驟:

  1. 取 [開始>執行],輸入 cmd,然後選取 [ 確定]
  2. 針對特定屬性,在命令提示字元中輸入對應的命令,然後按 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,請參閱 2019 年 SQL Server 中導入的擴充 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在服務重新啟動之後 (移除) 重設。

2019年 SQL Server 導入的擴充 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 因為此系統已停用執行中的腳本。」

若要啟用執行命令的能力,請遵循下列步驟:

  1. 使用 [以系統管理員身分執行] 選項啟動 Windows PowerShell 控制台。 只有電腦上系統管理員群組的成員可以變更執行原則。

  2. 使用下列命令開啟執行未簽署的文稿:

    Set-ExecutionPolicy RemoteSigned
    

    注意事項

    這可讓您執行在本機計算機上建立的未簽署腳本,以及從因特網簽署的腳本。