共用方式為


SQLdiag 公用程式

適用於:SQL Server

SQLdiag 公用程式是一種可當做主控台應用程式或服務加以執行的一般用途診斷集合公用程式。 您可以使用 SQLdiag 以從 SQL Server 和其他類型的伺服器收集記錄檔和資料檔案,然後使用它來監視您的伺服器或疑難排解伺服器的特定問題。 SQLdiag 用於加速和簡化 Microsoft 客戶支援服務診斷資訊收集工作。

注意

此公用程式可能會變更,而依賴其命令行自變數或行為的應用程式或腳本在未來版本中可能無法正常運作。

SQLdiag 可以收集下列類型的診斷資訊:

  • Windows 效能記錄
  • Windows 事件記錄
  • SQL Server Profiler 追蹤工具
  • SQL Server 封鎖資訊
  • SQL Server 設定資訊

您可以編輯組態檔 SQLdiag.xml來指定您想要 SQLdiag 收集的信息類型,如下一節所述。

語法

sqldiag
    { [ /? ] }
    |
    {
      [ /I configuration_file ]
      [ /O output_folder_path ]
      [ /P support_folder_path ]
      [ /N output_folder_management_option ]
      [ /M machine1 [ machine2 machineN ] | @machinelistfile ]
      [ /C file_compression_type ]
      [ /B [+]start_time ]
      [ /E [+]stop_time ]
      [ /A SQLdiag_application_name ]
      [ /T { tcp [ ,port ] | np | lpc } ]
      [ /Q ] [ /G ] [ /R ] [ /U ] [ /L ] [ /X ]
    }
    |
    { [ START | STOP | STOP_ABORT ] }
    |
    { [ START | STOP | STOP_ABORT ] /A SQLdiag_application_name }

引數

?

顯示使用資訊。

/I 設定檔案

設定 SQLdiag 要使用的組態檔。 根據預設,/I 會設定為 SQLdiag.xml

/O output_folder_path

SQLdiag 輸出重新導向至指定的資料夾。 /O如果未指定選項,SQLdiag 輸出會寫入 SQLdiag 啟動資料夾下名為 SQLDIAG 的子資料夾。 SQLDIAG如果資料夾不存在,SQLdiag 會嘗試建立它。

注意

輸出資料夾的位置是相對於您可以透過 /P 指定的支援資料夾位置。 若要為輸出資料夾設定完全不同的位置,請指定 /O的完整目錄路徑。

/P support_folder_path

設定支援資料夾路徑。 根據預設, /P 會設定為 SQLdiag 可執行檔所在的資料夾。 此支援資料夾包含 SQLdiag 支援檔案,例如 XML 組態檔、Transact-SQL 指令碼與公用程式在診斷收集期間所使用的其他檔案。 如果您使用此選項來指定替代的支援檔案路徑, SQLdiag 會在尚未存在時,自動將所需的支持檔案複製到指定的資料夾。

若要將目前的資料夾設定為支援路徑,請在命令列上指定 %cd% ,如下所示:

sqldiag /P %cd%

/N 輸出資料夾管理選項

設定 SQLdiag 在啟動時,是要覆寫或重新命名輸出資料夾。 可用選項:

  • 1 = 覆寫輸出資料夾 (預設值)
  • 2 = 當 SQLdiag 啟動時,它會將輸出資料夾重新命名為 SQLDIAG_00001SQLDIAG_00002等等。 重新命名目前的輸出資料夾之後, SQLdiag 會將輸出寫入預設輸出資料夾 SQLDIAG

SQLdiag 不會在啟動時,將輸出附加至目前的輸出資料夾。 它只能覆寫預設輸出資料夾(選項 1)或重新命名資料夾(選項 2),然後將輸出寫入名為 SQLDIAG的新預設輸出資料夾。

/M machine1 [ machine2machineN ] | @machinelistfile

覆寫設定檔案中指定的機器。 根據預設,組態檔為 SQLdiag.xml,或使用 參數設定 /I 。 當指定一部以上的電腦時,請用空格隔開每一個電腦名稱。

[@machinelistfile] 選項會指定要儲存在組態檔中的計算機清單檔名。

