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:00,SQLdiag 會等 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_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 的詳細資訊,請連絡您的硬體廠商。[!附註]
VIA 通訊協定已被取代。未來的 Microsoft SQL Server 版本將移除這項功能。請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。
如需有關通訊協定的詳細資訊,請參閱<選擇網路通訊協定>。
/Q
以無訊息模式執行 SQLdiag。/Q 會抑制所有提示,如密碼提示。/G
以一般模式執行 SQLdiag。指定 /G 之後,在啟動時,SQLdiag 不會強制執行 SQL Server 連接檢查,或確認使用者是否為系統管理員 (sysadmin) 固定伺服器角色的成員。但是,SQLdiag 會延遲 Windows 來判斷使用者是否有適當的權限,可以收集各項所要求的診斷。如果未指定 /G,SQLdiag 會檢查並判斷使用者是否為 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
以快照模式執行 SQLdiag。SQLdiag 會取得所設定之所有診斷資訊的快照,再自動關閉。START | STOP | STOP_ABORT
啟動或停止 SQLdiag 服務。STOP_ABORT 會在未完成它目前正在收集的診斷資訊收集工作的情況下,強制儘快關閉。使用這些服務控制引數時,它們必須是命令列所使用的第一個引數。例如:
SQLDIAG START
只有指定 SQLdiag 具名執行個體的 /A 引數,才可以與 START、STOP 或 STOP_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 是唯一可以與 START、STOP 或 STOP_ABORT 一起使用的命令列引數。如果您需要以其中一個服務控制動詞指定 SQLdiag 的具名執行個體,請在命令列上該控制動詞後面指定 /A,如上述語法範例所示。使用控制動詞時,它們必須是命令列上的第一個引數。
若要儘快停止服務,請在公用程式啟動資料夾內執行 SQLDIAG STOP_ABORT。此命令會中止目前正在執行的任何診斷收集,而不會等到它們完成。
[!附註]
使用 SQLDiag STOP 或 SQLDIAG 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$)。