SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

Windows 11 / Windows Server 2022 で NVMe にインストールした OS のシステムドライブに SQL Server のインストール時にエラーが発生する件について

leave a comment

先日公開された 4 KB を超えるシステム ディスク セクター サイズに関連するエラーのトラブルシューティング で解説が行われていますが、Windows 11 / Windows Server 2022 に対して SQL Server をインストールしようとするとエラーが発生するという事象が報告されています。

SQL ServerでのWindows で Windows 11 / Windows Server 2022 でサポートされる SQL Server については記載されていますが、各 OS がサポートする SQL Server をインストールしようとした場合に、サポートされるバージョンの組み合わせでも環境によっては、インストール時にエラーが発生するケースがあるというのが、現在発生している問題となります。

これについては Answers の SQL Server 2019 – Windows 11 でも報告が行われており、どのような事象が発生するかについては、上述の情報だけでなく、こちらのフォーラムの投稿も参考になるのではないでしょうか。

私は気づいておらず、教えていただいた情報となるのですが、日本語のフォーラムでも SQL Server 2012 インストール失敗 FMVF77F3B で話題になっていたようですね。

エラーの内容としては、インストール時に次のような画面のエラーが発生し、SQL Server のバイナリの配置はある程度完了しているのですが、SQL Server のサービスが起動しないという事象が発生します。

のエラーが発生した場合、SQL Server のインストールは完全には完了しておらず、この状態でエラーを回避するように設定しても動作しないため、一度アンインストールをする必要があります

image

SQL Server データベース エンジン サービス インスタンス機能 のインストール エラー
データベース エンジンの復旧ハンドルの待機に失敗しました。考えられる原因については、SQL Server エラー ログを参照してください。

この際、OS のイベントログのアプリケーションには、次のようなエラーが出力されているようです。

同期 IO に戻す必要のある不均衡なログ IO が 256 個あります。現在の IO はファイル C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\master.mdf にあります。

sqlservr (776,P,98) SoftwareUsageMetrics-Api:  ファイル システムは、C:\Windows\system32\LogFiles\Sum\ のログ ファイルに、サポート対象外のセクターサイズ 32768 があるため、代わりに 4096 のセクター サイズを使用することを報告しました。これにより、トランザクションの持続性が失われる可能性があります。

SQL Server の ERRORLOG には、「同期 IO に戻す~」のメッセージの英語表記の情報が出力されています。

There have been 256 misaligned log IOs which required falling back to synchronous IO.  The current IO is on file C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\master.mdf.

 

冒頭で紹介したドキュメントに記載されていますが、SQL Server がサポートするのは、512 バイト / 4 KB のネイティブセクターサイズとなっており、次の技術情報で詳細が記載されています。

本エラーは、SQL Server がサポートするネイティブセクターのサイズ以外が指定されたドライブに対して、SQL Server をインストールをしようとしたためにエラーが発生しているというのが根本原因となるようです。

 

問題が発生する環境の例

私が使用している環境では、次の環境でエラーが発生することを確認しています。

  • OS は Windows 11 / Windows Server 2022 を使用
    • 私は、Windows Server 2022 でのみ確認しているのですが、挙動としては Windows 11 も同様です。
  • NVMe のストレージ (今回は NVMe の M.2 の SSD) に OS をインストールしている
  • 上記の構成の OS ストレージ (C ドライブ) に SQL Server をインストール

Docker の SQL Server や、Hyper-V のような仮想環境に SQL Server をインストールしている環境ですと、Windows 11 / Windows Server 2022 を使用していてもエラーは発生しないと思います。

SQL Server だけでなく、SQL Server ベースの環境で発生しますので、LocalDB を使用している場合も該当するようです。

問題が発生するかについては、冒頭で紹介したドキュメントに記載がされているのですが、インストールをしようとしているドライブをターゲットとして次のコマンドを実行することで確認ができます。

fsutil fsinfo sectorinfo <Drive Letter>

例 : fsutil fsinfo sectorinfo c:

 

「PhysicalBytesPerSectorForAtomicity」が、512 or 4096 となっていない場合に、インストール時にエラーが発生するかと思います。

私の環境では「32768」(32KB) となっており、この環境ではエラーが再現しました。

image

「PhysicalBytesPerSectorForAtomicity」が SQL Server でサポートをしていないサイズ (512 / 4096 以外) が設定されているドライブに対して SQL Server をインストールしようとすると発生するのが今回のエラーとなるようです。

  • Windows 10 / Windows Server 2019 で NVMe を使用しているドライブ
  • Hyper-V や、Azure VM のような仮想化基盤で実行している環境
    • Windows 11 / Windows Server 2022 を仮想化基盤上で実行している場合を含む

では、4096 となっているようで、これらの環境であればエラーは発生しません。

最新の OS をインストールしている物理環境で SQL Server をインストールしようとした場合に、遭遇するエラーが発生する可能性が高いのかもしれませんね。

 

回避方法

本投稿のエラーが発生している場合、現時点では、3 種類の回避方法が提示されています。

  1. エラー発生時に指定したドライブ以外で「PhysicalBytesPerSectorForAtomicity」が 512 / 4096 になっているドライブにインストールする
  2. レジストリを変更してインストール
    • 現時点で、新規インストール時に発生しているエラーを回避するためには、この方法がを実施する必要がありそうです。
  3. トレースフラグ 1800 を指定する
    • 今まで起動していた SQL Server が OS のインプレースアップグレード後に起動しなくなった場合に利用できそうですが、新規インストール時のエラーについては、本方法では回避できなさそうでした。

