Fix it now
Microsoft publishes -550 as JET_errDatabaseDirtyShutdown: the database was not shut down cleanly, and recovery must be run first. That is expected after a crash and is not damage. The trouble starts when the logs recovery needs are missing, which is what -543 and -528 are telling you.
Get-MailboxDatabase -Status | Format-List Name,Mounted,EdbFilePath,LogFolderPath
Get-MailboxDatabaseCopyStatus * | Format-Table Name,Status,CopyQueueLength,ReplayQueueLength
- Copy the database file, the whole log folder and the checkpoint file to separate storage before running anything against them.
- If the database has a healthy copy in a DAG, stop here and use it: activate the healthy copy, then suspend and reseed the damaged one with Update-MailboxDatabaseCopy. That is the documented route and it returns all the data.
- With no copy, establish whether every required log generation is present in the log folder, with the same log prefix the database expects.
- If they are all there, run a soft recovery with the engine utility, then mount with Mount-Database DB01.
- If any generation is missing, stop. Restore from backup. Recovery cannot invent a log that does not exist, and a hard repair is not the answer to a missing one.
Microsoft requires a copy to be suspended before Update-MailboxDatabaseCopy will run, and -DeleteExistingFiles removes only the log files it checks for: it fails if other files are present.
If the database mounts and stays mounted, you are done. If recovery will not complete, the next section explains exactly what the engine is refusing and why.
Why it happens
The database engine writes ahead to the transaction log. A change is committed to the log first and written into the database file lazily afterwards, sometimes much later. A clean shutdown means every committed change was flushed into the file and the database needs no log at all. A dirty shutdown means it still does. Microsoft’s wording for -550 is that the database was not shut down cleanly, and that a recovery must first be run to properly complete database operations for the previous shutdown.
One naming detail causes real confusion and is worth settling. Older material calls -550 JET_errDatabaseInconsistent. Microsoft’s current error list marks that name obsolete and replaced by JET_errDatabaseDirtyShutdown, both being the same number. If a tool or an old runbook says inconsistent, it means dirty shutdown; there is no second condition hiding behind the older name.
The two companion codes are about the logs, not the database. -543 is JET_errRequiredLogFilesMissing, the required log files for recovery are missing. -528 is JET_errMissingLogFile, the current log file is missing. Both almost always have a human cause: logs deleted to free space on a full volume, a backup that truncated while the database was offline, or a restore that put back the database file without its matching log set.
The server crashed or lost power while the store was running
You have this one if A dirty shutdown with the full required log range present, and an unplanned restart in the System log.
- Stop the Information Store service if the database is not already dismounted, so nothing holds the files open.
- Run soft recovery with the log prefix, log path and database path spelled out explicitly, against the copy you took.
- Confirm the state has changed to clean shutdown with no required logs, then
Mount-Database DB01.
If recovery fails with a file access error rather than a consistency error, something is holding the files: stop the backup agent, check vssadmin list writers for a stuck writer, and confirm the antivirus exclusions cover these paths.
Logs were deleted to free space on a full volume
You have this one if -543, naming generations that are simply not in the folder, and a log volume that recently ran out of space.
- Check the backup for the missing generations. Many backup products retain the logs they truncated, and restoring only those files back into the folder is enough for recovery to finish.
- If they are unrecoverable, restore the complete backup set, database and logs together, and replay forward from there.
- In a DAG, reseed the copy from a healthy one instead of fighting it.
- Then fix the reason the volume filled, which is nearly always a backup that stopped truncating.
Only the database file was restored
You have this one if A restored database file sitting alongside logs from a later point in time, and recovery refusing to proceed.
- Restore the matching log set from the same backup, not whichever logs happened to be on the volume.
- Run recovery against the restored set in its own folder, well away from production paths.
- If the backup product performs its own recovery as part of the restore, let it, rather than running engine tools over its work.
A restore that returns a database without its logs is a defect in the backup job. Fix the job, because otherwise you will find out the same way again.
A required log file is present but damaged
You have this one if Every generation appears to be in the folder, but recovery stops partway with a complaint about the log stream.
- Walk the log sequence with the engine utility and find where the chain breaks.
- Recovery can only replay up to the break, so treat a damaged generation as a missing one from that point onwards.
- Restore or reseed rather than repairing. A truncated replay leaves a consistent but older database, which is a legitimate outcome only if you know exactly how much you are giving up.
Full reference
The codes and what Microsoft actually publishes
| Code | Symbolic name | Microsoft’s description |
|---|---|---|
-550 |
JET_errDatabaseDirtyShutdown | The database was not shutdown cleanly. A recovery must first be run to properly complete database operations for the previous shutdown |
-543 |
JET_errRequiredLogFilesMissing | The required log files for recovery are missing |
-528 |
JET_errMissingLogFile | The current log file is missing |
-513 |
JET_errLogGenerationMismatch | The name of the log file does not match the internal generation number |
-515 |
JET_errInvalidLogSequence | The timestamp in the next log does not match the expected timestamp |
JET_errDatabaseInconsistent |
Obsolete | Marked obsolete and replaced by JET_errDatabaseDirtyShutdown; same number, superseded name |
A note on the engine utility
Microsoft no longer publishes a current reference page for the Exchange database utility, so this article does not present its switches as documented syntax. The tool ships with Exchange and prints its own mode list when run without arguments. Confirm the mode you want there, run it against the copy you took rather than the original, and note that header inspection and soft recovery are different modes with different arguments. Everything in the fix layer above uses cmdlets that are documented.
Never delete transaction log files by hand to free space on a log volume. They are the only route back to a consistent database after a crash. Deleting them turns a routine recovery into a restore from backup, and where the backup is also missing, into permanent data loss.
Reading the state before deciding anything
| What you find | What to do |
|---|---|
| Clean shutdown, no logs required, still will not mount | Not this problem. Look at file paths, file locks and permissions instead |
| Dirty shutdown, all required generations present | Soft recovery. Routine, non-destructive, nothing lost |
| Dirty shutdown, one or more generations missing | Restore or reseed. Recovery cannot proceed past the gap |
| Checkpoint missing but logs intact | Run recovery anyway. It starts from the oldest available log |
| Log prefix in the folder differs from the one the database expects | You are looking at the wrong log set for this database |
The checkpoint file matters less than people assume. It records how far replay has already reached. If it is missing, recovery starts from the oldest log available, which takes longer and changes nothing about the outcome. A missing checkpoint is not a reason to reach for repair tools.
Why the DAG route is usually the right one
If another member holds a healthy copy of the same database, activating it returns every mailbox immediately and reduces this to a reseed you can schedule. Microsoft’s documented sequence is to suspend the copy, update it with Update-MailboxDatabaseCopy naming a source server that holds a passive copy, and resume. That is faster than any recovery, it does not touch the damaged files, and it leaves you a copy you can examine afterwards at leisure.
After it mounts
- Run a full Exchange-aware backup immediately and confirm the logs truncate as a result. Until they do, you are one full volume away from a repeat.
- Check every copy’s status and queue lengths, because a copy that is failed or suspended blocks truncation on the active server.
- Find out why the shutdown was dirty. A power event is one answer; a storage timeout that keeps recurring is another and needs its own work.
- Confirm the antivirus exclusions cover the database, log and checkpoint paths on every member.
Every code this article covers
| Code | What it points at | Source |
|---|---|---|
-550 |
JET_errDatabaseDirtyShutdown: the database was not shut down cleanly, and a recovery must be run first to complete the previous shutdown’s operations | Microsoft Learn |
-543 |
JET_errRequiredLogFilesMissing: the required log files for recovery are missing | Microsoft Learn |
-528 |
JET_errMissingLogFile: the current log file is missing | Microsoft Learn |
JET_errDatabaseInconsistent |
An obsolete symbolic name for -550. Microsoft’s current list marks it replaced by JET_errDatabaseDirtyShutdown; it is the same condition under an older name | Microsoft Learn |
JET_errRequiredLogFilesMissing |
The symbolic name Microsoft publishes for -543 | Microsoft Learn |
Confirm the fix worked
- The database header state reads clean shutdown with no required logs.
Get-MailboxDatabase -Statusreports the database mounted, and a mailbox on it opens in a client.- Every copy of the database reports healthy with queues near zero.
- A full backup completes and the logs truncate as a result.
Questions people ask about this
Does fixing this cost anything?
No. Soft recovery uses a tool that ships with Exchange, and reseeding a copy uses cmdlets that ship with it too. The only situation with a cost attached is having neither logs nor a backup, and what you need then is a recovery service rather than software.
Is JET_errDatabaseInconsistent a different error from -550?
No. Microsoft’s current error list marks JET_errDatabaseInconsistent as obsolete and replaced by JET_errDatabaseDirtyShutdown. Same number, same condition, older name.
How long does recovery take?
It scales with the number of log generations to replay and the speed of the storage, not with the size of the mailboxes. A backlog built up over days can run for hours, and interrupting it puts you back where you started.
Can I force the database to mount as it is?
No. The state is checked before anything else happens, and the restriction exists for good reason. Recover it, restore it, or activate a healthy copy.
Should I delete the checkpoint file?
Only if it is genuinely stale and pointing at logs that no longer exist, in which case recovery starts from the oldest log available. It does nothing for a missing generation.
