SQLdiag 实用工具

在 SQL Server 2005 中,SQLdiag 实用工具是一般用途的诊断信息收集实用工具,可作为控制台应用程序或服务运行。 可以使用 SQLdiag 从 SQL Server 和其他类型的服务器中收集日志和数据文件,同时还可将其用于一直监视服务器或对服务器的特定问题进行故障排除。 SQLdiag 旨在加快和简化为 Microsoft 客户支持服务部门收集诊断信息的过程。

ms162833.note(zh-cn,SQL.90).gif注意:
在 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 machine|@machinelistfile]
       [/C file_compression_type]
              [/B [+]start_time]
       [/E [+]stop_time]
       [/A SQLdiag_application_name]
       [/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 将会尝试创建该文件夹。

    ms162833.note(zh-cn,SQL.90).gif注意:
    输出文件夹位置相对于可使用 /P 指定的支持文件夹位置。 若要为输出文件夹设置一个完全不同的位置,请为 /O 指定完整的目录路径。
  • /Psupport_folder_path
    设置支持文件夹路径。 默认情况下,将 /P 设置存放 SQLdiag 可执行文件的文件夹。 支持文件夹包含 SQLdiag 支持文件,如 XML 配置文件、Transact-SQL 脚本以及该实用工具在收集诊断信息过程中所使用的其他文件。 如果使用该选项指定一个备用的支持文件路径,则 SQLdiag 会自动将其所需的支持文件复制到指定的文件夹(如果这些文件尚未存在)。

    ms162833.note(zh-cn,SQL.90).gif注意:
    若要将当前文件夹设置为支持路径,请在命令行中指定 %cd%,如下所示: SQLDIAG /P %cd%
  • /Noutput_folder_management_option
    设置 SQLdiag 在其启动时,是覆盖还是重命名输出文件夹。 可用选项包括:

    1 = 覆盖输出文件夹(默认)

    2 = 当 SQLdiag 启动时,将输出文件夹重命名为 SQLDIAG_00001、SQLDIAG_00002 等等。 重命名当前输出文件夹之后,SQLdiag 将输出写入默认输出文件夹 SQLDIAG。

    ms162833.note(zh-cn,SQL.90).gif注意:
    SQLdiag 在启动时不会将输出追加到当前输出文件夹。 它只能覆盖默认的输出文件夹(选项 1)或重命名该文件夹(选项 2),然后将输出写入名为 SQLDIAG 的新默认输出文件夹。
  • /Mmachine | @machinelistfile
    覆盖配置文件中指定的 machine。 默认情况下,配置文件为 SQLDiag.Xml,除非使用 /I 参数另行指定。

    使用 @machinelistfile 指定要存储在配置文件中的计算机列表文件名。

  • /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_timeend_time 之间插入空格。

    请注意,SQLdiag 使用运行实用工具的计算机上的本地时间。

  • /A SQLdiag_application_name
    使您可针对同一个 SQL Server 实例运行多个 SQLdiag 实用工具实例。

    每个 SQLdiag_application_name 标识一个不同的 SQLdiag 实例。 SQLdiag_application_name 实例和 SQL Server 实例名之间没有任何关系。

    SQLdiag_application_name 可用于启动或停止特定的 SQLdiag 服务实例。

    例如:

    SQLDIAG START /A SQLdiag_application_name

    它也可与 /R 选项一起使用,以将特定的 SQLdiag 实例注册为服务。 例如:

    SQLDIAG /R /ASQLdiag_application_name

    ms162833.note(zh-cn,SQL.90).gif注意:
    SQLdiag 会自动在为 SQLdiag_application_name 指定的实例名之前添加前缀 DIAG$。 如果您将 SQLdiag 注册为服务,则上述操作会提供有意义的服务名称。
  • /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 命令启动该服务:

    net start SQLDIAG

    ms162833.note(zh-cn,SQL.90).gif注意:
    使用 /A 参数指定 SQLdiag_application_name 会更改该实用工具使用的许多文件(包含默认配置文件)的默认名称。 例如,如果您的 SQLdiag_application_name 为 MyApp,则将默认配置文件重命名为 DIAG$MyApp.XML。将 SQLdiag 注册为服务时,需要复制默认配置文件并另存为该更改后的名称或使用 /I 参数将其指定为配置文件。
  • /U
    撤消 SQLdiag 服务注册。

    如果撤消注册命名的 SQLdiag 实例,则也要使用 /A 参数。

  • /L
    如果还分别使用 /B/E 参数指定了开始时间或结束时间,则以连续模式运行 SQLdiag。 在诊断信息收集工作因预定关闭而停止后,SQLdiag 会自动重新启动。 例如,使用 /E/X 参数。

    ms162833.note(zh-cn,SQL.90).gif注意:
    如果未使用 /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

安全要求

除非以常规模式(通过指定 /G 命令行参数)运行 SQLdiag,否则,运行 SQLdiag 的用户必须为 Windows Administrators 组的成员和 SQL Server sysadmin 固定服务器角色的成员。 默认情况下,SQLdiag 使用 Windows 身份验证连接到 SQL Server,但是它也支持 SQL Server 身份验证。

性能注意事项

运行 SQLdiag 的性能效果取决于其配置收集的诊断数据的类型。 例如,如果已配置 SQLdiag 来收集 SQL Server 事件探查器跟踪信息,则选择跟踪的事件类越多,服务器性能所受的影响就越大。

运行 SQLdiag 对服务器性能的影响大体相当于分别收集配置的诊断信息的开销之和。 例如,通过 SQLdiag 收集跟踪信息和通过 SQL Server 事件探查器收集跟踪信息所产生的性能开销相同。 使用 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 事件探查器),请确保输出文件夹在本地驱动器中,并有足够的空间存储请求的诊断信息输出。

