SQLdiag 公用程式

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

[!附註]

自 SQL Server 2005 起,SQLdiag 公用程式已有大幅改變。此公用程式的命令列引數與 SQL Server 2000 不相容。此公用程式可能變更,依賴其命令列引數或行為的應用程式或指令碼,在未來版本中可能無法正確運作。

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 | via } ]
       [/Q] [/G] [/R] [/U] [/L] [/X] }
     |
     { [START | STOP | STOP_ABORT] }
     |
     { [START | STOP | STOP_ABORT] /A SQLdiag_application_name }

引數

  • /?
    顯示使用方式資訊。

  • /Iconfiguration_file
    設定 SQLdiag 要用的組態檔。依預設,/I 會設為 SQLDiag.Xml。

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

    [!附註]

    輸出資料夾位置與可以用 /P 指定的支援資料夾位置相關。若要設定完全不同的位置給輸出資料夾,請對 /O 指定完整目錄路徑。

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

    [!附註]

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

    SQLDIAG /P %cd%

  • /Noutput_folder_management_option
    設定 SQLdiag 在啟動時,要覆寫或重新命名輸出資料夾。可用的選項如下:

    1 = 覆寫輸出資料夾 (預設值)

    2 = 當 SQLdiag 啟動時,它會將輸出資料夾重新命名為 SQLDIAG_00001、SQLDIAG_00002 等。在重新命名目前輸出資料夾之後,SQLdiag 會將輸出寫入預設輸出資料夾 SQLDIAG 中。

    [!附註]

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

  • /Mmachine1 [ machine2machineN] | @machinelistfile
    覆寫組態檔中指定的電腦。根據預設,組態檔是 SQLDiag.Xml,或是以 /I 參數來設定。當指定一部以上的電腦時,請用空格區隔每一部電腦名稱。

    使用 @machinelistfile 指定要儲存到組態檔案中的電腦清單檔案名稱。

  • /Cfile_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 小時的資訊,再停止及結束。如果未指定 /BSQLdiag 會立即開始收集診斷資訊,並在 /E 所指定的日期和時間結束。

    請勿在 + 和指定的 start_time 或 end_time 之間插入空格。

    請注意,SQLdiag 會使用執行公用程式之電腦的本機時間。

  • /A SQLdiag_application_name
    使 SQLdiag 公用程式的多個執行個體可以對相同的 SQL Server 執行個體執行。

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

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

    例如:

    SQLDIAG START /ASQLdiag_application_name

    它也可以與 /R 選項一起使用,把 SQLdiag 的特定執行個體登錄成一項服務。例如:

    SQLDIAG /R /ASQLdiag_application_name

    [!附註]

    SQLdiag 會自動將 DIAG$ 前置於 SQLdiag_application_name 已指定的執行個體名稱。這樣可以在您將 SQLdiag 登錄成一項服務時提供實用的名稱。

  • /T { tcp [ ,port ] | np | lpc | via }
    使用指定的通訊協定連接到 SQL Server 執行個體。

    • tcp [, port]
      傳輸控制通訊協定/網際網路通訊協定 (TCP/IP)。您可以選擇性地為此連接指定通訊埠編號。

    • np
      具名管道。根據預設,SQL Server 的預設執行個體會接聽具名管道 \\.\pipe\sql\query 和 \\.\pipe\MSSQL$<instancename>\sql\query,看看是否有具名執行個體。您無法使用替代具名管道名稱來連接 SQL Server 執行個體。

    • lpc
      本機程序呼叫。如果用戶端連接到同一部電腦上的 SQL Server 執行個體,也可以使用此共用記憶體通訊協定。

    • via
      虛擬介面配接器通訊協定。用於 VIA 硬體。如需有關如何使用 VIA 的詳細資訊,請連絡您的硬體廠商。

    如需有關通訊協定的詳細資訊,請參閱<選擇網路通訊協定>。

  • /Q
    以無訊息模式執行 SQLdiag/Q 會抑制所有提示,如密碼提示。

  • /G
    以一般模式執行 SQLdiag。指定 /G 之後,在啟動時,SQLdiag 不會強制執行 SQL Server 連接檢查,或確認使用者是否為系統管理員 (sysadmin) 固定伺服器角色的成員。相反地,SQLdiag 會聽從 Windows 來判斷使用者是否有適當的權利,可以收集各項所要求的診斷。

    如果未指定 /GSQLdiag 會檢查並判斷使用者是否為 Windows Administrators 群組的成員,如果使用者不是 Administrators 群組成員,則不會收集 SQL Server 診斷資訊。

  • /R
    SQLdiag 登錄成一項服務。您將 SQLdiag 登錄成一項服務時所指定的任何命令列引數都會保留下來,以便將來執行這項服務時使用它們。

    SQLdiag 登錄成一項服務時,預設服務名稱為 SQLDIAG。您可以使用 /A 引數變更服務名稱。

    使用 START 命令列引數來啟動服務:

    SQLDIAG START

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

    netstart 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

    只有指定 SQLdiag 具名執行個體的 /A 引數,才可以與 STARTSTOPSTOP_ABORT 一起使用,來控制 SQLdiag 服務的特定執行個體。例如:

    SQLDIAG START /ASQLdiag_application_name