/C file_compression_type

設定 SQLdiag 輸出資料夾檔案所用的檔案壓縮類型。 可用選項:

  • 0 = 無 (預設值)
  • 1 = 使用 NTFS 壓縮

/B [+]start_time

指定以下格式開始收集診斷資料的日期和時間: yyyyMMdd_HH:mm:ss

時間使用 24 小時標記法指定。 例如,下午 2:00 應指定為 14:00:00

使用 + 不含日期(僅 HH:mm:ss)來指定相對於目前日期和時間的時間。 例如,如果您指定 /B +02:00:00SQLdiag 會在開始收集資訊之前等候 2 小時。

請勿在 與指定的start_time之間+插入空格。

如果您指定的開始時間已經過去, SQLdiag 會強制變更開始日期,使開始日期和時間設定在未來。 例如,如果您指定 /B 01:00:00 且目前的時間是 08:00: 00,SQLdiag 會強制變更開始日期,讓開始日期是次日。

SQLdiag 會在公用程式執行所在的計算機上使用當地時間。

/E [+]stop_time

指定停止收集診斷資料的日期和時間,格式如下: yyyyMMdd_HH:mm:ss

時間使用 24 小時標記法指定。 例如,下午 2:00 應指定為 14:00:00

使用 + 不含日期(僅 HH:mm:ss)來指定一個相對於 開始 日期和時間的時間。 例如,如果您使用 /B +02:00:00 /E +03:00:00 來指定開始時間和結束時間,SQLdiag 會在開始收集資訊之前等候 2 小時,然後收集 3 小時的資訊,然後在停止和結束之前退出。 如果未 /B 指定, SQLdiag 會立即開始收集診斷,並在 所 /E指定的日期和時間結束。

請勿在 與指定的start_timeend_time之間+插入空格。

SQLdiag 會在公用程式執行所在的計算機上使用當地時間。

/A SQLdiag_application_name

啟用針對相同的 SQL Server 執行個體執行多個 SQLdiag 公用程式。

每一個 SQLdiag_application_name 會識別一個不同的 SQLdiag執行個體。 SQLdiag_application_name 執行個體與 SQL Server 執行個體名稱之間沒有關聯性。

SQLdiag_application_name 可用來啟動或停止 SQLdiag 服務的特定執行個體。

在此範例中,請將 <SQLdiag_application_name> 替換為 SQLdiag_application_name 的適當值。

sqldiag START /A <SQLdiag_application_name>

它也可與 選項搭配 /R 使用,以將 SQLdiag 的特定實例註冊為服務。 在此範例中,將 <SQLdiag_application_name> 替換為 SQLdiag_application_name 的適當值:

sqldiag /R /A <SQLdiag_application_name>

注意

SQLdiag 會自動前置詞 DIAG$ 至為 SQLdiag_application_name指定的實例名稱。 其可為在您將 SQLdiag 註冊成服務時,提供實用的服務名稱。

/T 通訊協定

使用下列其中一個通訊協定值連接到一個 SQL Server 的實例。

通訊協定(和埠) 說明
tcp [ ,port ] 傳輸控制通訊協定/網際網路通訊協定 (TCP/IP)。 您可以選擇性地為此連接指定通訊埠編號。
np 具名管道。 根據預設,SQL Server 的預設執行個體會針對具名執行個體接聽具名管道 \\.\pipe\sql\query\\.\pipe\MSSQL$<instancename>\sql\query。 您無法使用替代的管道名稱來連接到 SQL Server 的實例。
lpc 本機程序呼叫。 如果用戶端連線至同一部電腦上的 SQL Server 執行個體,則可以使用此共用的記憶體通訊協定。

/Q

以安靜模式執行 SQLdiag/Q 隱藏所有提示,例如密碼提示。

/G

以一般模式執行 SQLdiag 。 當指定 /G 時,啟動 SQLdiag 不會強制執行 SQL Server 連線檢查,也不會確認使用者是否為 系統管理員 固定伺服器角色的成員。 相反地,SQLdiag 交由 Windows 決定使用者是否具有適當的權限,以進行每項要求的診斷收集。