手元の環境で確認したところ、現時点では、「2.レジストリを変更してインストール」を使用した方法が、エラーが発生するドライブにインストールをする場合の回避方法となりそうでした。

「3. トレースフラグ 1800 を指定する」については、新規インストールではなく、Windows 10 / Windows Server 2019 で既に SQL Server をインストールしている環境を、最新の OS にインプレースアップグレードする場合の対応となり、新規インストールではこの方法を使用することはできないようでした。

 

1. エラー発生時に指定したドライブ以外で「PhysicalBytesPerSectorForAtomicity」が 512 / 4096 になっているドライブにインストールする

私が保有している環境で、NVMe が 2 スロット搭載しているものがあり、両スロットに、M.2 の SSD を搭載しているのですが、C ドライブではない、データ領域として使用している NVMe の SSD については、「PhysicalBytesPerSectorForAtomicity」が 4096 となっていました。

OS をインストールしていない NVMe のスロットの SSD であれば、SQL Server のインストールに対応しているセクターサイズになっている可能性がありますので、上述の fsutil fsinfo を実行してみてセクターを確認することで、他のドライブにインストールすることで回避ができる可能性があります。

 

2. レジストリを変更

ドキュメント内に記載されている次のコマンドを実行してレジストリを変更し、OS を再起動します。

REG ADD "HKLM\SYSTEM\CurrentControlSet\Services\stornvme\Parameters\Device" /v "ForcedPhysicalSectorSizeInBytes" /t   REG_MULTI_SZ /d "* 4095" /f

 

レジストリを設定して、OS を再起動すると、「PhysicalBytesPerSectorForAtomicity」が Windows 10 / Windows Server 2019 と同様に「4096」として認識が行われます。

image

この状態で、SQL Server をインストール (または、一度アンインストールして再インストール) すると、SQL Server のインストールが正常に完了します。

image

 

3.トレースフラグ 1800 を指定する

「SQL Server 構成マネージャー」を起動して、トレースフラグ 1800 (-T1800) を起動時のパラメーターとして追加します。

この方法ですが、SQL Server のインストールが失敗した後にも設定を行うことができるのですが、SQL Server のインストールに失敗した場合、SQL Server のインストールが最後まで完了していません。そのため、エラー発生後に本トレースフラグを設定しても、SQL Server のサービスの起動後、すぐにエラーで終了してしまうという事象が発生していました。

トレースフラグの設定については、

  • Windows 10 / Windows Server 2019 のような、初期状態でインストール可能な環境から、Windows 11 / Windows Server 2022 にインプレースアップグレードした後に、SQL Server が起動しなくなった場合に設定
  • レジストリを変更しインストールを完了させた後に、レジストリの設定を元に戻し、以降はトレースフラグの設定で対応

というようなケースで使用するものとなるのではないでしょうか。

トレースフラグは、SQL Server 構成マネージャーを起動 -> SQL Server のサービス -> SQL Server (MSSQLSERVER) のプロパティから「起動時のパラメーター」から設定でき、次の画像のように「-T1800」を追加します。

image

トレースフラグ (TF) を追加した後に、SQL Server のサービスを起動すると、「PhysicalBytesPerSectorForAtomicity」が 512 / 4096 になっていない環境でも、SQL Server のサービスを起動することができます。

トレースフラグ 1800 については、DBCC TRACEON – トレース フラグ (Transact-SQL) で解説がされており、次の用途でも使用されるものとなります。

image

 

これらの 3 種類の方法を使用することで、アップグレード後 / 新規インストール時に SQL Server でエラーが発生し、起動しない環境に対して、SQL Server を導入 / 起動することができるかと思います。

 

SQL Server のどのような処理で起動がエラーとなっているのか

SQL Server のサービス起動時にエラーとなっている箇所は、次のメッセージの箇所が該当しているようです。

There have been 256 misaligned log IOs which required falling back to synchronous IO.  The current IO is on file C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\master.mdf.

SQL Server の起動を行う際には、master データベースをオープンする必要がありますが、サポートされていないセクターサイズが使用されている場合、master データベースをオープンすることができずエラーとなっているようです。

 

セクターサイズに起因する他の問題

SQL Server でセクターサイズに起因する問題については、いくつか報告されている事象があります。

今回のような 4KB を超えるセクターサイズではなく、可用性環境で 512バイト / 4096 バイトの環境が混在した場合のパフォーマンス問題となります。

Azure の IaaS を使用した場合は、4KB となるようで、オンプレミスと Azure の ハイブリッドの DR 環境を構築した場合などの注意点となりそうですね。

他には、SQL Server の 512e (AFT) の対応も昔ありましたね。こちらは、「fsutil fsinfo ntfsinfo <ドライブ文字>」を実行して確認することができる、「セクターあたりのバイト数」「物理セクターあたりのバイト数」の話になりますので、今回とは異なる設定ですが。

 

fsutil の各オプションの出力結果の内容については、次の情報から確認できるようです。

Share

Written by Masayuki.Ozawa

12月 26th, 2021 at 11:55 pm

Leave a Reply