現象
Windows UpdateにてWindows Internal Database Service Pack 4 for x64 Edition (KB2463332)のインストールが失敗する。エラーコードは643。
原因
(同じKB2463332でもMicrosoft SQL Server 2005 Service Pack 4となっているものには通常当てはまらない。)
%SystemRoot%\SYSMSI以下にあるWindows Internal DatabaseのディレクトリがNTFS圧縮されているとService Packのインストーラがインストールを拒否するため。
対処法
%SystemRoot%\SYSMSI以下のNTFS圧縮を解除する。
(追記)……とだけ書いておいたところ、この記事を見た直後に「%SystemRoot%\SYSMSI以下のNTFS圧縮を解除する」という検索語で検索する人が続出。これはおそらくこの文の意味がわからなかったということではないかと思われ。
具体的な手順としては、エクスプローラ等で通常C:\Windows\Sysmsiフォルダ(Windowsをインストールしたドライブが違うときはC:をその別のドライブに置き換えて読むこと)のプロパティを開き、[詳細設定]をクリックして出てくる画面の[内容を圧縮してディスク容量を節約する]チェックボックスを外して[OK]をクリックする。それでもし[属性変更の確認]画面が出てきたときは[変更をこのフォルダー、サブフォルダーおよびファイルに適用する]を選択して[OK]。
所感
Windows Internal Databaseは実質SQL Serverです。で、SQL Serverのデータファイルは圧縮しないほうがパフォーマンスがいいので、SQL ServerのService PackはSQL Serverのディレクトリが圧縮されていると、その旨のエラーを出して終了する仕様になっています。Windows Internal DatabaseのService Packも実質SQL ServerのService Packと同等の内容で、そのためにこのような現象が起こるのだと思われます。Windows Updateでは一切のメッセージが抑止された状態でインストールが進むので、エラーの中身がわかりづらいわけですね。
システムドライブは容量がひっ迫しがちであって、圧縮されている状況は一般的ですから、Windows Internal Database向けService Packとしては、本来、圧縮されていてもエラーにならないように仕様変更したものをリリースすべきでした。システムドライブが圧縮されている状況でテストしなかったのでしょうね。
もっとも、そもそもディレクトリが圧縮されていたらエラーにするというSQL Server Service Packのインストーラの仕様自体やりすぎなのだと思われます。パフォーマンスは悪いながらも動くには動くのであって、ユーザがそれを承知で動かしているならインストーラが文句を言う筋合いのものではないのですから。
しかもさらに問題なのは、この仕様がドキュメント化されていない(!)ということ。だから同じMicrosoftの社員であろうところのWindows Internal Database Service Packの担当者(たぶんSQLSPの担当者とは違う)すらこの仕様を把握できなかったわけです。Microsoftはこの手のドロナワ式仕様追加が昔からやたらと多い会社で、もうこれはこの会社の体質なんでしょうねえ。
追記
同様の原因によりWindows Update エラー 6d9eで失敗するケースもあるらしいことが記事として掲載されているようなんですが、うちではそういうエラー番号ではありませんでした。まあ、この記事で説明されているのはWindows Internal Database扱いのService Packではないし、SP3ですからね。
リンクをたどると、圧縮されているとエラーになるという問題について説明したサポートエンジニアのMSDNのブログ記事がありますが、こんなところに書き散らさないできちんとknowledge base(サポートオンライン)に登録すべきではないでしょうか。MSはどこまでだらしなくなるのでしょう。ドキュメントに対する態度は年々ひどくなってます。