如果未 /G 指定, SQLdiag 會檢查使用者是否為 Windows Administrators 群組的成員,而且如果使用者不是 Administrators 群組成員,則不會收集 SQL Server 診斷。

/R

SQLdiag 註冊為服務。 您將 SQLdiag 註冊成服務時所指定的任何命令列引數都會保留下來,以便之後執行這項服務時使用。

當 SQLdiag 註冊為服務時,預設服務名稱為 SQLDIAG。 您可以使用 自變數來變更服務名稱 /A

START使用命令列自變數啟動服務:

sqldiag START

您也可以使用 net start 命令來啟動服務:

net start SQLDIAG

/U

SQLdiag 取消註冊為服務。

如果取消註冊具名 SQLdiag 實例,請使用 /A 參數。

/L

當開始時間或結束時間也分別以 /B/E 自變數指定時,以連續模式執行 SQLdiag。 當因為排程關閉而停止收集診斷資訊之後,會自動重新啟動SQLdiag 。 例如,使用 /E/X 自變數。

注意

如果未使用 /B/E 命令行自變數來指定開始時間或結束時間,SQLdiag 會忽略/L自變數。

使用 /L 並不代表服務模式。 若要在執行 SQLdiag 即服務時使用/L,請在註冊服務時於命令行上指定它。

/X

使用快照模式執行 SQLdiagSQLdiag 會取得所有所設定之診斷資訊的快照,再自動關閉。

START | STOP | STOP_ABORT

啟動或停止 SQLdiag 服務。 STOP_ABORT 強制服務儘快關閉,而不需要完成目前收集的診斷。

使用這些服務控制引數時,它們必須是命令列所使用的第一個引數。 例如:

sqldiag START

/A引數,僅限用於指定SQLdiag具名實例,可以與STARTSTOPSTOP_ABORT搭配使用,以控制SQLdiag服務的特定實例。 在此範例中,將 <SQLdiag_application_name> 替換為 SQLdiag_application_name 的適當值:

sqldiag START /A <SQLdiag_application_name>

安全性需求

除非 SQLdiag 是以泛型模式執行(藉由指定 /G 命令行自變數),否則執行 SQLdiag 的用戶必須是 Windows Administrators 群組的成員,以及 SQL Server 系統管理員 固定伺服器角色的成員。 根據預設,SQLdiag 會使用 Windows 驗證來連線至 SQL Server,但也支援 SQL Server 驗證。

效能考量

執行 SQLdiag 的效能結果,會隨著您設定它要收集的診斷資料類型而不同。 例如,如果您已設定 SQLdiag 來收集 SQL Server Profiler 追蹤資訊,則您選擇要追蹤的事件類別愈多,伺服器效能受到的影響就愈大。

執行 SQLdiag 的效能影響大約相當於個別收集已設定之診斷資訊的成本總和。 例如,利用 SQLdiag 收集追蹤,其帶來的效能成本與利用 SQL Server Profiler 收集是一樣的。 使用 SQLdiag 所造成的效能影響可不予理會。

必要的磁碟空間

由於 SQLdiag 可以收集不同類型的診斷資訊;因此,執行 SQLdiag 所需要的可用磁碟空間也各不相同。 收集的診斷資訊量取決於伺服器正在處理的工作負載本質和數量,而且範圍可能從幾 MB 到數 GB。

組態檔

在啟動時, SQLdiag 會讀取組態檔及已指定的命令列引數。 您可以在組態檔中指定 SQLdiag 所要收集的診斷資訊類型。 根據預設, SQLdiag 會使用 SQLdiag.xml 組態檔,每次工具執行時都會擷取,而且位於 SQLdiag 公用程式啟動資料夾中。 組態檔會使用 XML 結構描述 SQLDiag_schema.xsd,此結構描述也會在每次執行 SQLdiag 時,從可執行檔直接擷取到公用程式啟動目錄中。

編輯組態檔

