パッケージ実行のトラブルシューティング
更新 : 2006 年 12 月 12 日
Integration Services には、パッケージを完成して配置した後、そのパッケージの実行時のトラブルシューティングに使用できる機能とツールが含まれています。
Business Intelligence Development Studio には、デザイン時に、パッケージの実行を一時的に停止するブレイクポイント、進行状況ウィンドウ、およびデータ フロー全体でのデータの流れが追えるデータ ビューアが用意されています。ただし、既に配置されているパッケージを実行するときは、これらの機能を使用できません。配置済みのパッケージのトラブルシューティングを行うための主な技法は次のとおりです。
- イベント ハンドラを使ってパッケージ エラーをキャッチおよび処理する。
- エラー出力を使って不適切なデータをキャプチャする。
- ログ記録を使ってパッケージの実行をステップ単位に追跡する。
次のヒントや技法を使用して、実行中のパッケージの問題を回避することもできます。
- トランザクションを使ってデータの整合性の確認を支援する。詳細については、「パッケージへのトランザクションの組み込み」を参照してください。
- チェックポイントを使って、エラーが発生した時点からパッケージを再開する。詳細については、「パッケージでのチェックポイントの使用」を参照してください。
イベント ハンドラを使ったパッケージ エラーのキャッチおよび処理
イベント ハンドラを使用することにより、パッケージやパッケージ内のオブジェクトで発生する多くのイベントに対応できます。
- OnError イベントのイベント ハンドラを作成する。イベント ハンドラでは、Send Mail タスクを使用した管理者へのエラー通知、スクリプト タスクやカスタム ロジックを使用したトラブルシューティング用のシステム情報の取得、リソースや不完全な出力の一時的なクリーンアップなどを実行できます。詳細については、「Integration Services のイベント ハンドラ」および「パッケージのイベント ハンドラの作成」を参照してください。
外部データ プロバイダの問題のトラブルシューティング
多くのパッケージが、外部データ プロバイダとのやりとりで失敗します。ところが、これらのプロバイダが Integration Services に返すメッセージには、多くの場合、トラブルシューティングを開始するための十分な情報が含まれていません。トラブルシューティングの必要事項をサポートするには、Microsoft SQL Server 2005 Service Pack 2 (SP2) において、パッケージと外部データ ソースとのやりとりに関するトラブルシューティングに使用できる新しいログ メッセージを含める必要があります。
ログ記録を有効にして、パッケージの Diagnostic イベントを選択すると、新しいトラブルシューティング メッセージが表示されます。SP2 からは、次に示す Integration Services コンポーネントで、外部データ プロバイダへの個々の呼び出しの前後に、メッセージをログに出力できるようになりました。
- OLE DB 接続マネージャ、OLE DB ソース、および OLE DB 変換先
- ADO.NET 接続マネージャおよび DataReader ソース
- SQL 実行タスク
- 参照変換、OLE DB コマンド変換、および緩やかに変化するディメンション変換
新しいログ メッセージには、呼び出されるメソッドの名前が含まれています。たとえば、これらのログ メッセージには OLE DB Connection オブジェクトの Open メソッド、または Command オブジェクトの ExecuteNonQuery メソッドが含まれています。このメッセージで使用される形式を次に示します。'%1!s!' はメソッド情報のプレースホルダです。
ExternalRequest_pre: The object is ready to make the following external request: '%1!s!'. ExternalRequest_post: '%1!s!'. The external request has completed.
外部データ プロバイダとのやりとりに関するトラブルシューティングを行うには、ログを表示して、"前の" メッセージ (
ExternalRequest_pre
) に対応する "後の" メッセージがあるかどうかを確認します (ExternalRequest_post
)。対応する "後の" メッセージがない場合は、外部データ プロバイダが予測どおりに応答しなかったことになります。
次の例では、新しいログ メッセージを含んでいるログの一部を示しています。ExternalRequest_pre: The object is ready to make the following external request: 'ITransactionJoin::JoinTransaction'. ExternalRequest_post: 'ITransactionJoin::JoinTransaction succeeded'. The external request has completed. ExternalRequest_pre: The object is ready to make the following external request: 'IDbConnection.Open'. ExternalRequest_post: 'IDbConnection.Open succeeded'. The external request has completed. ExternalRequest_pre: The object is ready to make the following external request: 'IDbConnection.CreateCommand'. ExternalRequest_post: 'IDbConnection.CreateCommand finished'. The external request has completed." ExternalRequest_pre: The object is ready to make the following external request: 'IDbCommand.ExecuteReader'. ExternalRequest_post: 'IDbCommand.ExecuteReader finished'. The external request has completed." ExternalRequest_pre: The object is ready to make the following external request: 'IDataReader.GetSchemaTable'. ExternalRequest_post: 'IDataReader.GetSchemaTable finished'. The external request has completed." ExternalRequest_pre: The object is ready to make the following external request: 'IDataReader.Close'. ExternalRequest_post: 'IDataReader.Close finished'. The external request has completed." ExternalRequest_pre: The object is ready to make the following external request: 'IDbConnection.Close'. ExternalRequest_post: 'IDbConnection.Close finished'. The external request has completed."
エラー出力を使った不適切なデータのトラブルシューティング
多くのデータ フロー コンポーネントではエラー出力を使用して、エラーを含む行を後で分析できるように別の場所にリダイレクトできます。
- エラー出力を使って不適切なデータをキャプチャする。エラーを含む行をエラー テーブルやテキスト ファイルなどの別の場所に送信します。エラー出力では、行が拒否される原因となったエラーの番号を含む列と、エラーが発生した列の ID を含む列の 2 つの数値列が自動的に追加されます。詳細については、「データのエラー処理」および「データ フロー コンポーネントでエラー出力を構成する方法」を参照してください。
- 関連情報をエラー出力に追加する。エラー出力から提供される 2 列の数値識別子だけでなく、説明的な情報を追加すると、エラー出力の分析が容易になります。
エラーの説明を追加する。スクリプト コンポーネントを使用することで、エラーの説明を容易に参照できます。詳細については、「スクリプト コンポーネントによるエラー出力の強化」を参照してください。
エラー列の名前を追加する。エラー出力に保存されている 列 ID に対応する列名は、スクリプト コンポーネントでは容易に参照できず、追加手順が必要です。データ フロー内の各列の ID は、データ フロー タスク内では一意で、パッケージのデザイン時に保存されます。次のアプローチは、列名をエラー出力に追加するための 1 つの考え方です。- 列名の参照テーブルを作成する。Integration Services API を使用する個別のアプリケーションを作成します。保存される各パッケージ、パッケージ内の各データフロー、データフロー内の各オブジェクト、データ フロー オブジェクト内の各入出力でこのアプリケーションを繰り返し実行します。アプリケーションでは、列 ID と参照テーブルでの各列の名前を、親データ フロー タスクとパッケージ ID と共に保存します。
- 列名を出力に追加する。前の手順で作成した参照テーブルの列名を参照する出力に、参照変換を追加します。参照では、エラー出力の列 ID、パッケージ ID (システム変数 System::PackageID で使用できます)、データ フロー タスクの ID (システム変数 System::TaskID で使用できます) を使用できます。
ログ記録を使ったパッケージの実行のトラブルシューティング
ログ記録を有効にすることで、実行中のパッケージで発生する多くの現象を追跡できます。ログ プロバイダは、後で分析するために特定のイベントに関する情報をキャプチャし、その情報をデータベース テーブル、フラット ファイル、XML ファイルなどのサポートされている出力形式で保存します。
- ログ記録を有効にする。イベントのみ、およびキャプチャする情報項目のみを選択することによって、ログの出力を微調整できます。詳細については、「Integration Services ログ プロバイダ」および「パッケージへのログ機能の実装」を参照してください。
- **パッケージの Diagnostic イベントを選択して、プロバイダに関する問題のトラブルシューティングを行います。**SP2 には、パッケージと外部データ ソースとのやりとりに関するトラブルシューティングに役立つ新しいログ メッセージが用意されています。詳細については、このトピック内の「外部データ プロバイダの問題のトラブルシューティング」を参照してください。
- 既定のログ出力を拡張する。ログ記録は、通常、パッケージを実行するたびに、ログの記録先に行を追加します。各行のログ出力では名前や一意識別子でパッケージを識別していますが、一意の ExecutionID で各パッケージの実行も識別しています。そのため、1 つの一覧に大量のログ記録が出力され、分析が難しくなります。次のアプローチは、既定のログ出力を拡張してレポートの生成を容易にするための 1 つの考え方です。
- パッケージを実行するたびにログを記録する親テーブルを作成する。この親テーブルにはパッケージを実行するたびに 1 行だけを記録し、ExecutionID を使用して、Integration Services ログ記録テーブルの子レコードにリンクします。各パッケージの最初に SQL 実行タスクを使用して、この新しい行を作成し、開始時刻を記録します。次に、パッケージの終了時に別の SQL 実行タスクを使用して、終了時刻、実行時間、状態でその行を更新します。
- データ フローに監査情報を追加する。監査変換を使用して、各行を作成または変更したパッケージの実行に関する情報を、データ フロー内の行に追加できます。監査変換は、PackageName や ExecutionInstanceGUID など、9 種類の情報を作成します。詳細については、「監査変換」を参照してください。監査を目的として各行に含めるカスタム情報があれば、派生列変換を使用して、その情報をデータ フロー内の行に追加できます。詳細については、「派生列変換」を参照してください。
- 行数データのキャプチャを検討する。。行数情報用に別のテーブルを作成することを検討します。このテーブルでは、パッケージ実行の各インスタンスを ExecutionID で識別します。行数変換を使用して、データフロー内の重要な時点の行数を一連の変数に保存します。データ フローの終了後、SQL 実行タスクを使用してこの一連の値をテーブルの行に挿入すると、後の分析やレポートに役立ちます。
実行時検証問題のトラブルシューティング
パッケージ内の前のタスクの実行が完了するまで、データ ソースに接続できなかったり、パッケージの一部を検証できなかったりすることがあります。Integration Services には、そのような検証エラーを回避するのに役立つ、次の機能があります。
- パッケージが読み込まれるときには無効になっているパッケージ要素の DelayValidation プロパティを構成する。構成が無効になっているパッケージ要素の DelayValidation を True に設定できます。これによってパッケージが読み込まれるときの検証エラーを防ぎます。たとえば、SQL 実行タスクが実行時に作成するまで存在しないテーブルを、データ フロー タスクで使用する場合があります。DelayValidation プロパティはパッケージ ベル、またはパッケージに含まれている個別のタスクやコンテナのレベルで有効にできます。
DelayValidation プロパティはデータ フロー タスク上で設定できますが、個別のデータ フロー コンポーネントでは設定できません。個別のデータ フロー コンポーネントの ValidateExternalMetadata プロパティを false に設定すると、同様の効果を得ることができます。ただし、このプロパティの値が false の場合、コンポーネントは外部データ ソースのメタデータに変更が加えられても認識しません。ValidateExternalMetadata プロパティを trueに設定すると、特にパッケージでトランザクションを使っている場合、データベース内でのロックに起因するブロッキング問題を回避するのに役立ちます。
実行時の権限の問題のトラブルシューティング
SQL Server エージェントを使用して配置済みパッケージの実行を試みたときにエラーが発生した場合は、エージェントが使用しているアカウントに必要な権限がない可能性があります。SQL Server エージェント ジョブから実行されるパッケージをトラブルシューティングする方法の詳細については、Microsoft サポート技術情報の記事「SQL Server エージェント ジョブ ステップから SSIS パッケージを呼び出すとき、SSIS パッケージが実行されません。」を参照してください。パッケージを SQL Server エージェント ジョブから実行する方法の詳細については、「SQL Server エージェントを使用したパッケージの実行のスケジュール設定」および「SQL Server エージェント ジョブを使用してパッケージを実行する方法」を参照してください。
64 ビット問題のトラブルシューティング
32 ビット モードまたは 32 ビット サーバーでは正常に実行されるパッケージが、64 ビット サーバーでエラーになる場合は、次の一般的な問題を検討してください。詳細については、「64 ビット コンピュータ上での Integration Services の使用上の注意」を参照してください。
- 一部のデータ プロパイダは 64 ビットプラットフォームに対応していない。特に、Microsoft Jet OLE DB Provider は Excel データ ソースや Access のデータ ソースへの接続に必要ですが、64 ビット バージョンはありません。
- スクリプトを 64 ビット コンピュータで使用する場合、スクリプトを 32 ビット コンピュータで事前コンパイルする必要がある。スクリプト タスクやスクリプト コンポーネントを使用するパッケージでは、PreCompile プロパティを True に設定する必要があります。
- DTS パッケージは 64 ビット モードでは実行できない。パッケージで DTS 2000 パッケージ実行タスクを使用して SQL Server 2000 データ変換サービス (DTS) パッケージを実行している場合、このパッケージは 32 ビット モードで実行する必要があります。DTS パッケージの 64 ビット ランタイム サポートはありません。
説明のないエラーのトラブルシューティング
説明のない Integration Services エラーが発生した場合は、「Integration Services のエラーおよびメッセージのリファレンス」にあるエラーの説明をエラー番号で検索できます。この時点ではトラブルシューティング情報は含まれていません。
参照
処理手順
概念
パッケージのパフォーマンスのトラブルシューティング
Integration Services サービスのトラブルシューティング
ヘルプおよび情報
変更履歴
リリース | 履歴 |
---|---|
2006 年 12 月 12 日 |
|