When an Exchange database won't mount, a DAG copy fails or eseutil stops, the real reason is usually a negative ESE (JET) error code such as -1018, -528 or -550. This quick reference lists 39 of them with the JET_err name, the meaning from Microsoft's Extensible Storage Engine error code list, the usual cause on Exchange Server SE, 2019 and 2016, and the first thing to check. Press Ctrl+F, type your code in decimal or hex, and follow the guide link where there is one.
Codes in this quick reference
-550 JET_errDatabaseDirtyShutdown: database not shut down cleanly; recovery must run firstMount-Database / eseutil-528 JET_errMissingLogFile: the current log file (for example E00.log) is missingMount-Database (ec=-528) / eseutil-543 JET_errRequiredLogFilesMissing: log files required for recovery are missingeseutil /r / Mount-Database-509 JET_errMissingPreviousLogFile: the log file the checkpoint points to is missingeseutil /r / Mount-Database-501 JET_errLogFileCorrupt: a transaction log file is corrupteseutil / Application log (ESE)-515 JET_errInvalidLogSequence: the next log's timestamp doesn't match the expected oneeseutil /r / Mount-Database-513 JET_errLogGenerationMismatch: a log's file name doesn't match its internal generationeseutil /r-514 JET_errBadLogVersion: the log version isn't compatible with this ESE versioneseutil /r
+ 31 more codes in the tables below.
How to read these codes#
ESE (the Extensible Storage Engine, or JET) is the engine under every Exchange mailbox database. In Microsoft's reference, zero means success, positive values are warnings and negative values are errors. You'll meet them in:
- eseutil: a run ends with
Operation terminated with error -550plus the JET_err name instead ofOperation completed successfully. - Application log: ESE, ExchangeStoreDB and MSExchangeRepl events, often with the hex form too:
The read operation will fail with error -1018 (0xfffffc06). - Mount errors:
MapiExceptionJetErrorMissingLogFile: Unable to mount database. (hr=0x80004005, ec=-528). If it only saysec=1108, look in the diagnostic context forStoreEcvalues starting with0xFFFF. - DAG copies: the
ErrorMessageof a Failed or FailedAndSuspended copy inGet-MailboxDatabaseCopyStatus. - Backup products: job logs often pass the ESE code through; VSS and writer errors are in the VSS and backup error codes quick reference.
The hex form is the 32-bit two's complement of the negative number, so PowerShell converts it either way. Read the database header first: State (Clean or Dirty Shutdown), Log Required and the signatures.
[Convert]::ToInt32('fffffc06', 16) # -1018
'{0:x8}' -f -528 # fffffdf0
# ESE, store and replication errors in the last 24 hours
Get-WinEvent -FilterHashtable @{LogName='Application'; ProviderName=@('ESE','ExchangeStoreDB','MSExchangeRepl'); Level=2; StartTime=(Get-Date).AddDays(-1)} |
Format-Table TimeCreated,ProviderName,Id -AutoSize
eseutil /mh "D:\DB01\DB01.edb"These are engine-level errors; logical problems inside a mailbox are a job for New-MailboxRepairRequest.
Watch out: before eseutil /r or /p on a standalone database, copy the .edb, the logs and the checkpoint somewhere safe. Hard repair (/p) throws away pages it can't read and is the last resort; afterwards, plan to move every mailbox to a new database.
Recovery and transaction log codes#
These stop a mount or a soft recovery. Never delete logs to get past them: read the header, then the log set. In a DAG, the quickest fix for a bad passive copy is usually a reseed (FailedAndSuspended guide).
Log replay and mount#
| Code | Meaning | Usual cause | First check |
|---|---|---|---|
-550JET_errDatabaseDirtyShutdown0xfffffdda | Database not shut down cleanly; recovery must run first | Crash, power loss, a full log volume, or an .edb copied without its logs | eseutil /mh: State and Log Required; with those logs present, mount or run eseutil /r. Guide |
-528JET_errMissingLogFile0xfffffdf0 | The current log file (for example E00.log) is missing | Deleted by hand, quarantined by antivirus, or the log folder moved | LogFolderPath and the antivirus quarantine; eseutil /ml E00. Guide |
-543JET_errRequiredLogFilesMissing0xfffffde1 | Log files required for recovery are missing | Required logs deleted to free space, or a database restored without them | Match Log Required from eseutil /mh against the files present; recover them or restore. Guide |
-509JET_errMissingPreviousLogFile0xfffffe03 | The log file the checkpoint points to is missing | Early logs removed while the database still needed them | eseutil /mk E00.chk for the checkpoint generation; eseutil /ml E00 for gaps |
-501JET_errLogFileCorrupt0xfffffe0b | A transaction log file is corrupt | A storage fault, a crash mid-write, or a file scanner touching the log | eseutil /ml E00 names the bad log; DAG: reseed the copy; single server: restore. Guide |
-515JET_errInvalidLogSequence0xfffffdfd | The next log's timestamp doesn't match the expected one | Two log sequences mixed in one folder, such as old logs copied back after a restore | eseutil /ml E00; move stray logs to another folder (don't delete them) |
-513JET_errLogGenerationMismatch0xfffffdff | A log's file name doesn't match its internal generation | Log files renamed or copied under the wrong name | eseutil /ml shows the generation inside each file; restore the original names |
-514JET_errBadLogVersion0xfffffdfe | The log version isn't compatible with this ESE version | Logs replayed by an ESE build other than the one that wrote them, such as an eseutil copied from another Exchange version or a non-Exchange ESE tool | Run eseutil.exe from the server's own %ExchangeInstallPath%Bin |
-530JET_errBadLogSignature0xfffffdee | A log file has a bad signature | A log from another database or an earlier log set is in the folder | Compare the signature in eseutil /ml with Log Signature in eseutil /mh |
-539JET_errDatabaseLogSetMismatch0xfffffde5 | The database doesn't belong with this set of log files | Wrong log folder, or a restored .edb mixed with the server's current logs | Compare signatures (eseutil /mh and /ml); point /l at the right folder |
-1216JET_errAttachedDatabaseMismatch0xfffffb40 | The logs reference a database that is missing or doesn't match | The .edb was moved, renamed or replaced after the logs were written | Put the original .edb back at its EdbFilePath before replaying. Guide |
-533JET_errCheckpointCorrupt0xfffffdeb | The checkpoint file is missing or corrupt | E00.chk damaged by a crash or a storage fault | eseutil /mk E00.chk; admins report that recovery runs once the damaged .chk is moved aside (keep a copy), provided every log in the Log Required range is present |
Log volume, sector size and instance errors#
| Code | Meaning | Usual cause | First check |
|---|---|---|---|
-510JET_errLogWriteFail0xfffffe02 | Writing to the log file failed | The log volume is full, offline or read-only | Free space and volume state; ESE event 413 just before it. Guide |
-529JET_errLogDiskFull0xfffffdef | The log disk is full | Logs not truncating (no successful Exchange-aware backup), or a big move or import | LastFullBackup in Get-MailboxDatabase -Status; free space without deleting needed logs. Guide |
-1092JET_errInstanceUnavailableDueToFatalLogDiskFull0xfffffbbc | Instance unusable after the log disk filled during a critical operation | The log volume ran completely out of space | Free space, then mount: log replay runs automatically. Guide |
-1090JET_errInstanceUnavailable0xfffffbbe | The instance hit a fatal error and can't be used | An earlier I/O, log or disk-full error on that database | Fix the first ESE error logged before it, then mount |
-546JET_errLogSectorSizeMismatch0xfffffdde | Log sector size doesn't match the volume's sector size | Logs moved or restored to a disk with a different sector size (for example 512-byte versus 4K sectors) | fsutil fsinfo sectorinfo E: on both volumes; keep logs on matching disks |
-614JET_errCheckpointDepthTooDeep0xfffffd9a | Too many log generations between the checkpoint and the current log | The database can't flush changes fast enough: storage latency or a huge write burst | Database disk latency and health; what was writing heavily (moves, imports) |
Page corruption and disk I/O codes#
The engine read back something other than what it wrote. Fix the storage path as well as the data, or the code returns.
| Code | Meaning | Usual cause | First check |
|---|---|---|---|
-1018JET_errReadVerifyFailure0xfffffc06 | Page checksum mismatch on a database page | Storage, controller, driver or firmware fault, logged as ESE event 474 | DAG: page patching, then reseed the damaged copy; single server: eseutil /k and restore. Guide |
-1019JET_errPageNotInitialized0xfffffc05 | A database page that should hold data is blank | Storage lost a write, logged as ESE event 476 | Same path as -1018. Guide |
-1022JET_errDiskIO0xfffffc02 | Windows returned a disk I/O error for the file | A failing disk or path, SAN or iSCSI drops, or a filter driver | System log disk errors at that time; vendor diagnostics. Guide |
-1119JET_errReadLostFlushVerifyFailure0xfffffba1 | Lost flush: an earlier write is missing from the page on disk | Storage acknowledged a write that never reached the disk (cache, controller or firmware) | Treat it like -1018: fix storage first, then reseed or restore |
-1206JET_errDatabaseCorrupted0xfffffb4a | Not a database file, or a corrupt database | A damaged header, a truncated copy, or a tool pointed at the wrong file | eseutil /mh; check the path and file size; reseed or restore |
-1220JET_errCatalogCorrupted0xfffffb3c | Corruption in the database catalog (its internal list of tables) | Storage damage to metadata pages | Reseed or restore; hard repair only as a last resort |
-1414JET_errSecondaryIndexCorrupted0xfffffa7a | A secondary index is corrupt; the database must be defragmented | Damaged index pages | Move mailboxes to a new database, or rebuild offline with eseutil /d (white space guide) |
-1526JET_errLVCorrupted0xfffffa0a | Corruption in a long-value tree (where large column values are stored) | Storage corruption | DAG: reseed; otherwise move mailboxes to a new database (raise BadItemLimit) or restore |
-1069JET_errVersionStoreOutOfMemory0xfffffbd3 | Version store out of memory, even after cleanup | Long-running transactions or write bursts outpacing cleanup; slow storage | Preceding ESE warnings; storage latency; what was running (moves, imports, agents) |
File access, path and version codes#
Usually the tool or the environment, not damage: a locked file, a wrong path or the wrong eseutil.
| Code | Meaning | Usual cause | First check |
|---|---|---|---|
-1032JET_errFileAccessDenied0xfffffbf8 | The file is locked or in use | File-level antivirus or a backup agent, or eseutil run on a mounted database | Antivirus exclusions; dismount before eseutil. Guide |
-1215JET_errDatabaseSharingViolation0xfffffb41 | Another database instance is using this database | eseutil started while the database is mounted, or two eseutil sessions on one file | Dismount-Database first; close other eseutil windows |
-1811JET_errFileNotFound0xfffff8ed | A file wasn't found at the path given | A typo or an unquoted path with spaces in the eseutil command | Get-MailboxDatabase DB01 | fl EdbFilePath,LogFolderPath; quote paths |
-1808JET_errDiskFull0xfffff8f0 | No space left on the disk | Database volume full, or eseutil /d or /p writing its temporary database to a full drive | Free space; put eseutil's temporary database on a volume with room |
-1008JET_errDatabaseFileReadOnly0xfffffc10 | A read-only database file was opened for read/write | Read-only attribute on a restored or copied .edb | attrib on the file; clear the flag with attrib -r |
-1213JET_errPageSizeMismatch0xfffffb43 | The database page size doesn't match the engine | A tool whose engine expects a different page size from the database's (Exchange databases use 32 KB pages), typically a non-Exchange ESE utility | Use the Exchange eseutil.exe |
-1209JET_errInvalidDatabaseVersion0xfffffb47 | This ESE version is incompatible with the database | An eseutil or ese.dll (for example one used by a restore tool) from a different build than the one that wrote the database | Use eseutil from the same or a newer build; restore tools: match ese.dll (Veeam Explorer guide) |
Backup, restore and shadow copy codes#
These surface in backup job logs and the Application log when a VSS backup of a database fails.
| Code | Meaning | Usual cause | First check |
|---|---|---|---|
-526JET_errInvalidBackup0xfffffdf2 | Incremental backup refused: circular logging is enabled | Circular logging switched on (often to free disk) while incremental or differential jobs run | Get-MailboxDatabase | ft Name,CircularLoggingEnabled; run a full backup. Guide |
-560JET_errMissingFullBackup0xfffffdd0 | Incremental attempted without a previous full backup | A new database or copy that has never had a full backup | Run a full backup; LastFullBackup should then show a date |
-612JET_errLogReadVerifyFailure0xfffffd9c | Checksum error in a log file during backup | A damaged log on disk | eseutil /ml E00; DAG: reseed this copy; then take a new full backup |
-2402JET_errOSSnapshotTimeOut0xfffff69e | The VSS shadow copy timed out | The snapshot didn't complete in time: slow storage or a slow VSS provider | vssadmin list writers; provider and storage latency (VSS codes) |
-2403JET_errOSSnapshotNotAllowed0xfffff69d | Shadow copy refused: a backup or recovery is already in progress | Overlapping backup jobs on the same database, or a backup during recovery | Job schedules: one backup per database at a time |
How to verify a fix#
- Header: after a manual replay,
eseutil /mhshowsState: Clean ShutdownandLog Required: 0-0. - Mounted:
Mount-Database DB01succeeds andGet-MailboxDatabase DB01 -StatusreportsMounted : True. - DAG: every copy is
Healthy(the active oneMounted), queue lengths are near zero, the content index is Healthy andTest-ReplicationHealthpasses every check. - Quiet event log: the
Get-WinEventquery above returns no new ESE errors for that database over the next day. - Backup: a full Exchange-aware backup completes,
LastFullBackupupdates and the logs truncate. - Storage: for corruption codes, no new disk errors appear in the System log.
Get-MailboxDatabase DB01 -Status | Format-List Name,Mounted,LastFullBackup,LastIncrementalBackup
Test-ReplicationHealth -Identity EX02
Get-MailboxDatabaseCopyStatus DB01 | Format-Table Name,Status,CopyQueueLength,ReplayQueueLength,ContentIndexState -AutoSizeReferences#
- Extensible Storage Engine Error Codes (Microsoft Learn): the source of the code names and meanings in the tables
- Restore data using a recovery database in Exchange Server (Microsoft Learn)
- Recovery databases in Exchange Server (Microsoft Learn)

