データ コレクタのトラブルシューティング
このトピックでは、トラブルシューティングの次のカテゴリについて説明します。
エラー条件。このカテゴリでは、オブジェクト モデルおよび実行時のエラーについて説明します。
パフォーマンスの問題。このカテゴリでは、パフォーマンスに関する一般的なシナリオと特殊なシナリオについて説明します。
システム ハング。このカテゴリでは、データ収集時のサブコンポーネントのハングについて説明します。
エラー条件
エラーは、オブジェクト モデルに起因して発生する場合と、実行時に発生する場合があります。
オブジェクト モデルのエラー
データ コレクタのオブジェクト モデルは、データ コレクタのプロパティとデータ コレクション セットをプログラムで管理できるようにするマネージ API です。このオブジェクト モデルは、データ コレクタの構成メカニズムを提供する一連のストアド プロシージャおよびビューの Thin ラッパーです。詳細については、「データ コレクタのプログラミング」を参照してください。
オブジェクト モデルのエラーは、次に挙げるオブジェクト モデルのコンポーネントのいずれかで発生します。
データ コレクタ ストアド プロシージャの 1 つから呼び出されるストアド プロシージャまたは Transact-SQL コードから Transact-SQL エラーが発生します。
データ コレクタ ストアド プロシージャから直接 Transact-SQL エラーが発生します。
オブジェクト モデルから直接マネージ例外がスローされます。
次の表では、オブジェクト モデルから発生する可能性のあるエラーについて説明します。
エラー メッセージ |
エラー番号 |
説明 |
---|---|---|
アクティブなコレクション セット '%s' の name、target、proxy_id、または collection_mode を更新できません。コレクション セットを停止してからもう一度更新してください。 |
14669 |
アクティブなコレクション セットを更新しようとしました。このような更新を実行するには、事前にコレクション セットを停止する必要があります。コレクション セットがアクティブである間は、アップロード スケジュールしか変更できません。 |
アクティブなコレクション セット '%s' を削除できません。コレクション セットを停止してからもう一度削除してください。 |
14670 |
実行中のコレクション セットを削除しようとしました。 |
アクティブなコレクション セット '%s' 内のコレクション アイテム '%s' の名前またはパラメータを更新できません。コレクション セットを停止してから、コレクション アイテムをもう一度更新してください。 |
14671 |
実行中のコレクション セット内のコレクション アイテムを更新しようとしました。 |
アクティブなコレクション セット '%s' 内のコレクション アイテム '%s' を削除できません。コレクション セットを停止してから、コレクション アイテムをもう一度削除してください。 |
14672 |
実行中のコレクション セット内のコレクション アイテムを削除しようとしました。 |
コレクタの種類 '%s' を削除できません。このコレクタの種類に関連付けられているすべてのコレクション アイテムを削除してからもう一度削除してください。 |
14673 |
コレクション アイテムが関連付けられているコレクタの種類を削除しようとしました。 |
非アクティブなコレクション セット '%s' のデータをアップロードできません。コレクション セットを開始してから、データをもう一度アップロードしてください。 |
14674 |
実行されていないコレクション セットによって収集されたデータをアップロードしようとしました。 |
name、target、proxy_id、logging_level、または collection_mode を更新できないか、コレクション アイテムをアクティブなコレクション セット '%s' に追加できません。コレクション セットを停止してからもう一度更新してください。 |
14675 |
実行中のコレクションのセットを更新しようとしました。 |
ユーザーには '%s' を変更する権限がありません。ユーザーはデータ コレクタ ロール '%s' のメンバである必要があります。 |
14676 |
特定のデータ コレクタ ロールのみが変更できるプロパティをユーザーが更新しようとしました。 |
ユーザーにはこの操作を実行する権限がありません。ユーザーはデータ コレクタ ロール '%s' のメンバである必要があります。 |
14677 |
必要なデータ コレクタ ロールに属していないユーザーが操作を実行しようとしました。 |
ID %d の SQL Server トレースが外部ユーザーによって停止され、閉じられました。SQL Server トレース コレクタにより、このトレースの再作成が試みられます。 |
14678 |
データ コレクタが作成して使用していたトレースが、コレクタ ランタイムの外部で停止され、閉じられました。 |
指定された %s (%s) はこのデータ ウェアハウスでは無効です。 |
14679 |
この管理データ ウェアハウスでストアド プロシージャの 1 つに渡されたパラメータの値が、ウェアハウス内の他のエントリと適合しません。 |
このバージョンの instmdw.sql は、SQL Server 2005 以降を実行しているサーバーに対してのみ実行できます。 |
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 になることはありません。NULL になった場合は、コレクションの構成データが内部で破損している可能性があります。 |
14691 |
sp_syscollector_verify_collector_state の呼び出しで、NULL 値の CollectorEnabled パラメータが検出されました。コレクタの構成データが内部で破損している可能性があります。 |
実行時のエラー
実行時エラーは、コレクション パッケージまたはアップロード パッケージの実行中に問題が生じたときに発生する可能性があります。このエラーは、次のいずれかのコンポーネントから発生します。
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 です。この ID を使用して、このビューが他の詳細ログと結合されます。 |
parent_log_id |
親パッケージまたはコレクション セットの ID です。コレクション セットの場合は NULL です。この ID は親子関係としてチェーン化されるので、どのコレクション セットがどのパッケージを開始したかを容易に判別できます。また、このビューでは、呼び出しチェーンを明確に判別できるように、ログ エントリが親子関係に基づいてグループ化され、パッケージの名前にインデントが設定されます。 |
name |
このログ エントリが表すコレクション セットまたはパッケージの名前です。 |
collection_mode |
エントリが作成されたときのコレクション セットのアクティビティです (収集またはアップロードのいずれか)。 |
start_time |
コレクション セットまたはパッケージが開始された日時です。 |
last_iteration_time |
継続的に実行されるパッケージで、スナップショットが最後にキャプチャされた日時を表します。 |
finish_time |
完了したパッケージおよびコレクション セットの実行が完了した日時です。 |
duration |
パッケージまたはコレクション セットが実行されている時間 (ミリ秒) です。 |
operator |
コレクション セットまたはパッケージを開始したオペレータです。 |
status |
コレクション セットまたはパッケージの状態です。次のいずれかの値になります。
|
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 で提供されるログを表示する方法でも入手できます。詳細については、「コレクション セットのログを表示する方法」を参照してください。
パフォーマンスの問題
パフォーマンスの確認と診断に使用できるデータには、主に 3 つのソースがあります。
1 つ目のソースは前のセクションで説明したログ テーブルです。ログ テーブルには、パフォーマンスの問題に対処する際に役立つ情報も含まれています。
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 |
パッケージのデータ フロー コンポーネントの消費時間の最大値です (ミリ秒)。 |
パフォーマンス データの 2 つ目のソースは syscollector_execution_log_full テーブルです。このテーブルには、コレクション セットの過去または現在の実行期間に関する情報が含まれています。
3 つ目のソースであるパフォーマンス カウンタは、パフォーマンスの評価に役立ちます。特にデータ コレクタ プロセス (dcexec.exe) インスタンスの標準プロセス カウンタでは、データ コレクタの実行時コンポーネントがシステム リソースをどの程度使用しているかを把握できます。
パフォーマンスの問題のシナリオ
データ コレクタ実行時にパフォーマンスの問題として発生する可能性が高い 2 つのシナリオがあります。
データ コレクタの消費するシステム リソースが多すぎる。
データ コレクタが収集負荷に対応できない。
システム リソースの過剰消費
プロセス パフォーマンス カウンタの分析から、dcexec.exe プロセスが使用しているシステム リソースが多すぎることがわかった場合は、次の調査を行う必要があります。
まず、単一のコレクション セットが大部分のリソースを使用していないかどうかを確認します。
コレクション セットを特定するには、syscollector_execution_log_full 内のコレクション セット ID にプロセス ID を対応付け、syscollector_collection_sets テーブル内でコレクション セットを検索します。
コレクション セットが収集している内容を確認します。次のクエリを使用して、このセットにグループ化されているすべてのコレクション アイテムを一覧表示します。
select * from syscollector_collection_set_items where collection_set_id = <id>
上のクエリから返された情報を使用して、次の項目について検討します。
コレクション アイテムが多すぎるかどうか。
1 つのコレクション アイテムが問題のほとんどを引き起こしているかどうか。
収集されるデータが多すぎるかどうか。
上の項目に対する答えが 1 つでも "はい" であった場合は、コレクションまたはコレクション アイテムを変更して、収集されるデータの量を減らすことを検討してください。これによりリソース消費量が軽減されます。
次に、複数のアクティブなコレクション セットが問題を引き起こしていないかどうかを確認します。
次のクエリを使用して、システムで定義されているコレクション セットの数を確認します。
select count(*) from syscollector_collection_sets
次のクエリを使用して、現在実行されているコレクション セットの数を確認します。
select count(*) from syscollector_execution_log_full where parent_log_id is null and status = 1
パフォーマンスの問題が断続的に発生する場合は、問題が収集アクティビティまたはアップロード アクティビティに関係しているかどうかを確認します。スケジュールがすべて同じである場合は、それが問題の原因である可能性があります。簡単な解決策は、収集またはアップロードのスケジュールを調整することです。
負荷に対応できない
この状況は、継続的に実行されるコレクション セットでのみ発生します。高い収集頻度で大量のデータを収集していると、1 回のスナップショット反復処理に割り当てられている時間内にコレクション パッケージがデータを処理できない場合があります。この状況を検出するには、ログ テーブルの avg_duration 列と max_duration 列を、特定のコレクション アイテムに定義されている収集頻度と比較します。
max_duration の値が頻度の値より大きい場合は、コレクション パッケージが構成された頻度に常時対応できていない可能性があります。avg_duration の値が頻度より高い場合は、コレクション パッケージの一貫性に問題があります。後者の場合は、頻度を下げるか、収集されるデータ量を制限するようにコレクション アイテムを変更する必要があります。
システム ハング
データ コレクタの一部として実行されているパッケージが、処理を停止した後も終了せずにそのままの状態で残っていると、システムがハングするおそれがあります。システム ハングのほとんどは、コレクション セットを停止して再開することで解決できます。
本当のハングと意図された動作を見分けることが重要です。
継続的に実行されているコレクション パッケージは、ほとんどの時間が待機状態であり、データ スナップショットを収集するために定期的に起動されます。データの収集が完了すると、パッケージは待機状態に戻ります。この待機状態はシステム ハングのように見えることがありますが、そうではありません。これを確認するには、syscollector_execution_log_full テーブルで疑わしいパッケージをチェックします。last_iteration_time が現在の時刻以前であれば、この状況はハングではありません。
収集アクションのトリガとなるイベントを待機するようにパッケージが設計されている場合があります。この場合、パッケージはそのイベントを待機します。これはハングではありません。
データ コレクタに関連するシステム ハングが発生していることを確認するには、次のチェックを実行します。
まず、調査対象のコレクション セットに対応する dcexec.exe プロセス ID を特定します。
次に、そのプロセスが実行中であるかどうか、またリソースを使用しているかどうかを確認します。通常、ハングしたプロセスは CPU 使用率が 0% であり、メモリが割り当てられることもありません。プロセスは高い CPU 使用率を示す場合もあります。この場合はプロセスがループし、メモリを解放していない可能性があります。
最後に、ログ テーブルでプロセスが最後に更新された日時を確認します。更新日時がコレクション アイテムの頻度より後である場合は、プロセスがハングしている可能性があります。
データ コレクタ プロセスがハングする理由はいくつかあります。最も一般的な理由は次のとおりです。
パッケージが次の反復処理の合図を待っているが、その合図が送られない。
パッケージが、別のパッケージが保持している共有ロックを待っているが、そのロックが解放されない。
パッケージ実行中に発生したエラーが適切に処理されずに制御フローが中断されたが、パッケージの実行が完全に失敗していない。
上記のどの場合でも、システム ハングに関連する具体的なエントリがログに記録されます。原因を示すメッセージがないかどうかを確認してください。システム ハングが発生した場合は、dcexec.exe プロセスのダンプを作成し、さらに調査してください。