How to fix Error 3999 on Windows Server 2025 / Windows 11

Troubleshooting Guide: SQL Server Error 3999 – Failed to Flush Commit Table to Disk

Why This Error Happens

Error 3999 occurs when SQL Server’s In-Memory OLTP engine cannot persist the commit table (part of the transaction log/checkpoint process for memory-optimized filegroups) to disk. This is typically caused by underlying storage I/O failures, insufficient disk space on the volume hosting the memory-optimized filegroup, file system corruption, or the SQL Server service account lacking write permissions to the container files. It can also surface when the storage subsystem returns a hardware-level error (such as a stale file handle or disk timeout) that propagates up through the database engine.

Step-by-Step Resolution Guide

Step 1: Review the SQL Server Error Log for the Underlying Error Code

  • Open SQL Server Management Studio (SSMS) and navigate to Management > SQL Server Logs, or check the raw log file at C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\Log\ERRORLOG.
  • Locate the accompanying error number referenced in the message (error %d) — this is usually a Windows OS error code (e.g., 1450 “Insufficient system resources” or 112 “Disk full”).
  • Cross-reference the OS error code using net helpmsg <error_code> in an elevated Command Prompt to get a plain-language description.

Step 2: Verify Disk Space and Storage Health on the Memory-Optimized Filegroup Volume

  • Run the following query to identify the physical path of the memory-optimized filegroup container:
SELECT name, physical_name FROM sys.database_files WHERE type_desc = 'FILESTREAM';
  • Check free space on that volume using Get-PSDrive in PowerShell or File Explorer; ensure at least 15-20% free space is available.
  • Run chkdsk <drive>: /f /r during a maintenance window if disk corruption is suspected, and review Windows Event Viewer (System log) for Disk or NTFS warnings.

Step 3: Confirm Service Account Permissions on the Database Container Folder

  • Navigate to the folder housing the memory-optimized filegroup (commonly under D:\SQLData\<DBName>\<FilegroupName>).
  • Right-click the folder, select Properties > Security, and confirm the SQL Server service account (e.g., NT Service\MSSQLSERVER or a custom domain account) has Full Control.
  • If permissions are missing, grant them via icacls "D:\SQLData\<DBName>" /grant "NT SERVICE\MSSQLSERVER":(OI)(CI)F.

Step 4: Restart the SQL Server Service and Force a Manual Checkpoint

  • Restart the SQL Server service via services.msc or run Restart-Service MSSQLSERVER in an elevated PowerShell session.
  • Once the database is back online, manually force a checkpoint to retest the flush operation:
USE [YourDatabaseName];
CHECKPOINT;
  • Monitor the ERRORLOG immediately after to confirm Error 3999 does not reoccur.

Step 5: Rebuild or Restore the Affected Database if Corruption Persists

  • If the error persists after confirming disk space, permissions, and hardware health, run DBCC CHECKDB('YourDatabaseName') WITH NO_INFOMSGS, ALL_ERRORMSGS to check for underlying corruption.
  • If corruption is confirmed in the memory-optimized filegroup, restore the database from the last known good backup, as memory-optimized data/delta files generally cannot be repaired in place.

Alternative or Verification Steps

  • Verify the fix by inserting/updating a test row in a memory-optimized table and running CHECKPOINT again — confirm no new entries for Error 3999 appear in the ERRORLOG.
  • As an alternative diagnostic path, enable Extended Events with the sqlserver.error_reported event filtered on error number 3999 to capture the exact query and session context the next time the failure occurs.