Skip to content

Est. 2011ยทMicrosoft Partner 7033487ยทDelivery under 3 minยทSupport 7 days a week

Your vault is empty.

License Error StorageTransientException

StorageTransientException: the mailbox is busy or over quota during a move

10 min read Updated October 5, 2026 Exchange Server

Fix it now

The store refused an operation and MRS classified the refusal as temporary: the mailbox was locked by another operation, the target was over quota, or the database was busy. One occurrence buried in a long report is normal. The ones worth acting on are those that repeat until the retry budget is gone, because those were never transient.

Run these in the Exchange Management Shell, in order

$stats = Get-MoveRequestStatistics -Identity user@contoso.com -IncludeReport
$stats.Report.Failures | Select-Object -Last 5
Get-MailboxDatabase -Status | Format-Table Name,Server,Mounted
Get-MailboxStatistics user@contoso.com | Format-List TotalItemSize,ItemCount
Get-Mailbox user@contoso.com | Format-List *Quota*,UseDatabaseQuotaDefaults
  1. Compare TotalItemSize against ProhibitSendReceiveQuota. If the mailbox is at or over it, the store has stopped accepting writes and a move is a very long sequence of writes.
  2. Raise the quota if that is the fault. UseDatabaseQuotaDefaults has to be $false before per-mailbox values apply: Set-Mailbox user@contoso.com -UseDatabaseQuotaDefaults $false -ProhibitSendReceiveQuota 5GB.
  3. Look for another request holding the mailbox: Get-MoveRequest -Identity user@contoso.com on both sides, plus Get-MigrationUser. Remove only requests that belong to an abandoned attempt.
  4. Resume with Resume-MoveRequest -Identity user@contoso.com, then re-read the report and see whether the same exception comes back.

Removing a move request that is still making progress discards the partial target copy and the work done so far. Check the status before you remove anything.

If the move advances past where it stopped, you are done. If the same exception returns on every resume, the next section covers what the store is actually refusing.

Why it happens

The information store guards mailbox consistency with locks. Only one process may hold a mailbox for a structural operation at a time, so when MRS asks for a mailbox another operation already owns, the store refuses rather than queueing indefinitely. That refusal is transient by definition, because the other operation will finish. MapiExceptionMailboxInTransit is the specific case where the other operation is itself a move.

Quota is the second family. A mailbox that reaches or exceeds its send and receive limit cannot send or receive messages, and the store treats a replication write no differently. Two settings decide this and they interact: UseDatabaseQuotaDefaults decides whether the mailbox inherits the database values or uses its own, and it defaults to $true. Setting ProhibitSendReceiveQuota on a mailbox that is still inheriting changes nothing anybody can observe, which is why so many quota fixes appear to be ignored.

MapiExceptionNotFound is the odd one out and the one that is not really transient. It means the store looked for the mailbox or folder the request named and did not find it, which on a move means the directory and the store disagree: the mailbox was moved, disabled or soft deleted while the request still points at where it used to be. Retrying that cannot help, and MRS will burn its whole budget discovering as much.

The target mailbox is over its send and receive quota

You have this one if MapiExceptionShutoffQuotaExceeded in the report, and the target mailbox size is at or above its configured limit.

  1. Compare TotalItemSize from Get-MailboxStatistics with ProhibitSendReceiveQuota from Get-Mailbox.
  2. Set UseDatabaseQuotaDefaults $false first, then the quota values, or raise the database default if you want every mailbox on it to move together.
  3. Read the value back with Get-Mailbox to confirm it was written, and allow time before deciding the change did not take.
  4. Resume the move and confirm the writes proceed.

The archive has its own quota. A move that includes an archive can be blocked by the archive limit while the primary mailbox looks entirely healthy.

Another operation already holds the mailbox

You have this one if MapiExceptionMailboxInTransit, and the exception clears briefly then returns each time you resume.

  1. List everything touching the mailbox: Get-MoveRequest -Identity <user> in both organisations, and Get-MigrationUser -Identity user@contoso.com.
  2. Remove requests left over from abandoned attempts with Remove-MoveRequest, and check for a mailbox export or import request holding it as well.
  3. If nothing is listed and the lock persists, clear the orphaned msExchMailboxMove attributes on the on-premises user object, backing the values up first.
  4. Wait for the store to release the lock before resuming; the release is not instantaneous once the owning request is gone.

Do not remove a move request that is genuinely running. Removing an in-flight request discards its progress and you start from the beginning.

The database is dismounted, failing over or under maintenance

You have this one if Failures cluster in a time window rather than around one mailbox, and other mailboxes on the same database are affected too.

  1. Confirm mount state with Get-MailboxDatabase -Status | Format-Table Name,Server,Mounted.
  2. In a database availability group, check copy health with Get-MailboxDatabaseCopyStatus -Server <name>.
  3. Check whether backups or scheduled maintenance overlap the migration window, and move one of them.
  4. Resume after the window. These requests recover without further intervention.

The store cannot find the object the request names

You have this one if MapiExceptionNotFound, and the request refers to a mailbox that has since been moved, disabled or soft deleted.

  1. Confirm where the mailbox actually lives: Get-MailboxStatistics -Identity <user> | Format-List Database,DisconnectReason.
  2. Check the directory object still has the recipient type the request expects.
  3. Remove the stale request and create a new one against the current state.
  4. If the mailbox was soft deleted in error, restore it before creating the new request rather than after.

Full reference

Quota settings and how they interact