您可以複製和編輯 SQLdiag.xml 以變更 SQLdiag 所收集的診斷資料類型。 編輯設定檔時,請務必使用可驗證設定檔之 XML 結構描述的 XML 編輯器,例如 Management Studio。 您不應該直接編輯 SQLdiag.xml 。 相反地,請建立 複 SQLdiag.xml 本,並將它重新命名為相同資料夾中的新檔名。 然後編輯新檔案,並使用 /I 自變數將它傳遞至 SQLdiag

當 SQLdiag 以服務的形式執行時編輯組態檔

如果您已經以服務身分執行 SQLdiag,而且需要編輯組態檔,請指定/U命令行自變數來取消註冊SQLDIAG服務,然後使用命令行自變數重新註冊服務/R。 取消註冊此服務後再重新註冊它,會移除 Windows 登錄中快取的舊設定資訊。

輸出資料夾

如果您未指定具有 自變數的/O輸出資料夾,SQLdiag 會在 SQLdiag 啟動資料夾下建立名為 SQLDIAG 的子資料夾。 如需涉及大量追蹤的診斷資訊集合,例如 SQL Server Profiler,請確定輸出資料夾位於具有足夠空間的本機磁碟驅動器上,以儲存要求的診斷輸出。

SQLdiag 重新啟動時,它會覆寫輸出資料夾的內容。 若要避免這種情況,請在命令列上指定 /N 2

數據收集程式

當 SQLdiag 啟動時,它會執行收集 中所SQLdiag.xml指定診斷數據所需的初始化檢查。 此過程可能需要幾秒鐘。 當 SQLdiag 以控制台應用程式的形式執行時開始收集診斷數據之後,會顯示一則訊息,通知您 SQLdiag 集合已啟動,而且您可以按 CTRL+C 來停止它。 當 SQLdiag 執行為服務時,會在 Windows 事件記錄檔中寫入一則類似的訊息。

如果您使用 SQLdiag 來診斷您可以重現的問題,請等到您收到此訊息,再於伺服器上重現問題。

SQLdiag 會以平行方式收集大部分的診斷資料。 除了從 Windows 效能記錄檔和事件記錄檔收集資訊之外,所有診斷資訊都是連線至 SQL Server sqlcmd 公用程式或 Windows 命令處理器這類工具加以收集。 SQLdiag 會在每部電腦上各使用一個工作者執行緒,監視這些其他工具的診斷資料收集,通常會同時等待多個工具完成。 在資料收集過程中,SQLdiag 會將每一個診斷的輸出傳送到輸出資料夾。

停止數據收集

在 SQLdiag 開始收集診斷數據之後,除非您透過手動Ctrl+C停止診斷數據,或建立sqldiag.stop檔案,或將它設定為在指定的時間停止,否則會繼續執行此動作。 您可以使用/E參數來設定SQLdiag在特定時間停止,或使用/X參數來讓SQLdiag以快照模式執行。

SQLdiag 停止時,它會停止所有已啟動的診斷作業。 例如,其會停止正在收集的 SQL Server Profiler 追蹤、停止執行正在執行的 Transact-SQL 指令碼,以及停止在資料收集期間繁衍的任何子程序。 診斷資料收集完成之後, SQLdiag 便會結束。

以主控台應用程式身分執行時停止 SQLdiag

如果您是以控制台應用程式身分執行 SQLdiag,請在 SQLdiag 正執行的控制台視窗中按 CTRL+C 以停止它。 按下 CTRL+C 之後,控制台視窗中會顯示一則訊息,通知您 SQLdiag 資料收集即將結束,而且您應該等到程式關閉,這可能需要幾分鐘的時間。

按 Ctrl+C 兩次結束所有子診斷程序,並立即結束應用程式。

以服務身分執行時停止 SQLdiag

如果您要以服務的形式執行 SQLdiag,請在 SQLdiag 啟動資料夾中執行 sqldiag STOP 以停止它。 或者,您可以停止 Services.msc applet 中的 SQLdiag 服務。

注意

不支持暫停 SQLdiag 服務。 如果您嘗試暫停 SQLdiag 服務,它會將您暫停它時正在收集的診斷收集完成之後才停止。 如果您在停止 SQLdiag 之後又重新加以啟動,則該應用程式會重新啟動並覆寫輸出資料夾。 若要避免覆寫輸出資料夾,請在命令列上指定 /N 2

