マイクロソフトでは、Microsoft SQL Server 2008 の修正を 1 つのダウンロード可能なファイルとして配布しています。 修正は累積的であるため、新しいリリースの修正には、以前のリリースの SQL Server 2008 の修正に含まれていたすべての修正プログラムおよびセキュリティ更新プログラムが含まれます。
現象
たとえば次のようなシナリオを考えてみます。
SQL Server 2005 または SQL Server 2008 で SQL Server Integration Services (SSIS) パッケージを実行する。
SSIS パッケージには、データ フロー タスクが含まれています。
使用可能なメモリが少ないコンピューターで SSIS パッケージを実行する。 メモリ不足状態は、一時的または断続的に発生する場合があります。
SSIS パッケージを実行すると、メモリが少ないため、データ バッファーがディスクに書き込まれます。
このシナリオでは、次の現象の 1 つ以上が発生する可能性があります。
現象 1
データがデータ フローの宛先に到達する前に、データが破損しています。 データ フローの宛先のデータが予期せず次の値になっていることがわかります。
- "" : NULL、空白、または空の文字列値
- 0 : ゼロ値または、より高い精度とスケールを持つゼロ値。
- 0-0-0 0:0:0 : 破線のゼロの日付値
注: この現象が発生しても、エラー メッセージは表示されません。
現象 2
次のいずれかのデータ型変換のエラー メッセージが表示されます。
エラー メッセージ 1
注
DTS_E_OLEDBERROR。 OLE DB エラーが発生しました。 エラー コード: 0x80004005
OLE DB レコードを使用できます。 ソース: "Microsoft SQL Native Client" Hresult: 0x80004005 説明: "キャスト指定の文字値が無効です"。
エラー メッセージ 2
注
DTS_E_COLUMNSTATUSERROR。 入力 "OLE DB Destination Input" (IDNumber) の入力列 "ColumnName" (IDnumber) でエラーが発生しました。 返された列の状態は "データ値が指定した型をオーバーフローしたため、変換に失敗しました。" でした。
現象 3
制約違反に関する次のエラー メッセージが表示されます。
注
DTS_E_OLEDBERROR。 OLE DB エラーが発生しました。 エラー コード: 0x80004005
OLE DB レコードを使用できます。 ソース: "Microsoft SQL Native Client" Hresult: 0x80004005 説明: "ステートメントは終了しました。"。
OLE DB レコードを使用できます。 ソース: "Microsoft SQL Native Client" Hresult: 0x80004005 説明: "PRIMARY KEY 制約 'PrimaryKeyName' に違反しています。 オブジェクト 'TableName' に重複キーを挿入できません。"。
また、メモリが使用可能なときに同じ SSIS パッケージを再度実行すると、この問題は発生しません。
原因
データ フロー エンジンにメモリ不足の通知が送信されると、データ フロー エンジンはデータ バッファーを一時的にディスクに書き込みます。 この問題は、データ フロー エンジンがデータ バッファーをディスクに書き込むときに、データ値が誤って NULL または 0 に設定されるために発生します。 そのため、データ フロー エンジンがデータ バッファーからデータを読み取り、データ フローの宛先にデータを書き込むと、データ フローの宛先には破損したデータ値が含まれます。 また、データ値が破損していると、データ型変換エラーや制約違反エラーが発生する可能性もあります。
解決策
累積的な更新プログラムの情報
SQL Server 2008 のリリース バージョン
この問題の修正プログラムは、累積的な更新プログラム 6 で最初にリリースされました。 SQL Server 2008用のこの累積的な更新プログラムパッケージを入手する方法の詳細についてはをクリックして以下「サポート技術情報」(Microsoft サポート技術情報)資料を参照。
971490 SQL Server 2008 の累積的な更新プログラム パッケージ 6 注: ビルドは累積的であるため、新しくリリースされた修正プログラムには、それ以前の SQL Server 2008 更新プログラムのリリースに含まれていたすべての修正プログラムおよびセキュリティ更新プログラムが含まれています。 この修正プログラムが含まれている最新リリースの修正の適用を検討することを推奨します。 詳細については、次のマイクロソフト サポート技術情報番号をクリックしてください。
956909 SQL Server 2008 のリリース以降にリリースされた SQL Server 2008 のビルド
SQL Server 2008 Service Pack 1 (SP1)
重要: SQL Server 2008 Service Pack 1 (SP1) を実行している場合は、この修正プログラムをインストールする必要があります。
この問題の修正プログラムは、SQL Server 2008 Service Pack 1 の累積的な更新プログラム 3 でもリリースされています。 この累積的な更新プログラム パッケージの関連情報を参照するには、以下の「サポート技術情報」 (Microsoft サポート技術情報) をクリックしてください。
971491 SQL Server 2008 Service Pack 1 の累積的な更新プログラム パッケージ 3 注: ビルドは累積的であるため、新しくリリースされた各修正プログラムには、以前の SQL Server 2008 更新プログラムのリリースに含まれていたすべての修正プログラムおよびセキュリティ更新プログラムが含まれています。 マイクロソフトでは、この修正プログラムを含む最新の修正プログラム リリースを適用することを検討することをお勧めします。 詳細については、次のマイクロソフト サポート技術情報番号をクリックしてください。
970365 SQL Server 2008 Service Pack 1 以降にリリースされた SQL Server 2008 ビルド
Microsoft SQL Server 2008 の修正プログラムは、特定の SQL Server Service Pack 用に作成されます。 SQL Server 2008 Service Pack 1 のインストールには、SQL Server 2008 Service Pack 1 修正プログラムを適用する必要があります。 既定では、1 つの SQL Server Service Pack で提供されているすべての修正プログラムは、次の SQL Server Service Pack に含まれています。
SQL Server 2005 Service Pack 2 (SP2)
重要: SQL Server 2005 Service Pack 2 を実行している場合は、この修正プログラムをインストールする必要があります。
この問題の修正プログラムは、SQL Server 2005 Service Pack 2 の累積的な更新プログラム 15 で最初にリリースされました。 この累積的な更新プログラム パッケージの関連情報を参照するには、以下の「サポート技術情報」 (Microsoft サポート技術情報) をクリックしてください。
972510 SQL Server 2005 Service Pack 2 の累積的な更新プログラム パッケージ 15 注: ビルドは累積的であるため、新しくリリースされた修正プログラムには、それ以前の SQL Server 2005 更新プログラムのリリースに含まれていたすべての修正プログラムおよびセキュリティ更新プログラムが含まれています。 マイクロソフトでは、この修正プログラムを含む最新の修正プログラム リリースを適用することを検討することをお勧めします。 詳細については、次のマイクロソフト サポート技術情報番号をクリックしてください。
937137 SQL Server 2005 Service Pack 2 以降にリリースされた SQL Server 2005 ビルド
Microsoft SQL Server 2005 の修正プログラムは、特定の SQL Server Service Pack 用に作成されます。 SQL Server 2005 Service Pack 2 のインストールには、SQL Server 2005 Service Pack 2 修正プログラムを適用する必要があります。 既定では、1 つの SQL Server Service Pack で提供されているすべての修正プログラムは、次の SQL Server Service Pack に含まれています。
SQL Server 2005 Service Pack 3 (SP3)
重要: SQL Server 2005 Service Pack 3 を実行している場合は、この修正プログラムを使用する必要があります。
この問題の修正プログラムは、SQL Server 2005 Service Pack 3 の累積的な更新プログラム 5 でもリリースされています。 この累積的な更新プログラム パッケージの関連情報を参照するには、以下の「サポート技術情報」 (Microsoft サポート技術情報) をクリックしてください。
972511 SQL Server 2005 Service Pack 3 の累積的な更新プログラム パッケージ 5 注: ビルドは累積的であるため、新しくリリースされた修正プログラムには、以前の SQL Server 2005 更新プログラムのリリースに含まれていたすべての修正プログラムおよびセキュリティ更新プログラムが含まれています。 マイクロソフトでは、この修正プログラムを含む最新の修正プログラム リリースを適用することを検討することをお勧めします。 詳細については、次のマイクロソフト サポート技術情報番号をクリックしてください。
960598 SQL Server 2005 Service Pack 3 以降にリリースされた SQL Server 2005 ビルド
Microsoft SQL Server 2005 の修正プログラムは、特定の SQL Server Service Pack 用に作成されます。 SQL Server 2005 Service Pack 3 のインストールには SQL Server 2005 Service Pack 3 修正プログラムを適用する必要があります。 既定では、1 つの SQL Server Service Pack で提供されているすべての修正プログラムは、次の SQL Server Service Pack に含まれています。
回避策
この問題を回避するには、メモリ不足の状態を解決します。 この問題をトリガーできる最小メモリ量は、コンピューターによって異なります。 一般に、使用可能なメモリは 32 MB から 64 MB の間です。 したがって、64 MB を超える使用可能なメモリを SSIS に割り当てるようにサーバーを構成することをお勧めします。
メモリ不足の通知イベントを通知する使用可能なメモリの既定の量は、約 4 ギガバイト (GB) あたり 32 MB から、4 GB あたり最大 64 MB です。 詳細については、次の MSDN (Microsoft Developer Network) Web サイトを参照してください。
https://msdn.microsoft.com/library/aa366541(vs.85).aspx
ただし、ビジー状態の運用サーバーでは使用可能なメモリが大きく変動する可能性があるため、この問題を完全に防止することは困難です。さらに、記憶力は、通常の活動の中でさまざまな理由で減少する可能性があります。 この問題の頻度を減らすには、次のいずれかの方法を使用します。
方法 1
コンピューターに物理メモリを追加します。
方法 2
SQL Server のインスタンスを実行しているコンピューターとは別のコンピューターで SSIS パッケージを実行します。
方法 3
SQL Server のインスタンスを実行している同じコンピューターで SSIS パッケージを実行する場合は、インスタンスの最大サーバー メモリ構成オプションを小さく設定して、コンピューターで使用可能なメモリを増やします。
方法 4
Data Flow タスクを含む SSIS パッケージを実行するときに大量のメモリを消費するストレスの多いアプリケーションを終了します。
方法 5
SSIS パッケージとデータ フロー タスクを並列ではなく連続して実行して、メモリ使用量の累積消費を削減します。
方法 6
「詳細」セクションの「SSIS のメモリ消費量を監視する方法」サブセクションで説明されている方法を使用して、メモリ不足状態のトラブルシューティングを行い、SSIS のメモリ使用を最適化します。
状態
Microsoft は、これが "適用対象" セクションに記載されている Microsoft 製品の問題であることを確認しました。
追加情報
現象の詳細
現象 1
データ フローの宛先で破損したデータ値が見つかると、破損したデータ値はデータ型によって異なる表現で表示されることがあります。 たとえば、次のデータ型は、破損したデータ値をさまざまな表現で表現したとします。
| DT_STR = "" | NULL、空白、または空の文字列値 |
|---|---|
| DT_I4 = 0 | 整数データ型の 0 の値 |
| DT_UI1 = 0 | 符号なし整数データ型の 0 の値 |
| DT_NUMERIC = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | 精度とスケールが高いゼロ値。 |
| DT_DBTIMESTAMP = 0-0-0 0:0:0 | 破線のゼロの日付値 |
ほとんどのシナリオでは、すべての列とすべての行のデータ値が破損しているか、列と行のかなりの部分のデータ値が破損しています。 さらに、データが破損した場合でも、宛先に到達する行の合計数は、通常、宛先で予想される行数と一致します。 これは、バッファーの問題が原因で発生します。 実行中のデータ フロー タスクのバッファー全体またはバッファーのセットが影響を受ける可能性があります。 バッファー サイズと行あたりのデータ サイズによっては、各バッファーに数百行が含まれている場合があります。
一部の高度な設計では、データ フロー タスクのすべての列が影響を受けるわけではありません。 式、派生列変換、ルックアップ変換などの変換を使用してデータ フロー タスク内でデータを操作する場合、データの一部の列が想定される値と同じままになることがあります。 これは、SSIS がデータ フロー タスク中に破損したデータを変換された値に置き換えるためです。
他の高度な設計では、一部の行が失われる場合があります。 SSIS データフローの設計ではデータの方向が柔軟であるため、予期しないデータ値が設計の条件列で認識されると、破損したデータが予期しない宛先にルーティングされる可能性があります。 条件分割変換やルックアップ変換などの変換を使用すると、変換で破損したデータ値が再ルーティングされると、一部の行が失われる場合があります。 たとえば、ルックアップ変換で、破損した行が参照データと一致しない場合、行は破棄されます。
現象 2
データ型によっては 0 は有効な値ではないため、OLE DB プロバイダーがデータ型を変換すると、データ型変換エラーが発生することがあります。 場合によっては、データ型のオーバーフローが発生することもあります。 たとえば、datetime データ型の列には "0-0-0 0:0:0" という値が設定されています。 OLE DB プロバイダーはゼロを SQL Native Client OLE DB プロバイダーの有効な日付値に書式設定できないため、この無効な値により、この種類のエラーが発生します。
現象 3
重複する主キー値がデータ フローの宛先に挿入されると、制約違反が発生する可能性があります。 たとえば、整数型の列に複数のゼロ値が挿入されたり、varchar データ型の列に複数の NULL 値が挿入されたりします。 同様に、重複するキー値がターゲット テーブルに挿入されると、外部キー関係に違反する可能性があります。
この問題が発生しているかどうかを判断する方法
次のインジケーターを使用して、この問題が発生しているかどうかを判断できます。
SQL Server:SSIS Pipelineperformance オブジェクトの Buffers スプール カウンターを監視して、メモリ リソース不足通知が原因でデータ フロー エンジンがデータ バッファーをディスクに書き込むかどうかを判断できます。
また、データ フロー タスクの BufferTempStoragePath プロパティで指定されている一時ディレクトリにあるDTS.tmp ファイルを調べることもできます。 DTS.tmp ファイルのサイズが大きくなっている場合は、データ フロー エンジンがデータ バッファーをディスクに書き込んでいます。
既存の SSIS パッケージにこの問題があるかどうかを判断する場合、SSIS パッケージのデータ フロー タスクにマルチキャスト変換を追加して、データのコピーをフラット ファイルのコピー先に転送して、観察を容易にすることができます。
使用可能なメモリが著しく少ないことを示すもう 1 つの指標は、次のメッセージが SSIS パッケージ ログに記録されることです。
注
DTS_I_CANTRELIEVEPRESSURE バッファー マネージャーは、システムの仮想メモリ不足を検出しましたが、バッファーをスワップ アウトできませんでした。 8 個のバッファーが考慮され、8 個がロックされました。 十分なメモリがインストールされていないため、パイプラインで使用できるメモリが不足しているか、他のプロセスがメモリを使用しているか、またはあまりにも多くのバッファーがロックされています。
SSIS のメモリ消費量を監視する方法
メモリを監視して、さまざまな SQL Server Integration Services ランタイム プロセスのピーク使用量を測定し、最大メモリ使用量を計算します
パフォーマンス モニター内の Process オブジェクトのプライベート バイト カウンターを使用して、DTExec.exe プロセスや DTSHost.exe プロセスなど、さまざまな SQL Server Integration Services Runtime プロセスのピーク メモリ使用量を監視します。
SQL Server Integration Services パッケージの実行中に、パフォーマンス モニターで Process オブジェクトのプライベート バイト カウンターの最大値を見つけます。 複数のパッケージが並列で実行されるシナリオを考えてみましょう。 このシナリオでは、最大メモリ使用量を取得するために、実行中のすべてのプロセスの最大値を加算します。
外部プロセスを監視してピークと谷を見つける
パフォーマンス モニター内の Process オブジェクトのプライベート バイト カウンターを使用して、SQL Server サービスおよび SSIS サービス以外のプロセスのピーク メモリ使用量を監視します。 SQL Server Integration Services のメモリ不足の原因となる可能性のあるピーク使用時間を探します。 たとえば、複数のユーザーがリモート デスクトップ プロトコル (RDP) を使用してサーバーに接続するピーク時間や、バックアップ ソフトウェアが実行されている時間帯を考慮します。
SQL Server のメモリ使用量を監視して、山と谷を見つける
最近の Errorlog ファイルに "ロックされたページを使用しています" というメッセージが最近の Errorlog ファイルに存在しない場合、Sqlservr.exe プロセスのプライベート バイト カウンターは、SQL Server サービスによって消費されるメモリの量を示すことができます。
最近のエラー ログ ファイルにメッセージが存在する場合は、SQL Server: メモリ マネージャのパフォーマンス オブジェクトのサーバー メモリの合計 (KB) カウンターを使用して、SQL Server バッファ プールのメモリ使用量を測定します。 さらに、Sqlservr.exe プロセスのプライベート バイト カウンターを使用して、バッファ プール (MemToLeave) の外部にあるメモリ割り当てを見つけます。 合計サーバー メモリ (KB) 値と MemToLeave 値の 2 つの値の合計は、SQL Server の合計メモリ消費量の適切な見積もりです。
次のいずれかに該当する場合、パフォーマンス モニターとタスク マネージャーには、これらのバッファ プール ページで消費されたメモリが表示されません。
- [メモリ内のページのロック] ユーザー権利が SQL Server サービスのスタートアップ アカウントに割り当てられている場合。
- AWE メモリが有効な場合。
注: SQL Server サービスのスタートアップ アカウントに [メモリ内のページのロック] ユーザー権利が割り当てられておらず、AWE が有効になっていない場合、Sqlservr.exe プロセスのプライベート バイト カウンターには、さまざまなSQL Server インスタンスの SQL Services によって消費されるメモリが示されている必要があります。
Windows で使用可能なメモリの最小値を監視する
Windows で使用可能なメモリを監視するには、次のいずれかの方法を使用します。
パフォーマンス モニターで利用可能なメガバイト カウンター。
タスク マネージャーの [パフォーマンス] タブの [物理メモリ (MB) - 空き値]。
注: 一部のオペレーティング システムでは、[物理メモリ (MB) - 空き] は [物理メモリ (K) – 使用可能] と表示されています。
参考資料
MainPipeClass.BufferTempStoragePath プロパティの詳細については、次の MSDN (Microsoft Developer Network) Web サイトを参照してください。
https://msdn.microsoft.com/library/microsoft.sqlserver.dts.pipeline.wrapper.mainpipeclass.buffertempstoragepath.aspx
メモリ構成オプションを使用してサーバーのパフォーマンスを最適化する方法の詳細については、次の MSDN (Microsoft Developer Network) Web サイトを参照してください。
https://msdn.microsoft.com/library/aa178118(sql.80).aspx
パフォーマンス モニター カウンターの詳細については、次のマイクロソフト Web サイトを参照してください。
https://technet.microsoft.com/library/cc768048.aspx
マルチキャスト スコープの使用方法の詳細については、次のマイクロソフト Web サイトを参照してください。
https://technet.microsoft.com/library/cc758554(ws.10).aspxSQL Server の増分サービス モデルの関連情報を参照するには、以下の「サポート技術情報」 (Microsoft サポート技術情報) をクリックしてください。
935897 報告された問題に対する修正プログラムを提供する SQL Server チームの増分サービス モデル (ISM) について
SQL Server の更新プログラムの命名方式の関連情報を参照するには、以下のサポート技術情報番号をクリックしてください。
822499 Microsoft SQL Server ソフトウェア更新プログラム パッケージの新しい名前付けスキーマ
ソフトウェア更新プログラムに関する用語の関連情報を参照するには、以下のサポート技術情報番号をクリックしてください。
824684 Microsoft のソフトウェア更新プログラムの説明で使用される一般的な用語の解説