数据收集器故障排除

本主题解决以下类别的疑难问题:

  • 错误情况。此类别包含对象模型和运行时错误。

  • 性能问题。此类别包含一般和特定的性能情况。

  • 系统挂起。此类别包含数据收集过程中发生的子组件挂起。

错误情况

错误可能会由对象模型或在运行时引发。

对象模型错误

数据收集器对象模型是一种托管 API,它提供一种编程方式来管理数据收集器属性和数据收集组。对象模型是为数据收集器提供配置机制的一组存储过程和视图周围的薄包装。有关详细信息,请参阅数据收集器编程

对象模型错误可能来自对象模型的下列组件之一:

  • Transact-SQL 错误由从其中一个数据收集器存储过程调用的存储过程或 Transact-SQL 代码引发。

  • Transact-SQL 错误由数据收集器存储过程直接引发。

  • 托管异常由对象模型直接引发。

下表说明了对象模型可能引发的错误。

错误消息

错误号

说明

无法更新活动收集组 '%s' 的名称、目标、proxy_id 或 collection_mode。请停止该收集组,然后再次尝试将其更新。

14669

试图更新活动收集组。必须先停止收集组,然后才能进行任何该类型的更新。当收集组处于活动状态时,只能更改上载计划。

无法删除活动收集组 '%s'。请停止该收集组,然后再次尝试将其删除。

14670

试图删除正在运行的收集组。

无法更新活动收集组 '%s' 中收集项 '%s' 的名称或参数。请停止该收集组,然后再次尝试更新该收集项。

14671

试图更新正在运行的收集组中的收集项。

无法删除活动收集组 '%s' 中的收集项 '%s'。请停止该收集组,然后再次尝试删除该收集项。

14672

试图删除正在运行的收集组中的收集项。

无法删除收集器类型 '%s'。请删除与此收集器类型关联的所有收集项,然后再次尝试将其删除。

14673

试图删除具有关联的收集项的收集器类型。

无法上载非活动收集组 '%s' 的数据。请启动该收集组,然后再次尝试上载数据。

14674

试图上载由未在运行的收集组收集的数据。

无法更新名称、目标、proxy_id、logging_level 或 collection_mode,或者无法向活动收集组 '%s' 添加收集项。请停止该收集组,然后再次尝试将其更新。

14675

试图更新正在运行的收集组。

该用户无权更改 '%s'。该用户必须是数据收集器角色 '%s' 的成员。

14676

用户试图更新只能由特定数据收集器角色更改的属性。

该用户无权执行此操作。该用户必须是数据收集器角色 '%s' 的成员。

14677

用户试图执行某操作,但不是所需的数据收集器角色的成员。

外部用户已停止并关闭了 ID 为 %d 的 SQL Server 跟踪。SQL Server 跟踪收集器将尝试重新创建该跟踪。

14678

由数据收集器创建并使用的跟踪已在收集器运行时之外停止和关闭。

此数据仓库中指定的 %s (%s) 无效。

14679

传递给管理数据仓库中某个存储过程的参数的值与仓库中的其他条目不匹配。

只能对运行 SQL Server 2005 或更高版本的服务器执行此版本的 instmdw.sql。

14680

试图在运行 SQL Server 2000 或早期版本的服务器上安装管理数据仓库。

禁用收集器时不能执行此过程。请启用收集器,然后重试。

14681

试图执行与收集器的状态相冲突的操作。

收集组的状态已更改,但是只有在启用收集器后,它才能启动或停止。

14682

试图在未启用收集器时启动或停止收集组。

快照中或连续模式下的收集组需要一个计划。

14683

在快照中或连续模式下创建或更新收集组而未提供计划。

捕捉到错误,编号: %d,级别: %d,状态: %d,过程: %s,行: %d,消息: %s

14684

数据收集器组件中发生一般性错误;在 catch 块中捕获到该错误并再次引发该错误。

操作无效。ID 为 %d 的收集组的状态当前为“未运行”。

14685

针对 is_running 状态为 0 的收集组调用 sp_syscollector_create_set_queue_and_service。

配置存储区的 MDWInstance 和 MDWDatabase 参数不能为 Null。

14686

MDWInstance 或 MDWDatabase 参数的管理数据仓库连接字符串为 Null。

@cache_window 参数的值 (%d) 无效。允许的值为: -1 (缓存以前上载失败的所有上载数据)、0 (不缓存上载数据)、N (缓存以前 N 次上载失败的数据,其中 N >= 1)

14687