如果您在相同的計算機上執行多個 SQLdiag 實例,您也可以在停止服務時,將 SQLdiag 實例名稱傳遞至命令行。 例如,若要停止 SQLdiag 執行個體 Instance1,請使用下列語法:

sqldiag STOP /A Instance1

/A 是唯一能與 STARTSTOPSTOP_ABORT 搭配使用的命令列參數。 如果您需要使用其中一個服務控件動詞來指定 SQLdiag 的具名實例,請在命令行上的控件動詞後面指定 /A ,如上一個語法範例所示。 使用控制動詞時,它們必須是命令列上的第一個引數。

若要儘快停止服務,請在公用程式啟動資料夾中執行 sqldiag STOP_ABORT 。 此命令會立即中止任何正在執行的診斷收集,而不等待它們完成。

注意

使用 sqldiag STOPsqldiag STOP_ABORT 停止 SQLdiag 服務。 請勿使用 Windows 服務控制台來停止 SQLdiag 或其他 SQL Server 服務。

使用 sqldiag.stop 檔案停止 SQLdiag

SQLdiag 也會在公用程式資料夾中找到名為 sqldiag.stop\Output 檔案時自動關閉。 不論 SQLdiag 是以控制台應用程式或服務的形式執行,都適用此選項。 建立一個.stop檔案會很有用,當您想要在某事件發生後以程式化的方式關閉SQLdiag,但您事先不知道該事件何時發生。 sqldiag.stop 檔案的內容無關。 除了手動建立檔案之外,還有一個選項是在批次檔中使用與下面類似的命令來建立 sqldiag.stop

ECHO stop > F:\PSSDIAG\Output\sqldiag.stop

另一個選項是使用 PowerShell:

Set-Content -Value "stop" -Path "F:\PSSDIAG\Output\sqldiag.stop"

自動啟動和停止 SQLdiag

若要在指定的時間自動啟動和停止診斷數據收集,請使用 /B <start_time>/E <stop_time> 自變數,使用 24 小時表示法。 例如,如果您要針對一致出現在大約 02:00:00 的問題進行疑難解答,您可以將 SQLdiag 設定為在 01:45 自動開始收集診斷數據,並在 03:00:00:00 自動停止。

使用/B/E參數來指定開始和停止時間。 使用 24 小時表示法來指定確切的開始和停止日期和時間,並以一般格式 yyyyMMdd_HH:mm:ss。 下列範例會在 01:45 啟動數據收集,並在 3:00 停止數據收集。

sqldiag /B 01:45:00 /E 03:00:00

若要指定相對開始或停止時間,請在開始和停止時間前面加上 + ,並省略日期部分(yyyyMMdd_),如下列範例所示。 這會導致 SQLdiag 在開始收集資訊之前等候一小時,然後先收集兩個半小時的資訊,再停止並結束:

sqldiag /B +01:00:00 /E +02:30:00

指定相對的 start_time 之後, SQLdiag 就會在相對於目前日期和時間的時間啟動。 指定相對的 end_time 之後, SQLdiag 就會在相對於指定的 start_time的時間結束。 如果您指定的開始或結束日期和時間已經過去, SQLdiag 會強制變更開始日期,讓開始日期和時間設定在未來。

對您選擇的開始和結束日期而言,這有重要的影響。 請考慮下列範例:

sqldiag /B +01:00:00 /E 08:30:00

如果目前的時間是 08:00,也就是說在實際開始收集診斷資訊之前,結束時間就已經過了。 由於 SQLdiag在過去情況下會自動將開始和結束日期調整到第二天,所以在這個範例中,診斷數據的收集會從今天上午 09:00 開始(設定為從現在起 1 小時後的相對開始時間),並持續到次日早上 08:30。

停止並重新啟動 SQLdiag 以收集每日診斷