安全性需求

除非 SQLdiag 是在一般模式下執行 (指定 /G 命令列引數),否則執行 SQLdiag 的使用者必須是 Windows Administrators 群組的成員,及 SQL Server系統管理員 (sysadmin) 固定伺服器角色的成員。依預設,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 Serversqlcmd 公用程式或 Windows 命令處理器之類的工具收集而來的。SQLdiag 會每部電腦各使用一個工作者執行緒來監視這些其他工具收集診斷資料的作業,通常會同時等待多項工具作業完成。在收集過程期間,SQLdiag 會將每一個診斷的輸出遞送到輸出資料夾。

停止收集資料

SQLdiag 開始收集診斷資料之後,除非您將它停止,或將它設定成在指定的時間停止,否則,它會持續作業。您可以利用指定停止時間的 /E 引數,或利用使 SQLdiag 執行快照模式的 /X 引數,將 SQLdiag 設定成在指定的時間停止。

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

[!附註]

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

停止做為主控台應用程式來執行的 SQLdiag

如果您將 SQLdiag 當做主控台應用程式來執行,請在執行 SQLdiag 的主控台視窗中,按 CTRL+C 來停止它。按 CTRL+C 之後,主控台視窗會出現一則訊息,說明 SQLDiag 的資料收集在結束中,您應該等待處理序關閉,可能需要好幾分鐘。

按 Ctrl+C 兩次,以終止所有子診斷處理序,並立即終止應用程式。

停止做為一項服務來執行的 SQLdiag

如果您將 SQLdiag 當成一項服務來執行,請在 SQLdiag 啟動資料夾內執行 SQLDiag STOP 來停止它。

如果您在相同電腦上執行 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

若要在指定時間自動啟動及停止診斷資料收集,請使用 /Bstart_time 和 /Estop_time 引數,並採用 24 小時制標記法。例如,如果您要針對大約在 02:00:00 一致出現的問題進行疑難排解,您可以將 SQLdiag 設定成在 01:00 自動開始收集診斷資料,在 03:00:00 自動停止。請利用 /B/E 引數來指定開始和停止時間。請利用 24 小時標記法來指定開始和停止的確切日期和時間,格式為 YYYYMMDD_HH:MM:SS。若要指定相對的開始或停止時間,請依照下列範例所示,在開始和停止時間之前附加 +,並省略日期部份 (YYYYMMDD_),這會使 SQLdiag 在開始收集資訊之前,等待 1 小時,之後,收集 3 小時的資訊,再停止及結束:

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

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

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

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

如果目前的時間是 08:00,在實際開始收集診斷資訊之前,結束時間便已過去。因為 SQLDiag 會將發生在過去的開始和結束日期自動調整至隔天,所以,在此範例中,診斷收集是從今天 09:00 開始 (已用 + 指定相對的開始時間),並繼續收集直到隔天早上 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$ 自動前置於任何以 /A 指定的 SQLdiag 執行個體名稱,以建立實用的服務名稱。

若要取消登錄 SQLDIAG 服務

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

若要啟動或重新啟動 SQLDIAG 服務

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

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

SQLDIAG START /A Instance1

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

當您重新啟動 SQLdiag 時,它會覆寫目前輸出資料夾的內容。若要避免發生此情形,請在命令列上指定 /N 2,在公用程式啟動時重新命名輸出資料夾。

暫停 SQLdiag 服務是不受支援的。

執行 SQLdiag 的多個執行個體

在相同電腦上,在命令列上指定 /ASQLdiag_application_name 來執行 SQLdiag 的多個執行個體。這對於同時從相同 SQL Server 執行個體收集不同的診斷集很有幫助。例如,您可以設定 SQLdiag 的具名執行個體持續執行輕量型資料收集。之後,如果 SQL Server 發生特定問題,您可以執行預設的 SQLdiag 執行個體,來收集該問題的診斷資訊,或收集 Microsoft 客戶支援服務要求您收集的診斷集,來診斷問題。

從叢集 SQL Server 執行個體收集診斷資料

SQLdiag 支援從叢集的 SQL Server 執行個體中收集診斷資料。若要從叢集的 SQL Server 執行個體中收集診斷資料,請確定已在組態檔 SQLDiag.Xml 中,對 <Machine> 元素的 name 屬性指定 ".",而且不要在命令列上指定 /G 引數。依預設,組態檔中的 name 屬性會指定 ".",且會關閉 /G 引數。通常,從叢集的 SQL Server 執行個體中收集時,您不需要編輯組態檔或變更命令列引數。

"." 指定為機器名稱後,SQLdiag 會偵測到它在叢集上執行,同時從安裝在叢集上的 SQL Server 的所有虛擬執行個體中擷取診斷資訊。如果您只想要從電腦上執行的一個 SQL Server 虛擬執行個體中收集診斷資訊,請在 SQLDiag.Xml 中,對 <Machine> 元素的 name 屬性指定這個虛擬 SQL Server。

[!附註]

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