重新启动 SQLdiag 后,它将覆盖输出文件夹的内容。 若要避免出现这种情况,请在命令行中指定 /N 2

数据收集过程

SQLdiag 在启动时,会执行收集 SQLDiag.Xml 中指定的诊断数据所必需的初始化检查。该过程需要持续数秒。 如果 SQLdiag 作为控制台应用程序运行,则开始收集诊断数据时会显示一条消息,通知您 SQLdiag 已开始收集,您可以按 CTRL+C 停止收集。 如果 SQLdiag 作为服务运行,类似消息将被写入 Windows 事件日志。

如果要使用 SQLdiag 诊断可以再现的问题,则请等到收到此消息后再在服务器中再现问题。

SQLdiag 以并行方式收集多数诊断数据。 除了通过 Windows 性能日志和事件日志收集的信息之外,所有诊断信息均通过连接到工具(如 SQL Server sqlcmd 实用工具或 Windows 命令处理器)收集。 SQLdiag 在每台计算机上使用一个工作线程来监视其他工具的诊断数据收集,经常会同时等待几个工具完成操作。 在收集过程中,SQLdiag 会将每个诊断信息的输出内容传送到输出文件夹。

停止数据收集

SQLdiag 在开始收集诊断数据后会持续进行收集,直至收集被停止或在配置好的指定时间停止。 可以使用 /E 参数或 /X 参数将 SQLdiag 配置为在指定时间停止,第一个参数允许指定一个停止时间,第二个参数则使 SQLdiag 以快照模式运行。

SQLdiag 停止时将停止它启动的所有诊断。 例如,它将停止正在收集的 SQL Server 事件探查器跟踪,停止执行正在运行的 Transact-SQL 脚本,同时停止在数据收集期间生成的任何子进程。 诊断数据收集完成后,便会退出 SQLdiag

ms162833.note(zh-cn,SQL.90).gif注意:
不支持暂停 SQLdiag 服务。 如果尝试暂停 SQLdiag 服务,则该服务会在完成收集您暂停时它正在收集的诊断信息后停止。 如果在停止 SQLdiag 后重新启动,则应用程序会重新启动并覆盖输出文件夹。 若要避免覆盖输出文件夹,请在命令行中指定 /N 2
停止作为控制台应用程序运行的 SQLdiag

如果正将 SQLdiag 作为控制台应用程序运行,则在运行 SQLdiag 的控制台窗口中按 CTRL+C 将其停止。 按了 CTRL+C 之后,控制台窗口中将显示一条消息,通知您正在终止 SQLDiag 数据收集,此时请等待过程结束。该过程可能需要数几分钟的时间。

按 Ctrl+C 两次可终止所有子诊断过程并立即终止应用程序。

停止作为服务运行的 SQLdiag

如果将 SQLdiag 作为服务运行,则在 SQLdiag 启动文件夹中运行 SQLDiag STOP 可将其停止。

如果在同一台计算机中运行多个 SQLdiag 实例,则停止该服务时,也可以将 SQLdiag 实例名传递到命令行中。 例如,若要停止名为 Instance1 的 SQLdiag 实例,请使用以下语法:

SQLDIAG STOP /A Instance1
ms162833.note(zh-cn,SQL.90).gif注意:
/A 是唯一可以与 STARTSTOPSTOP_ABORT 一起使用的命令行参数。 如果需要使用服务谓词之一指定 SQLdiag 命名实例,则在命令行中控制谓词的后面指定 /A,如上述语法示例中所示。 使用控制谓词时,它们必须为命令行中的第一个参数。

若要尽快停止服务,请在实用工具启动文件夹中运行 SQLDIAG STOP_ABORT。 该命令会在不等待当前正在执行的任何诊断信息收集完成的情况下将其中止。

ms162833.note(zh-cn,SQL.90).gif注意:
使用 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 会自动为使用 /A 指定的任意 SQLdiag 实例名添加前缀 DIAG$,以创建有意义的服务名称。

撤消 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 实例

通过在命令行中指定 /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 实例中收集诊断信息时,无需编辑配置文件或更改命令行参数。

ms162833.note(zh-cn,SQL.90).gif注意:
可以使用 /M 参数指定不同于 SQLDiag.Xml 文件中指出的 <计算机> 。 也可以使用 @machinelistfile 语法与 /M 参数来指定包含 <计算机> 名称列表的文件。

如果将 "." 指定为计算机名称,则 SQLdiag 会检测到它正在群集中运行,同时从该群集中安装的所有虚拟 SQL Server 实例中检索诊断信息。 如果只希望从计算机中运行的其中一个虚拟 SQL Server 实例中收集诊断信息,则可在 SQLDiag.Xml 中为 <Machine> 元素的 name 属性指定该虚拟 SQL Server。

ms162833.note(zh-cn,SQL.90).gif注意:
若要从群集 SQL Server 实例中收集 SQL Server Profiler 跟踪信息,必须在群集中启用管理共享 (ADMIN$)。

请参阅

概念

命令提示实用工具

帮助和信息

获取 SQL Server 2005 帮助

更改历史记录

发布日期 历史记录

2007 年 9 月 17 日

新增内容:

提供有关 SQLDiag 实用工具 /M 参数的信息。