資料收集器的疑難排解

本主題將對付以下類別的疑難排解問題:

  • 錯誤狀況。這個類別涵蓋了物件模型和執行階段的錯誤。

  • 效能問題。這個類別涵蓋了一般和特定的效能狀況。

  • 系統停止回應。這個類別涵蓋了資料收集期間的子元件停止回應狀況。

錯誤狀況

錯誤可以從物件模型或是在執行階段引發。

物件模型錯誤

資料收集器物件模型是一種 Managed API,可提供程式設計方式來管理資料收集器屬性和資料收集組。此物件模型是一組預存程序和檢視周圍的薄型包裝函式,可為資料收集器提供組態設定機制。如需詳細資訊,請參閱<資料收集器程式設計>。

物件模型錯誤可能是來自此物件模型的下列其中一個元件:

  • Transact-SQL 錯誤是從預存程序或 Transact-SQL 程式碼 (從其中一個資料收集器預存程序呼叫) 所引發。

  • Transact-SQL 錯誤是直接從資料收集器預存程序所引發。

  • Managed 例外狀況會直接從此物件模型擲回。

下表描述可以從此物件模型引發的錯誤。

錯誤訊息

錯誤號碼

描述

無法更新使用中收集組 '%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

使用者嘗試在不屬於必要資料收集器角色的情況下執行作業。

SQL Server 追蹤 (識別碼為 %d) 已停止,並由外部使用者所關閉。SQL Server 追蹤收集器將會嘗試重新建立追蹤。

14678

資料收集器所建立及使用的追蹤已經在收集器執行階段的外部停止及關閉。

此資料倉儲中指定的 %s (%s) 無效。

14679

傳入管理資料倉儲內其中一個預存程序的參數具有不符合此倉儲中其他項目的值。

這個版本的 instmdw.sql 應該只能針對執行 SQL Server 2005 或更新版本的伺服器執行。

14680

嘗試在執行 SQL Server 2000 或更早版本的伺服器上安裝管理資料倉儲。

無法在停用收集器時執行這個程序。請啟用收集器,然後重試一遍。

14681

嘗試執行與收集器狀態衝突的作業。

收集組的狀態已經變更,但是在收集器啟用之前,它將不會啟動或停止。

14682

嘗試在未啟用收集器時啟動或停止此收集組。

快照集模式或連續模式中的收集組需要排程。

14683

在快照集模式或連續模式中建立或更新收集組,而未提供排程。

捕捉錯誤數: %d,層級: %d,狀態: %d,在程序: %s,行: %d,訊息為: %s

14684

資料收集器元件中發生一般錯誤;在 CATCH 區塊內發現此錯誤,並將它重新擲回。

作業無效。識別碼 = %d 之收集組的狀態目前未執行中。

14685

呼叫集合的 sp_syscollector_create_set_queue_and_service,其 is_running 狀態為 0。

組態存放區的 MDWInstance 和 MDWDatabase 參數不能是 null。

14686

管理資料倉儲的連接字串對於 MDWInstance 或 MDWDatabase 參數而言為 null。

@cache_window 參數的值 (%d) 無效。可允許的值為: -1 (快取前一次上載失敗後的所有上載資料)、0 (不快取上載資料)、N (快取前 N 次上載失敗後的資料,其中 N >= 1)

14687

嘗試將收集器組態存放區的 CacheWindow 參數值設定為小於 -1 的值。

當 SQL Server Agent 停止時,無法啟動收集組。請啟動 SQL Server Agent。

14688

嘗試在未啟用 SQL Server Agent 時啟動收集組。

如果未設定管理資料倉儲,就無法啟動收集組。請執行 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

每個收集組執行的唯一識別碼。這是用來聯結此檢視與其他詳細記錄。

parent_log_id

父封裝或收集組的識別碼。這對於收集組而言為 NULL。這些識別碼會以父子式關聯性鏈結,讓您輕鬆識別哪個收集組啟動哪個封裝。此外,這個檢視會依據父子式連結分組這些記錄項目,並縮排封裝的名稱,以便清楚地顯示呼叫鏈結。

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)

資料收集器狀態報告

您可以取得上述 Transact-SQL 查詢所傳回的相同資訊,其方式是檢視 SQL Server Management Studio 中所提供的記錄。如需詳細資訊,請參閱<如何:檢視收集組記錄>。

效能問題

有三種主要資料來源可讓您用來檢閱及診斷效能。

首先,上一節所述的記錄資料表也會提供有用的資訊讓您對付效能問題。

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 處理序使用太多的系統資源,則需要進行以下調查工作。

首先,判斷是否有單一收集組使用最多的資源。

  • 若要識別此收集組,請將處理序識別碼對應到 syscollector_execution_log_full 中的收集組識別碼,然後在 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 處理序識別碼。

  • 接下來,檢查看看此處理序是否正在執行以及它是否使用任何資源。任何停止回應的處理序通常會使用 0% 的 CPU,而且不會配置更多的記憶體。此處理序也可以使用高百分比的 CPU。如果是這種狀況,它可能會不斷循環,而且不會結束記憶體。

  • 最後,檢查此處理序的記錄資料表,以了解它上一次更新的時間。如果更新時間大於收集項的頻率,此處理序可能會停止回應。

有幾個原因會造成資料收集器處理序停止回應。以下是最常見的原因:

  • 封裝等候下一個反覆運算發出信號,但是並未發生。

  • 某個封裝等候另一個封裝所保留的共用鎖定,但是並未釋放此鎖定。

  • 在封裝執行期間發生了未適當處理的錯誤,而且控制流程中斷,但是此封裝並未完全失敗。

在上述的任何情況中,記錄中都會有特定的項目與系統停止回應狀況有關。請查看是否有任何訊息指示原因。萬一發生系統停止回應狀況時,請建立 dcexec.exe 處理序的傾印,然後進一步調查。