试图将收集器配置存储区的 CacheWindow 参数的值设置为小于 -1 的值。

SQL Server 代理停止时收集组无法启动。请启动 SQL Server 代理。

14688

试图在未启用 SQL Server 代理时启动收集组。

如果未配置管理数据仓库,则收集组无法启动。请运行 instmdw.sql 脚本以创建并配置管理数据仓库。

14689

试图在未设置管理数据仓库时启动收集组。

启用收集器时无法执行此过程。请禁用收集器,然后重试。

14690

试图执行与收集器的状态相冲突的操作。

收集器的状态不能为 Null。这可能表示收集器配置数据发生内部损坏。

14691

对 sp_syscollector_verify_collector_state 的调用发现 CollectorEnabled 参数的值为 Null。这可能表示收集器的配置数据发生内部损坏。

运行时错误

当收集包或上载包在运行中遇到问题时便会发生运行时错误。这些错误可能来自下列组件之一:

  • SQL Server 2008 Integration Services (SSIS) 包的数据流。这些错误可能是由于数据转换失败或出现数据截断导致的。数据收集器会记录受错误影响的行号,并将其记录在数据收集器日志表中。

  • SSIS 包的控制流。这些错误记录在 msdb 数据库的 SSIS 日志表 (msdb.dbo.sysssislog) 中,并冒泡到数据收集器日志表中。

  • 数据收集器运行时组件 (dcexec.exe)。这些错误直接记录在数据收集器日志表中。

有关详细信息,请参阅数据收集器日志记录

我们建议采用以下方法之一获取有关运行时错误的状态信息。

Transact-SQL 存储过程和视图

若要查看所有当前正在运行和已完成的收集组或包的状态,请运行以下查询:

use msdb
select * from syscollector_execution_log_full

上述查询将返回以下结果集。

列名

说明

log_id

每个收集组执行的唯一 ID。它用于将此视图与其他详细日志联接起来。

parent_log_id

父包或收集组的 ID。对于收集组而言,此值为 NULL。各个 ID 以父子关系链接在一起,以便可以轻松确定哪个收集组启动了哪个包。此外,此视图将日志条目按其父子链接进行分组并缩进包的名称,从而使调用链清晰可见。

name

该日志条目所表示的收集组或包的名称。

collection_mode

记录该条目时的收集组活动,即收集或上载。

start_time

收集组或包启动的时间。

last_iteration_time

对于连续运行的包而言,是包上次捕获快照的时间。

finish_time

对于已完成的包和收集组而言,是运行完成的时间。

duration

包或收集组已经运行的时间(以毫秒为单位)。

operator

启动该收集组或包的操作员。

status

收集组或包的状态。此值可以为:

  • 0 - 正在运行

  • 1 - 已完成

  • 2 - 失败

failure_task

当收集组或包失败时,导致失败的 SSIS 包中的任务的名称。

package_execution_id

指向 SSIS 日志表的链接。

collection_set_id

指向数据收集器配置表的链接。

注意注意
您可以使用 collection_set_id 作为筛选器以专注于日志中的特定收集组。

有关详细信息,请参阅 syscollector_execution_log_full (Transact-SQL)

您可以通过执行数据收集器提供的函数之一获取有关收集组和包执行的其他信息。

以下函数将返回有关收集组或包的详细统计信息,包括由包记录的错误行的数目。

select * from fn_syscollector_get_execution_stats(@log_id)

下一个函数将返回与某个包的 package_execution_id 相匹配的 SSIS 日志 (sysdtslog90) 部分。如果该包失败,则这是找出错误根源的最好方式。

select * from fn_syscollector_get_execution_details(@log_id)

数据收集器状态报表

您可以通过查看 SQL Server Management Studio 中提供的日志获取与前面的 Transact-SQL 查询返回的信息相同的信息。有关详细信息,请参阅如何查看收集组日志

性能问题

有三个主要的数据源可用于检查和诊断性能。

首先,上一部分介绍的日志表还提供了可用于解决性能问题的有用信息。

fn_syscollector_get_execution_stats 函数可返回以下信息。

列名

说明

avg_row_count_in

进入包的数据流任务的平均行数。

min_row_count_in

进入包的数据流任务的最小行数。

max_row_count_in

进入包的数据流任务的最大行数。

avg_row_count_out

退出包的数据流任务的平均行数。

min_row_count_out

退出包的数据流任务的最小行数。

max_row_count_out

退出包的数据流任务的最大行数。

avg_duration

在包的数据流组件中消耗的平均时间(以毫秒为单位)。

