排查与系统磁盘扇区大小大于 4 KB 相关的错误

本文提供了在 Windows 11 和 Windows Server 2022 上安装或启动 SQL Server 实例期间排查错误的解决方案。 本文适用于所有已发布版本的 SQL Server。

本文中讨论的错误与大于 4 KB 的系统磁盘扇区大小有关。

适用于:SQL Server所有版本

症状

方案 #1:可以在Windows 11设备上安装任何版本的SQL Server。 然后,SQL Server的数据库引擎服务组件看到类似于以下消息的错误:

Feature: Database Engine Services 
Status: Failed 
Reason for failure: An error occurred during the setup process of the feature. 
Next Step: Use the following information to resolve the error, uninstall this feature, and then run the setup process again. 
Component name: SQL Server Database Engine Services Instance Features 
Component error code: 0x851A001A 
Error description: Wait on the Database Engine recovery handle failed. Check the SQL Server error log for potential causes. 

方案 #2:可以在Windows 10设备上安装任何版本的 SQL Server。 然后,将设备上的 OS 升级到 Windows 11。 尝试在Windows 11设备上启动SQL Server时,服务无法启动,在SQL Server错误日志中,你会注意到类似于以下内容的条目:

2021-11-05 23:42:47.14 spid9s 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. 

方案 #3:可以在Windows 10设备上安装任何版本的 SQL Server。 然后,将设备上的 OS 升级到 Windows 11。 尝试在Windows 11设备上启动SQL Server时,服务无法启动。 在SQL Server错误日志中,你会注意到类似于以下内容的条目:

Faulting application name: sqlservr.exe, version: 2019.150.2000.5, time stamp: 0x5d8a9215 
Faulting module name: ntdll.dll, version: 10.0.22000.120, time stamp: 0x50702a8c 
Exception code: 0xc0000005 
Fault offset: 0x00000000000357ae 
Faulting process id: 0x1124 
Faulting application start time: 0x01d7bf67449d262c 
Faulting application path: C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Binn\sqlservr.exe 
Faulting module path: C:\Windows\SYSTEM32\ntdll.dll 

方案 #4:在Windows 11设备上安装 LocalDB。 安装失败,在SQL Server错误日志中,你会注意到类似于以下内容的条目:

2021-12-15 23:25:04.28 spid5s      Cannot use file 'C:\Users\Administrator\AppData\Local\Microsoft\Microsoft SQL Server Local DB\Instances\TestInstance\master.mdf' because it was originally formatted with sector size 4096 and is now on a volume with sector size 16384. Move the file to a volume with a sector size that is the same as or smaller than the original sector size.

在Windows 11应用程序事件日志中,可以看到类似于以下内容的条目:

Message            : Windows API call WaitForMultipleObjects returned error code: 575. Windows system error message is: {Application Error}
                     The application was unable to start correctly (0x%lx). Click OK to close the application.
                     Reported at line: 3621.
Source             : SQLLocalDB 11.0

注意

对于手动安装的 SQL Server 实例或应用程序安装的 LocalDB 实例,可能会遇到前面方案中提到的故障。

方案 #5: 如果尝试使用大于 4 KB 的扇区大小,会看到以下错误消息:

Error: 5179, Severity: 16, State: 1.
Cannot use file 'data file path', because it is on a volume with sector size 8192. SQL Server supports a maximum sector size of 4096 bytes. Move the file to a volume with a compatible sector size.

原因

在服务启动期间,SQL Server开始数据库恢复过程,以确保数据库一致性。 此数据库恢复过程的一部分涉及在尝试打开系统和用户数据库文件之前对基础文件系统进行一致性检查。

在运行 Windows 11 的系统上,某些新的存储设备和设备驱动程序公开的磁盘扇区大小大于支持的 4 KB 扇区大小。

发生这种情况时,由于文件系统不受支持,SQL Server将无法启动,因为SQL Server当前支持 512 字节和 4 KB 的扇区存储大小。

可以通过运行 命令确认遇到此特定问题:

fsutil fsinfo sectorinfo <volume pathname>

例如,若要分析 E: 卷,请运行以下命令:

fsutil fsinfo sectorinfo E:

查找以字节为单位返回的值 PhysicalBytesPerSectorForAtomicityPhysicalBytesPerSectorForPerformance,如果它们不同,请保留 最大的 值以确定磁盘扇区大小。 值 4096 表示扇区存储大小为 4 KB。

此外,请注意文件系统和存储扇区大小支持的 Windows 支持策略。 有关详细信息,请参阅 Windows 中 4 KB 扇区硬盘驱动器的 Microsoft 支持策略 一文。

注意

没有与大于 4 KB 的扇区大小兼容的SQL Server的已发布版本。 有关详细信息,请参阅 SQL Server 中的硬盘驱动器扇区大小支持边界一文。