若要每天收集一組指定的診斷,而不需要手動啟動和停止 SQLdiag,請使用 /L 自變數。 使用 /L 參數會讓 SQLdiag 在排程關機後自動重新啟動,以持續運行。 當指定/L時,SQLdiag 會停止,因為它已達到/E引數指定的結束時間,或因為使用/X引數在快照模式下執行時而停止,這時候SQLdiag 會重新啟動,而不是結束。

下列範例指定以連續模式執行 SQLdiag ,以便在 03:00:00 和 05:00:00 之間收集診斷資料之後,自動重新啟動。

sqldiag /B 03:00:00 /E 05:00:00 /L

下列範例指定以連續模式執行 SQLdiag ,以在 03:00:00 時取得診斷資料快照集之後,自動重新啟動。

sqldiag /B 03:00:00 /X /L

以服務身分執行 SQLdiag

當您想要使用 SQLdiag 來收集長時間的診斷數據,但需要登出執行 SQLdiag 的電腦時,您可以將它作為服務來執行。

註冊 SQLdiag 以作為服務執行

您可以在命令行指定 /R 自變數,以註冊 SQLdiag 以服務的形式執行。 這會將 SQLdiag 註冊執行為服務 SQLdiag 服務名稱為 SQLDIAG。 當您將 SQLdiag 註冊為服務時,在命令行上指定的任何其他自變數,會在服務啟動時保留並重複使用。

若要變更預設 SQLDIAG 服務名稱,請使用 /A 命令行自變數來指定另一個名稱。 SQLdiag 會自動在 DIAG$ 前面加上任何以 指定的 /ASQLdiag 實例名稱,以建立合理的服務名稱。

取消註冊 SQLDIAG 服務

若要取消註冊服務,請指定 /U 自變數。 取消註冊 SQLdiag 的服務身分,也會刪除該服務的 Windows 登錄機碼。

啟動或重新啟動 SQLDIAG 服務

若要啟動或重新啟動 SQLDIAG 服務,請從命令行執行 sqldiag START

如果您使用 自變數執行 SQLdiag/A 的多個實例,您也可以在啟動服務時,在命令行上傳遞 SQLdiag 實例名稱。 例如,若要開始 SQLdiag 執行個體 Instance1,請使用下列語法:

sqldiag START /A Instance1

您也可以使用 net start 命令來啟動 SQLDIAG 服務。

當您重新啟動 SQLdiag時,它會覆寫目前輸出資料夾的內容。 若要避免這種情況,請在命令行上指定 /N 2 ,以在公用程序啟動時重新命名輸出資料夾。

不支持暫停 SQLdiag 服務。

執行 SQLdiag 的多個實例

在命令行上指定 /A <SQLdiag_application_name> ,在相同計算機上執行多個 SQLdiag 實例。 這對於同時從相同 SQL Server 執行個體收集不同的診斷集很有幫助。 例如,您可以設定 SQLdiag 的具名執行個體,持續執行輕量型資料收集。 然後,如果 SQL Server 發生特定問題,您可以執行預設的 SQLdiag 實例來收集診斷資訊,或者收集 Microsoft 客戶支援服務要求您蒐集的一組診斷資訊來診斷問題。

從叢集 SQL Server 實例收集診斷數據

SQLdiag 支援從叢集的 SQL Server 執行個體中收集診斷資料。 若要從叢集 SQL Server 實例收集診斷,請確定"."已針對name組態檔SQLdiag.xml中項目的 屬性<Machine>指定 ,而且不要在命令行上指定 /G 自變數。 根據預設,"." 已被指定為組態檔中的 name 屬性,而 /G 參數則被關閉。 一般而言,從叢集 SQL Server 實例收集時,您不需要編輯組態檔或變更命令行自變數。

當 指定為計算機名稱時 "."SQLdiag 會偵測它在叢集上執行,並同時從叢集上安裝的所有 SQL Server 虛擬實例擷取診斷資訊。 如果您想要只從計算機上執行的一個 SQL Server 虛擬實例收集診斷資訊,請針對 name 中的SQLdiag.xml項目屬性<Machine>指定該虛擬 SQL Server。

注意

若要從叢集的 SQL Server 執行個體收集 SQL Server Profiler 追蹤資訊,必須在叢集上啟用管理共用 (ADMIN$)。