min_duration

在包的数据流组件中消耗的最短时间(以毫秒为单位)。

max_duration

在包的数据流组件中消耗的最长时间(以毫秒为单位)。

第二个性能数据源是 syscollector_execution_log_full 表,该表提供有关已经完成运行或正在运行的收集组所用时间的信息。

最后,可以使用性能计数器来帮助评估性能问题。尤其是,数据收集器进程 (dcexec.exe) 实例的标准进程计数器为数据收集器运行时组件使用了多少系统资源提供了非常好的指示器。

性能问题具体情况

运行数据收集器时最有可能出现两种性能问题情况:

  • 数据收集器消耗的系统资源过多。

  • 数据收集器无法承受收集负荷。

系统资源过度消耗

如果进程性能计数器的分析表明 dcexec.exe 进程使用的系统资源过多,则需要进行以下调查。

首先,确定是否大部分资源都由一个收集组占用。

  • 若要标识该收集组,请将进程 ID 映射到 syscollector_execution_log_full 中的收集组 ID,然后在 syscollector_collection_sets 表中查找该收集组。

  • 确定该收集组所收集的内容。使用以下查询列出该收集组中的所有收集项:

    select * from syscollector_collection_set_items where collection_set_id = <id>
    
  • 使用来自上述查询的信息,考虑以下问题:

    • 收集项是否过多?

    • 大部分问题是否都由一个收集项所导致?

    • 收集的数据是否过多?

    • 如果对上述任何问题的回答为“是”,请考虑修改收集或收集项以减少所收集的数据量。这将减少资源消耗。

其次,确定问题是否由活动收集组的数量过多所导致。

  • 使用以下查询查看系统中定义的收集组数:

    select count(*) from syscollector_collection_sets
    
  • 使用以下查询查看当前正在运行的收集组数:

    select count(*) from syscollector_execution_log_full where parent_log_id is null and status = 1
    
  • 如果性能问题是间歇性的,请检查问题是否映射到任何收集或上载活动。如果所有计划都完全相同,则这可能是导致问题的原因。通过调整收集或上载计划或许就可以解决问题。

无法承受负荷

这种情况只发生在连续运行的收集组中。如果收集频率较高并且要收集的数据量较大,则收集包可能无法在为单个快照迭代分配的时间内处理数据。可以通过将日志表中的 avg_duration 和 max_duration 列与为特定收集项定义的收集频率进行比较来检测这种情况。

如果 max_duration 值大于频率值,则收集包可能无法始终满足配置的频率要求。如果 avg_duration 值大于频率值,则收集包会一直出现相同的问题。对于后一种情况,应减小频率或修改收集项以限制所收集的数据量。

系统挂起

如果作为数据收集器的一部分运行的某个包停止处理但并未退出而是停留在该状态,则会出现系统挂起。多数系统挂起问题都可以通过停止并重新启动收集组得到解决。

区分真正挂起和预期行为非常重要。

  • 连续运行的收集包多数时间处于等待状态,它会定期醒来收集数据快照。收集数据后,该包会回到等待状态。这种等待状态可能看似系统挂起,实际并不是。若要对此进行验证,请检查可疑包的 syscollector_execution_log_full 表。如果 last_iteration_time 不晚于当前时间,则该情况不属于挂起。

  • 包可能会设计为等待某个将触发收集操作的事件。这种情况下,包将会等待该事件。这种情况并不是挂起。

若要验证是否有与数据收集器相关的系统挂起,请执行以下检查:

  • 首先,标识与要调查的收集组相对应的 dcexec.exe 进程 ID。

  • 接下来,检查该进程是否正在运行以及是否使用了任何资源。任何挂起进程的 CPU 占用率通常都为 0% 并且不会分配较多内存。该进程也可能会占用高百分比的 CPU。如果是这种情况,则它可能正在进行循环并且未退出内存。

  • 最后,检查进程的日志表以查看它上次更新的时间。如果更新时间长于收集项的频率,则该进程可能已挂起。

有多种原因可导致数据收集器进程挂起。下面列出了最常见的原因:

  • 包等待发出下一个迭代信号,但没有信号发出。

  • 包等待由另一个包所占有的共享锁,但该锁未释放。

  • 包执行过程中出现错误且未得到适当处理,控制流中断,但包未完全失败。

在上述任何情况下,日志中都会有与系统挂起相关的特定条目。请查看是否有任何指示原因的消息。出现系统挂起时,请创建 dcexec.exe 进程的转储并做进一步调查。