Setting Default What it does
UseDatabaseQuotaDefaults $true While true, the mailbox uses the database values and ignores its own
ProhibitSendReceiveQuota inherited At or above this size the mailbox can neither send nor receive, and a move cannot write into it
ProhibitSendQuota inherited Must be less than or equal to the send and receive quota
IssueWarningQuota inherited Warning only; it does not block a move
Archive quota separate Governed independently of the primary mailbox

Valid quota values run up to 1.999999999 terabytes or unlimited, qualified with B, KB, MB, GB or TB. An unqualified number is treated as bytes, which is a memorable way to set a quota roughly two billion times smaller than you meant.

Commands for the lock and quota picture

Command Purpose
Get-Mailbox <user> | Format-List *Quota*,UseDatabaseQuotaDefaults Every quota on the mailbox and whether it is inheriting
Get-MailboxDatabase <db> | Format-List *Quota* The database defaults inheriting mailboxes will use
Get-MailboxStatistics <user> | Format-List TotalItemSize,ItemCount Current size, to compare against the limit
Get-MoveRequest | Format-Table DisplayName,Status Every move the organisation holds, including abandoned ones
Get-MailboxDatabaseCopyStatus -Server <name> Copy health, which explains cluster-wide transient failures

Orphaned move state on the directory object

When no move request is listed on either side and the mailbox still behaves as though one holds it, the leftovers are on the Active Directory user object. Microsoft documents clearing them by hand when the request itself is gone. Turn on Advanced Features in Active Directory Users and Computers, open the Attribute Editor, and look for the msExchMailboxMove attributes: msExchMailboxMoveRemoteHostName, msExchMailboxMoveSourceMDBLink, msExchMailboxMoveTargetMDBLink and the two archive equivalents.

Record the values before you clear them. Editing Active Directory attributes by hand is exactly the kind of change that is impossible to reverse from memory at two in the morning, and these ones are read by the service you are trying to unstick.

Telling a real transient from a permanent one wearing its coat

  • A transient exception that appears once and does not return is noise. Do not chase it.
  • The same exception repeating identically until the request fails is a permanent fault that MRS was not able to classify as one.
  • Failures that track a clock rather than a mailbox are infrastructure: backups, maintenance windows, failovers.
  • Failures that track one mailbox across every attempt are that mailbox’s state, not the network’s.
  • If a batch only completes with unusual retry or concurrency settings, something in the path is closing connections and it will do it again during the cutover.

When a licence is the actual fix

Almost everything here costs nothing. Quotas, locks and stale requests are configuration, and no purchase makes a mailbox unlock faster. A licence enters the conversation in two situations only. If you are out of quota headroom because everything sits on a handful of databases and your edition caps how many you can mount, more databases means an edition change: Standard Edition supports five mounted databases and Enterprise up to 100. The second is version rather than edition. Exchange Server 2016 and Exchange Server 2019 reached end of support on 14 October 2025, so a server on either is carrying store and replication defects with no supported route to a fix. Exchange Server SE is the current on-premises product, and we can check whether your database count needs the Enterprise edition or whether Standard covers it.

Every code this article covers

Code What it points at Source
StorageTransientException The store refused the operation and MRS classified the refusal as one it expects to clear on its own not published by the vendor
MapiExceptionMailboxInTransit Another operation holds the mailbox lock, commonly a move that was never cleaned up not published by the vendor
MapiExceptionShutoffQuotaExceeded The mailbox is at or above its send and receive limit, so the store will not accept writes into it not published by the vendor
MapiExceptionNotFound The store could not find the mailbox or folder the request named, which usually means the directory and the store disagree not published by the vendor

Confirm the fix worked

  1. The move advances past the point it previously stopped at.
  2. Get-MailboxStatistics on the target shows the size comfortably inside the quota you set.
  3. Get-Mailbox <user> | Format-List *Quota*,UseDatabaseQuotaDefaults reads back the values you intended, with inheritance off if you set per-mailbox values.
  4. Get-MoveRequest | Format-Table DisplayName,Status shows no abandoned requests left behind.
  5. The application event log on the store server shows no new quota or lock events after the change.

Questions people ask about this

How many times will MRS retry before giving up?

It has an internal budget and backs off between attempts, so a long move absorbs a lot of noise. Read the report rather than counting: repeated identical entries mean the fault is not really transient.

Why did my quota change appear to do nothing?

Most often because UseDatabaseQuotaDefaults is still $true, so the mailbox is reading the database values and ignoring the ones you set. Read the value back with Get-Mailbox and check the inheritance flag as well as the number.

Is it safe to remove a stuck move request?

It is safe when the request is genuinely abandoned; the source mailbox is untouched and only the partial target copy goes. It is not safe if the request is still making progress, because you lose that progress and start again.

Do I need a bigger licence to raise a quota?

No. Quotas are configuration and cost nothing. Licensing only matters if you need more mounted databases than your edition allows, or if you are running a build that no longer receives fixes.

The report shows a transient exception once. Should I do anything?

No. A single transient entry in a long report is the mechanism working as designed. Act on the ones that repeat until the request fails.

Related error codes

Was this article helpful?

Your feedback helps us improve our documentation.

Related articles

License Error 535 5.7.139 authentication unsuccessful: SMTP AUTH submission failures Free Fix Event ID 1053: ActiveSync lacks permission to create the device container Free Fix HTTP 404.0 on Autodiscover: Outlook cannot retrieve its own configuration License Error Error 1642: an Exchange security update refuses to patch this build
โ† Back to Knowledge Base