适用范围: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 configuration_file
设置 SQLdiag 要使用的配置文件。 默认情况下,/I
设置为 SQLdiag.xml
。
/O 输出_文件夹_路径
将 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_00001
,SQLDIAG_00002
依此等。 重命名当前输出文件夹后, SQLdiag 会将输出写入默认输出文件夹SQLDIAG
。
SQLdiag 在启动时不会将输出追加到当前输出文件夹中。 它只能覆盖默认输出文件夹(选项 1)或重命名文件夹(选项 2),然后将输出写入名为 SQLDIAG
的新默认输出文件夹。
/M machine1 [ machine2machineN ] | @machinelistfile
覆盖在配置文件中指定的计算机。 默认情况下,配置文件为SQLdiag.xml
,或者通过参数/I
进行设置。 如果指定多台计算机,请用空格分隔各个计算机名称。
@machinelistfile选项指定要存储在配置文件中的计算机列表文件名。
/C 文件压缩类型
设置 SQLdiag 输出文件夹文件所用的文件压缩类型。 可用选项:
- 0 = 无(默认)
- 1 = 使用 NTFS 压缩
/B [+]start_time
指定开始以以下格式收集诊断数据的日期和时间: yyyyMMdd_HH:mm:ss
时间以二十四小时制表示。 例如,应将下午 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
时间是用二十四小时制来表示的。 例如,应将下午 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_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 自动为为SQLdiag_application_name指定的实例名称添加DIAG$
前缀。 如果你将 SQLdiag 注册为服务,则上述操作会提供有意义的服务名称。
/T 协议
使用以下协议值之一连接到 SQL Server 实例。
协议(和端口) | DESCRIPTION |
---|---|
tcp [ ,port ] | 传输控制协议/Internet 协议 (TCP/IP)。 您可以选择为连接指定一个端口号。 |
np | 命名管道。 默认情况下, SQL Server 的默认实例侦听命名管道 \\.\pipe\sql\query 和 \\.\pipe\MSSQL$<instancename>\sql\query 以获取命名实例。 无法使用备用管道名称连接到 SQL Server 实例。 |
lpc | 本地过程调用。 如果客户端要连接到同一计算机上的 SQL Server 实例,则可以使用此 Shared Memory 协议。 |
/Q
在静默模式下运行 SQLdiag 。 /Q
取消所有提示,例如密码提示。
/G
在常规模式下运行 SQLdiag 。 指定了 /G
后,在启动时,SQLdiag 不会强制进行 SQL Server 连接检查,也不会验证用户是否为 sysadmin 固定服务器角色的成员。 SQLdiag 会让 Windows 来确定用户是否具有收集各个请求的诊断信息的相应权限。
如果未 /G
指定, SQLdiag 会检查以确定用户是否是 Windows 管理员 组的成员,并且如果用户不是 管理员 组成员,则不会收集 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
在快照模式下运行 SQLdiag 。 SQLdiag 会拍摄所有配置的诊断信息的快照,然后自动关闭。
START | STOP | STOP_ABORT
启动或停止 SQLdiag 服务。 STOP_ABORT
强制在服务未完成当前正在进行的诊断信息收集的情况下尽快地关闭该服务。
使用这些服务控制参数时,它们必须为命令行中使用的第一个参数。 例如:
sqldiag START
只有指定SQLdiag命名实例的/A
参数可以用于START
、STOP
或STOP_ABORT
来控制SQLdiag服务的特定实例。 在此示例中,请将<SQLdiag_application_name>
替换为SQLdiag_application_name的相应值:
sqldiag START /A <SQLdiag_application_name>
安全要求
除非 SQLdiag 以泛型模式运行(通过指定 /G
命令行参数),否则运行 SQLdiag 的用户必须是 Windows 管理员 组的成员和 SQL Server sysadmin 固定服务器角色的成员。 默认情况下, SQLdiag 使用 Windows 身份验证连接到 SQL Server ,但是它也支持 SQL Server 身份验证。
性能注意事项
运行 SQLdiag 的性能效果取决于其配置收集的诊断数据的类型。 例如,如果已配置 SQLdiag 来收集 SQL Server Profiler 跟踪信息,则选择跟踪的事件类越多,服务器性能所受的影响就越大。
运行 SQLdiag 对服务器性能的影响大体相当于分别收集配置的诊断信息的开销之和。 例如,使用 SQLdiag 收集某个跟踪和使用 SQL Server Profiler收集该跟踪所产生的性能开销相同。 使用 SQLdiag 对性能的影响可以忽略不计。
所需的磁盘空间
因为 SQLdiag 可收集不同类型的诊断信息,所以,运行 SQLdiag 所需的可用磁盘空间也有所不同。 收集的诊断信息量取决于服务器正在处理的工作负荷的性质和数量,可能从几兆字节到几千兆字节不等。
配置文件
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
参数或/X
参数将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 小程序中停止 SQLdiag 服务。
注意
不支持暂停 SQLdiag 服务。 如果尝试暂停 SQLdiag 服务,则该服务会在完成收集你暂停时它正在收集的诊断信息后停止。 如果在停止 SQLdiag 后重新启动,则应用程序会重新启动并覆盖输出文件夹。 若要避免覆盖输出文件夹,请在命令行上指定 /N 2
。
如果在同一台计算机上运行 SQLdiag 的多个实例,也可以在停止服务时将 SQLdiag 实例名称传递给命令行。 例如,若要停止名为 Instance1 的 SQLdiag 实例,请使用以下语法:
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.stop 文件停止 SQLdiag
SQLdiag 在找到实用工具文件夹中\Output
命名sqldiag.stop
的文件时也会自动关闭。 无论 SQLdiag 作为控制台应用还是作为服务运行,此选项都适用。 如果想要在某些事件发生后以编程方式关闭 SQLdiag,但事先不知道此事件发生的时间,则创建 .stop
文件可能很有用。 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 等待 1 小时后开始收集数据,然后收集 2 个半小时的数据后停止并退出。
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$ 作为指定/A
的任何 SQLdiag 实例名称的前缀,以创建合理的服务名称。
注销 SQLDIAG 服务
若要取消注册服务,请指定 /U
参数。 撤消 SQLdiag 的服务注册将同时删除该服务的 Windows 注册表项。
启动或重启 SQLDIAG 服务
若要启动或重启 SQLDIAG
服务,请从命令行运行 sqldiag START
。
如果通过使用 /A
参数运行多个 SQLdiag 实例,那么在启动服务时,您也可以在命令行中传递 SQLdiag 实例名称。 例如,若要启动名为 Instance1 的 SQLdiag 实例,请使用以下语法:
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 实例收集诊断,请确保配置文件SQLdiag.xml
中的<Machine>
元素的name
属性指定为"."
,并且不要在命令行中指定/G
参数。 默认情况下, "."
为 name
配置文件中的属性指定,并且 /G
参数处于关闭状态。 通常,从群集 SQL Server 实例收集时,无需编辑配置文件或更改命令行参数。
指定为计算机名称时 "."
, SQLdiag 会检测到它在群集上运行,并同时从群集上安装的所有 SQL Server 虚拟实例检索诊断信息。 如果只希望从计算机上运行的其中一个虚拟 SQL Server 实例中收集诊断信息,请在 SQLdiag.xml
中为 <Machine>
元素的 name
属性指定该虚拟 SQL Server。
注意
若要从群集 SQL Server Profiler 实例中收集 SQL Server 跟踪信息,必须在群集中启用管理共享 (ADMIN$)。