SQLdiag是一个收集SQL Server实例诊断数据的多用途实用工具,可以以控制台应用程序或服务的形式运行。SQLdiag能够通过配置管理器的可扩展接口帮你收集SQL Server Profiler追踪,Windows Performance Monitor日志,并输出不同的VBScript、T-SQL、及DOS scripts。SQLdiag收集的数据可以通过SQL Nexus导入SQL Server数据库,SQL Nexus是一个GUI工具,可以以报表格式提供收集到的数据的聚合视图。
SQLdiag是一个命令行实用工具,默认在C:\Program Files\Microsoft SQL Server\110\Tools\Binn。你可以以3种模式运行SQLdiag:
以快照模式使用SQLdiag
当SQLdiag以快照模式运行时,它会收集所有配置的诊断数据的快照,然后自动关闭。如果你在命令提示窗口执行SQLDIAG /X,SQLdiag就会在Binn文件夹里创建一个SQLDIAG文件夹,它包含所有收集到的数据。你还会发现一个“internal”的文件夹,它包含工具创建的日志文件,这些文件和XML配置文件一起,配置文件是用于在其他文件中收集数据。当你想要快速获得SQL Server实例状态的快照时,这种收集数据的方法就非常有用。你会获得过量的SQL Server和Windows配置信息、最近遇到的错误、数据库引擎经历的等待,以及更多信息。数据收集完成后,工具会提示消息“SQLDIAG Collection complete. Collector exiting”自动关闭。默认的快照数据收集如下信息:
作为一个命令行应用程序来使用SQLdiag
看SQLdiag数据采集之前,你首先应该理解SQLdiag配置文件,以便恰当地配置不同的数据采集器。图11-1显示了SQLDIAG.XML配置文件的关键元素的截图:
SQLdiag配置文件关键元素
你可以通过XML模板来控制SQLdiag的收集器。每个采集器都可以使用<enabled=true> 或<enabled=false>启用或禁用。不要删除XML文件中的collector,因为如果XML文件不匹配,SQLdiag装载XSD会失败。如果你想知道CustomDiagnostics变量的内幕,后面会在“使用SQLdiag配置管理器”中讲到。下面的代码显示了SQLdiag能够接受的所有的参数:
Usage: sqldiag [START | STOP | STOP_ABORT] [/O outputpath] [/I cfgfile] [/M machine1
[machine2 machineN]|@machinelistfile] [/Q] [/C #] [/G] [/R] [/U] [/N #] [/A appname]
[/T {tcp[,port]|np|lpc|via}] [/X] [/L] [/B YYYYMMDD_HH:MM:SS] [/E YYYYMMDD_HH:MM:SS]
现在来看看这些参数是如何使用的,以及一些最佳实践,以防止数据采集成为性能下降的帮凶。
SQLdiag参数列表
下面举2个例子:
SQLDIAG /O D:\SQLDIAG_Data\ /G /B 20121225_00:01:00 /E +02:00:00 ------------告诉SQLdiag在20121225_00:01:00开始收集,2小时后终止,还指定了输出路径,/G会跳过连接检查,命令提示窗口会显示“SQLDIAG Begin time 20121225_00:01:00 specified. Waiting”,表明SQLdiag成功初始化。
SQLDIAG /O D:\SQLDIAG_Data\ /A DemoDiag /Q /I D:\SQLDIAG_Custom.xml---------------指示SQLdiag使用配置文件收集数据,使用文件压缩,应用程序名显示为DemoDiag,以静音模式运行,SQLdiag初始化成功时会提示如下信息:
DIAG$DemoDiag Collector version
IMPORTANT: Please wait until you see 'Collection started' before attempting to
reproduce your issue
SQLdiag控制台输出和冗长的日志可以在输出路径internal文件夹里找到,分别对应文件##console.log 和 ##SQLDIAG.LOG。当工具执行失败或没达到预期,这连个文件可以提供为何失败的额外洞察。不要使用命令提示窗口的关闭按钮停掉数据采集进程,这会引起Profiler跟踪或PerfMon文件成为孤行。Profiler跟踪可以使用命令sp_trace_setstatus来停止。
作为一个服务来使用SQLdiag
你可以使用/R参数将工具注册为一个服务,使用/U注销服务,使用/A将SQLdiag注册为有独特名称的服务。下面的命令将SQLdiag注册为一个名称为DIAG1的服务:SQLDIAG /R /A DIAG1
图11-2显示了注册为服务的属性,当使用/A参数时,服务名称有前缀DIAG$;如果仅使用/R,那么服务就被命名为SQLDIAG,如图11-3所示。
注意,服务注册是使用Log On账号为Local System完成的,你需要把服务账号改成有Windows管理员权限和SQL Server实例sysadmin权限的账号。接下来,就要决定指定什么参数,下面的例子中,SQLdiag正被注册为一个服务:
'C:\Program Files\Microsoft SQL Server\110\Tools\Binn\sqldiag.exe' /R /I C:\SQLDIAG_Data\SQLDIAG_Custom.XML /O 'C:\SQLDIAG_Data'
成功的服务注册会报告信息“SQLDIAG Service installed. Exiting”。你可以在Windows Application Event Log中看到SQLdiag服务的报告,如图11-4所示:
在Failover Cluster上配置和执行SQLdiag
当你使用Diag Manager为一个SQL Server FCI(failover cluster instance)配置一个数据采集包时,你需要记住如下要点:
当你在多个实例故障转移集群上按默认配置执行SQLdiag时,命令窗口会显示大量红色标记的错误。这是因为默认的配置文件SQLDIAG.XML没有改为从特定FCI上采集数据。SQLdiag会自动发现群集,并从每个虚拟机及实例上收集日志和配置信息。在命令窗口显示错误,是因为SQLdiag试图在每台虚拟机上连接每个实例,进而导致多次失败。这种情况下,要么用所需要额目标虚拟机名称来配置SQLDIAG.XML,要么忽略错误。通常可以通过日志文件(##SQLDIAG.LOG)来识别可以安全忽略的错误。一些可忽略的信息实际上有文本信息“you can usually safely ignore this”嵌入其中。