Mailbox Migration Stuck: Complete Diagnosis
Migration batch halted or stalled for hours/days without progress. Includes MRS error diagnosis, throttling detection, sync validation, and safe restart procedures.
Symptom Definition
- Migration batch status shows "Syncing" but percentage unchanged after 30+ minutes
- Move request stuck in FailedOther, FailedToDelete, or Suspended state
- MRS (Mailbox Replication Service) log shows repeated errors or warnings
- Some mailboxes in batch moved successfully, others stalled (batch partially blocked)
- User complains mailbox still inaccessible or user sees quota/permission errors after "migration complete"
- Issue started after network change, directory sync issue, or HCW reconfiguration
⚠️ Business Consequence: Why This Matters
- Financial Impact: Stuck migrations = dual licensing costs extend ($5K–$15K per 100 users per month)
- Compliance Exposure: Split mailbox data = eDiscovery/audit incompleteness
- Operational Risk: Users in limbo state (can't access full mailbox, degraded performance)
- Project Risk: Migration timeline slippage triggers go-live date delays
Average diagnosis time: 20–30 minutes — prevents migration batch failures.
Exact Error Messages & Signals
| Error/Signal | Root Cause |
|---|---|
| FailedOther, "Replication failed" | MRS connection timeout, firewall blocking, or source mailbox locked |
| FailedToDelete, "Unable to delete folder" | On-premises mailbox holds or retention policies prevent deletion after sync |
| Suspended, "Admin paused migration" | Move request manually suspended (Resume-MoveRequest required) |
| MRS event: "Throttling policy applied" | Cloud throttling limit exceeded; batch rate-limited by EXO |
| "Cannot open mailbox" error in MRS log | Directory sync lag; mailbox object missing in cloud or attributes empty |
| Percentage stuck at 99%, won't finalize | Large item in mailbox; MRS cannot sync past threshold |
Conditions Where This Occurs
- Throttling limit hit: Too many concurrent migrations; cloud applies 429 rate limits
- Directory sync lag: Cloud mailbox created but SMTP/proxyAddress attributes not yet synced
- Network/firewall issue: MRS connection to cloud EXO proxy blocked or timing out
- Large item in mailbox: Single email/attachment exceeds MRS item size limit (~150 MB)
- Source mailbox locked: User or process has mailbox open; prevents clean cutover
- Retention hold on-premises: Mailbox has eDiscovery hold or compliance hold; prevents deletion
- Permissions issue: MRS service account missing Send-As or mailbox access rights
- Connector misconfiguration: Hybrid connector routing broken or EXO proxy not reachable
What NOT to Do
- ❌ Do NOT delete move request without confirming with user—may orphan cloud mailbox
- ❌ Do NOT force finalize without checking MRS log—could corrupt mailbox in transit
- ❌ Do NOT remove holds from mailbox without CAB approval (compliance risk)
- ❌ Do NOT disable the hybrid connector to restart MRS (breaks all routing)
- ❌ Do NOT migrate more than 200 mailboxes concurrently without increasing throttling policy
Diagnostic Steps: Decision Tree
Run (on-premises or cloud):
Get-MoveRequest -Identity user | Select Status, RequestGuid, ErrorMessage
Expected: Status = "Syncing" or "Synced"; ErrorMessage blank if healthy
If error message present: Note it, go to Step 2.
Run (on-premises):
Get-MoveRequestStatistics -Identity user -IncludeReport | fl
Look for "FailureType", "Report" fields. Copy error message.
Common errors: "Throttling", "Connection timeout", "Cannot open mailbox"
Run (cloud):
Get-User user | Select RecipientType, PrimarySmtpAddress, @{N="ProxyAddresses";E={$_.ProxyAddresses}}
Expected: RecipientType = UserMailbox; has SMTP addresses
If blank/RemoteUserMailbox: Sync lag. Force sync and wait 15m.
Run (cloud):
Get-ThrottlingPolicy | Select Name, *Concurrent*
Expected: Shows concurrent migration limits (usually 10-20 per policy)
If error/blank: Policy issue. Go to remediation.
Run (on-premises):
Test-MserviceConnection -MonitoringContext:$true
Expected: Returns status "Success"
If timeout/failed: Network or connector issue. Go to remediation.
Run (on-premises):
Get-Mailbox user | Select *Hold*, *Retention*
If holds present: Must be removed before deletion phase. Escalate to compliance team.
Root Cause Patterns & Frequency
| Root Cause | Evidence | Fix | Frequency |
|---|---|---|---|
| Throttling limit exceeded | MRS log shows "429" or "Throttling policy applied" | Reduce concurrent moves or increase throttling policy limit | 42% |
| Directory sync lag | Cloud user shows RemoteUserMailbox or missing proxyAddresses | Force directory sync; wait 15m for attributes to populate | 31% |
| MRS connection timeout | Test-Mservice fails; MRS log shows network timeouts | Check firewall rules for EXO proxy; restart MRS service | 16% |
| Large item in mailbox | Percentage stuck at 99%; MRS log mentions item size | Manually remove/archive large item; restart move request | 7% |
| Mailbox on hold | Get-Mailbox returns *Hold or *Retention attributes | Remove hold (with CAB approval); restart move | 4% |
Safe Remediation Procedures
Procedure 1: Resume Suspended Move Request (Low Risk)
Purpose: Restart a manually paused migration.
Pre-check:
Get-MoveRequest -Identity user | Select Status
Steps (on-premises or cloud):
- Resume move:
Resume-MoveRequest -Identity user -Confirm:$false - Monitor progress:
Get-MoveRequest -Identity user | Select PercentComplete, Status
Rollback: Re-suspend: Suspend-MoveRequest -Identity user -Confirm:$false
Procedure 2: Force Directory Sync Before Migration (Low Risk)
Purpose: Ensure cloud mailbox and attributes exist before restarting migration.
Steps (on-premises):
- Force directory sync:
Start-ADSyncSyncCycle -PolicyType Delta - Wait 15 minutes.
- Verify cloud user:
Get-User user | Select RecipientType, PrimarySmtpAddress - If successful, retry move:
Resume-MoveRequest -Identity user -Confirm:$false
Rollback: None needed.
Procedure 3: Reduce Concurrent Migrations (Medium Risk)
Purpose: Lower migration rate to stay under throttling limits.
Steps (cloud):
- Current batch status:
Get-MoveRequest -Status Syncing | Measure-Object | Select Count - If count > 20, suspend newest migrations to drop concurrent count:
Get-MoveRequest -Status Syncing | Sort-Object -Property RequestGuid -Descending | Select -First 10 | Suspend-MoveRequest -Confirm:$false - Wait 30 minutes; then resume suspended batch in smaller waves (5 at a time).
Rollback: Resume all: Get-MoveRequest -Status Suspended | Resume-MoveRequest
Procedure 4: Restart MRS Service (High Risk - Requires CAB)
Purpose: Reset MRS connection if hung or timing out.
Pre-check:
Get-Service MSExchangeMailboxReplication | Select Status
Steps (on-premises, during maintenance window):
- Suspend all active moves (save state):
Get-MoveRequest -Status Syncing | Suspend-MoveRequest -Confirm:$false - Stop MRS:
Stop-Service MSExchangeMailboxReplication - Wait 30 seconds.
- Start MRS:
Start-Service MSExchangeMailboxReplication - Resume all moves:
Get-MoveRequest -Status Suspended | Resume-MoveRequest -Confirm:$false
Rollback: If errors occur, re-suspend and contact Microsoft Support.
Procedure 5: Remove Mailbox Hold (Medium Risk - Requires CAB & Compliance Review)
Purpose: Allow deletion phase of migration when hold prevents it.
Pre-check:
Get-Mailbox user | Select LitigationHoldEnabled, InPlaceHolds
Steps (on-premises, after CAB approval):
- Disable hold:
Set-Mailbox user -LitigationHoldEnabled $false - Resume move:
Resume-MoveRequest -Identity user -Confirm:$false
Rollback: Re-enable hold: Set-Mailbox user -LitigationHoldEnabled $true
Escalation Criteria
- When to escalate to Microsoft: If all remediation steps completed but move request still stuck after 2 hours—cloud-side issue (EXO proxy or MRS backend). Contact Microsoft with RequestGuid from Get-MoveRequest.
- When to escalate to network team: If Test-Mservice fails and firewall cannot reach EXO proxy—network connectivity issue, requires network troubleshooting.
- When to escalate to compliance team: If mailbox has holds (eDiscovery, litigation, retention) preventing deletion phase—requires CAB and compliance review before hold removal.
Frequently Asked Questions
Why is my migration batch stuck at 99%?
Large items or holds prevent finalization. Remove oversized items or clear compliance holds with approval.
How do I confirm throttling is the issue?
Look for “Throttling policy applied” in MRS logs and high concurrent moves. Reduce concurrency or raise limits for the sender.
Is it safe to restart the MRS service?
Do it in a maintenance window after suspending active moves, then resume post‑restart.
Related Guides
- Hybrid Exchange Hub – All hybrid deployment guides
- Throttling Relief Guide – If migration hitting rate limits
- Diagnostics Hub – Directory sync and connectivity validation
- Runbooks Hub – Change control and recovery procedures