Windows インストーラーでイベント 1004/1001 が発生し、SQL Server 関連コンポーネントが繰り返し再構築される現象 及び 回避策 について
高原 伸城
Support Escalation Engineer
皆さん、こんにちは。 Microsoft SQL Server/Microsoft Azure SQL Database サポートチームの 高原 です。
今回は、Windows インストーラーでイベント 1004/1001 が発生し、SQL Server 関連コンポーネントが繰り返し再構築される現象 及び 回避策について紹介します。
Windows Update で .NET Framework の更新プログラムを適用後、イベントログ (アプリケーション) に、Windows インストーラのイベント 1004/1001 が繰り返し発生し、該当サーバーの CPU 使用率が高くなるという現象が報告されています。
[1004] 製品 '{7842C220-6E9A-4D5A-AE70-0E138271F883}'、機能 'SDK_Full'、コンポーネント '{5459C63B-8203-43FD-9C96-9D643FD17EF0}' の検出に失敗しました。リソース 'D:\ ' がありません。[1001]製品 '{7842C220-6E9A-4D5A-AE70-0E138271F883}'、機能 'SDK_FNS' の検出は、コンポーネント '{30DC367C-77F2-4EB1-8661-7B2CC3714758}' を要求するときに失敗しました |
上記のメッセージは、 Windows インストーラーで該当コンポーネントの自動修復が行われた際、D ドライブ が存在しないために、繰り返し自動修復が行われている場合に発生するメッセージとなります。
本事象は、Windows の更新プログラム適用時に .NET アセンブリのネイティブ イメージの作成処理がキューに格納された状態となり、その後バックグラウンドとして実行される .NET Runtime Optimization Service (mscorsvw.exe) によりネイティブ イメージの作成が施行され、その際にファイルの欠損が検知されたことにより、Windows インストーラー の自動修復が繰り返し行われていたことに起因していることが報告されています。
[対処方法]
Windows インストーラー の自動修復が繰り返される要因として、以前インストール時に利用していた D ドライブを参照しにいくものの、 D ドライブが存在しないことに起因していることが報告されています。
そのため、以下の手順を実施し、手動で該当コンポーネントをインストール下さい。
手順
-------------------------------------------------------
1. イベントログに出力されているドライブ (今回の例では D:\) に SQL Server のメディアを用意します。
2. コマンドプロンプトより、イベントログに出力されている製品のGUID (今回は、{7842C220-6E9A-4D5A-AE70-0E138271F883}) を指定し、下記のコマンドを実行します。
+ コマンド
Msiexec /f イベントログに出力されている製品のGUID
[例]
Msiexec /f {7842C220-6E9A-4D5A-AE70-0E138271F883}
※ 本コマンド実行時後に、OS の再起動を求められる場合があるため、メンテナンス時間帯などに実施ください。
[暫定対処策]
上記に記載した対処方法をすぐに実施することが出来ない場合、以下の何れの何れかの方法を実施することで、一時的に本事象の発生を回避することが出来ます。
1. ネイティブ イメージタスク(ngen) の無効化
2. MsiInstaller サービスの無効化
1. ネイティブ イメージタスク(ngen) の無効化
----------------------------------
1. スタート メニューなどからタスクスケジューラを選択して起動します。
2. 画面左側のツリーから、[タスク スケジューラ (ローカル)] – [タスク スケジューラ ライブラリ] – [Microsoft] – [Windows] – [.NET Framework] を順に選択して、ノードを展開します。
3. [無効化] ボタンを押下して、タスクをすべて無効状態にします。
4. [トリガー] 列に表示のあるタスクについてはプロパティからトリガーを編集し、[有効] のチェックを外して [OK] を選択します。
[補足]
.NET Framework を使用して開発されたアセンブリ (DLL) は、コンピューターが直接実行できる機械語 (ネイティブ コード) ではなく、MSIL という中間言語で構成されています。
.NET Framework アプリケーションでは、中間言語で作成されたアセンブリを、アプリケーションの実行時にネイティブ コードに実行時コンパイル (JIT : Just in Time コンパイル) して利用します。
ネイティブイメージ タスクは、この JIT コンパイルの処理コストを低減するため、中間言語として提供されている .NET Framework のアセンブリを、コンピューターのアイドル時間を利用して、あらかじめネイティブ コードにコンパイルして利用可能な状態にしておくためのタスクです。
ネイティブイメージタスクの詳細については、以下のドキュメントを参照ください。
ネイティブイメージ タスク
(英語原文) </en-us/dotnet/framework/tools/ngen-exe-native-image-generator#native-image-task>
(日本語訳) <https://msdn.microsoft.com/ja-jp/library/6t9t5wcf(v=vs.110).aspx#ネイティブ イメージ タスク>
なお、.NET Framework を使用したアプリケーションの動作上、ネイティブ イメージ を利用することは必須ではないため、無効化してもアプリケーションが動作しなくなるなどの問題は発生しません。しかし、実行時コンパイルが必要になることでパフォーマンスに影響を与える可能性があります。
2. Windows Installer サービスの無効化
----------------------------------
以下のレジストリを変更後、OS の再起動を実施することで、Windows Installer (MsiInstaller) サービスが無効となり、Windows インストーラー の自動修復が行われなくなります。
---
レジストリ :
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\msiserver
値の名前 : Start
値の種類 : REG_DWORD
値のデータ : 4 (既定値は 3 “手動” です )
---
[注意]
Windows Installer を無効にすると、Windows Installer で動作する事を前提に作成されたインストール パッケージや、アプリケーションが正しく動作しなくなります。
サービスを無効にする場合は、試験環境で十分な検証を実施した上で、一時的な回避策として検討ください。
※ 本Blogの内容は、2017年7月現在の内容となっております。