解决方案

Microsoft 目前正在调查此问题。

请考虑以下解决方案 之一

  • 如果此系统上有多个驱动器,则可以在安装完SQL Server后为数据库文件指定其他位置。 查询命令时 fsutil ,请确保驱动器反映支持的扇区大小。 SQL Server当前支持 512 字节和 4096 字节的扇区存储大小。

  • 可以添加注册表项,这将导致 Windows 11 及更高版本的行为类似于Windows 10。 这会强制将扇区大小模拟为 4 KB。 若要添加ForcedPhysicalSectorSizeInBytes注册表项,请使用注册表编辑器或运行命令,如 PowerShell 作为管理员部分中所述。 添加注册表项后,必须重新启动设备,才能使此更改生效。

    重要

    本部分包含介绍如何修改 Windows 注册表的步骤。 但是,注册表修改不当可能会出现严重问题。 因此,请务必严格按照这些步骤操作。 为了加强保护,应先备份注册表,再进行修改。 如果出现问题,可以还原注册表。 有关如何备份和还原注册表的详细信息,请参阅 如何在 Windows 中备份和还原注册表 一文。

    注册表编辑器

    1. 导航到 Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\stornvme\Parameters\Device
    2. “编辑 ”菜单上,指向“ 新建”,然后选择“ 多字符串值”。 将其命名为 ForcedPhysicalSectorSizeInBytes
    3. 修改新值,在 中 * 4095键入 。 选择“ 确定” 并关闭注册表编辑器。

    以管理员身份的命令提示符

    1. 添加密钥。

      REG ADD "HKLM\SYSTEM\CurrentControlSet\Services\stornvme\Parameters\Device" /v "ForcedPhysicalSectorSizeInBytes" /t   REG_MULTI_SZ /d "* 4095" /f
      
    2. 验证密钥是否已成功添加。

      REG QUERY "HKLM\SYSTEM\CurrentControlSet\Services\stornvme\Parameters\Device" /v "ForcedPhysicalSectorSizeInBytes"
      

    PowerShell 作为管理员

    1. 添加密钥。

      New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\stornvme\Parameters\Device" -Name   "ForcedPhysicalSectorSizeInBytes" -PropertyType MultiString        -Force -Value "* 4095"
      
    2. 验证密钥是否已成功添加。

       Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\stornvme\Parameters\Device" -Name   "ForcedPhysicalSectorSizeInBytes"
      
  • 可以通过指定跟踪标志 1800 开始SQL Server。 有关详细信息,请参阅 DBCC TRACEON。 默认情况下不启用此跟踪标志。 跟踪标志 1800 强制SQL Server使用 4 KB 作为所有读取和写入操作的扇区大小。 在物理扇区大小大于 4 KB 的磁盘上运行SQL Server时,使用跟踪标志 1800 将模拟本机 4 KB 驱动器,这是SQL Server支持的扇区大小。

  • 请改为在可用的Windows 10设备上安装SQL Server。

更多信息

Windows 11本机 NVMe 驱动程序已更新为包括 NVMe 存储设备直接报告的实际扇区大小。 这是完成的,而不是依赖于从文件系统驱动程序中模拟的信息。

Windows 10驱动程序不会报告物理存储的源扇区大小。

改进的Windows 11驱动程序忽略了常见 NVMe 存储设备正在使用的仿真。 例如, fsutil 显示 8 KB 或 16 KB 的扇区大小,而不是模拟 Windows 所需的 4 KB 扇区大小。

下表提供了操作系统报告的扇区大小的比较。 此示例演示使用同一存储设备Windows 10和Windows 11之间的差异。 对于 和 PhysicalBytesPerSectorForPerformance的值PhysicalBytesPerSectorForAtomicity,Windows 10显示 4 KB,Windows 11显示 16 KB。

的示例输出 fsutil fsinfo sectorinfo <volume pathname>

Windows 10 Windows 11
LogicalBytesPerSector : 512 LogicalBytesPerSector : 512
PhysicalBytesPerSectorForAtomicity : 4096 PhysicalBytesPerSectorForAtomicity : 16384
PhysicalBytesPerSectorForPerformance : 4096 PhysicalBytesPerSectorForPerformance : 16384
FileSystemEffectivePhysicalBytesPerSectorForAtomicity : 4096 FileSystemEffectivePhysicalBytesPerSectorForAtomicity : 4096
Device Alignment : Aligned (0x000) Device Alignment : Aligned (0x000)
Partition alignment on device : Aligned (0x000) Partition alignment on device : Aligned (0x000)
No Seek Penalty No Seek Penalty
Trim Supported Trim Supported
Not DAX capable Not DAX capable
Not Thinly-Provisioned Not Thinly-Provisioned

另请参阅