This article is an excerpt from the Exchange Server 2003 to 2010 Migration Guide.

Mailbox moves in previous versions of Exchange were interactive in nature, in that a wizard, script or shell command was used to move the mailbox and it occured in real time.

In Exchange Server 2010 mailbox moves are now handled using move requests.  In short, the move request is submitted into a queue and processed by the Mailbox Replication Service (MRS), which runs on Client Access servers.

Exchange 2010 mailbox move requests can be created using either the Exchange Management Console or the Exchange Management Shell.

There are only a few minor differences between the console and shell for performing mailbox moves, for the most part it comes down to which one you are most comfortable with.

Creating Move Requests using the Exchange Management Console

Launch the Exchange Management Console and navigate to Recipient Configuration/Mailbox.

Select a mailbox, or hold the CTRL key to select multiple mailboxes to move as a group.

Selecting mailboxes to move in the Exchange Management Console
Selecting mailboxes to move in the Exchange Management Console

In the Actions pane click on New Local Move Request.  Local Move Requests are for moves within the same Exchange organization.

Start a new Local Move Request
Start a new Local Move Request

All of the mailboxes selected for the New Local Move Request wizard will be moved to the same target mailbox database.  Click the Browse button to choose a target mailbox database.

Browse to select a target mailbox database
Browse to select a target mailbox database

Select the mailbox database to move the pilot group to and then click OK.  Click Next to continue.

Choose the target mailbox database
Choose the target mailbox database

Leave the Move Settings as the default settings and click Next to continue.  If you encounter issues with corrupt items you may need to create a new move request for those mailboxes and choose to skip corrupted messages.

Configure the settings for the mailbox move requests
Configure the settings for the mailbox move requests

Review the list of mailboxes that will be moved and then click New to create the move requests.

Review the mailboxes to be moved
Review the mailboxes to be moved

Click Finish to close the wizard.

The move requests are created and will be processed by the Exchange server.  You can view the status of the move requests in the Exchange Management Console under Recipient Configuration/Move Request.

View the status of the mailbox move requests
View the status of the mailbox move requests

Right-click a move request and choose Properties to see the status of that move request.

View the progress of a mailbox move request
View the progress of a mailbox move request

Using Filters to Choose Mailboxes for Move Requests

When performing mailbox migrations you can use filters to make the task of selecting mailboxes to be moved simpler.

Open the Exchange Management Console and navigate to Recipient Configuration/Mailbox.  Click on Create Filter at the top of the console.

Creating filters in the Exchange Management Console
Creating filters in the Exchange Management Console

Filters can be created for a number of different user attributes, such as department, the current server they are on, or by name.

Choosing filter criteria
Choosing filter criteria

For example, if you are batching mailbox migrations by surname you can create a filter to only show mailbox users whose surname starts with a given letter.

Applying filters in Exchange Management Console
Applying filters in Exchange Management Console

Click on Apply Filter to see the resulting view.

A filtered view of mailboxes in the Exchange Management Console
A filtered view of mailboxes in the Exchange Management Console

Filtering the views in this way can make it very easy to select the mailboxes that you wish to create move requests for.

Creating Mailbox Move Requests with the Exchange Management Shell

In a similar way to the Exchange Management Console the Exchange Management Shell allows filtering of mailboxes in the organization by various criteria.

For example to get the same filtered list of mailbox users with surnames starting with the letter A the following command is used:

[PS] C:\>Get-Recipient | Where {$_.LastName -like "A*"}

Name                                                        RecipientType
----                                                        -------------
Amanda.Agrawal                                              UserMailbox
David.Abbott                                                UserMailbox
Debbie.Abdillahi                                            UserMailbox
Debbie.Amissah                                              UserMailbox
Debbie.Ashong                                               UserMailbox
Debbie.Askew                                                UserMailbox
Denise.Ahadi                                                UserMailbox
Donna.A'Bear                                                UserMailbox
Ella.Amaral                                                 UserMailbox
Janis.Armoogum                                              UserMailbox
Jo.Allingham                                                UserMailbox
Kathy.Abdullahi                                             UserMailbox
Lesley.Ahmad                                                UserMailbox
Sue.Andress                                                 UserMailbox
Valerie.Andrews                                             UserMailbox

This output can then be piped into the New-MoveRequest command to create the move requests.

Get-Recipient | Where {$_.LastName -like "A*"} | New-MoveRequest -TargetDatabase MB-HO-01

In the above example the mailbox users whose surnames starting with the letter A have new move requests created to migrate them to the database MB-HO-01.

If the same command was used but without the –TargetDatabase parameter, the mailboxes being moved would be automatically distributed across the available databases within the same Active Directory site as the server that the command is being executed from. The exception to this is any mailbox databases that have been excluded from automatic mailbox provisioning.

As another example, this command when run on ESP-HO-EX2010B will create move requests for all mailbox users on the legacy server ESP-HO-EX2003 and automatically distribute the mailboxes across the Exchange 2010 mailbox databases in the site where ESP-HO-EX2010B is located.

Get-Recipient | where {$_.ServerName -eq "esp-ho-ex2003"} | New-MoveRequest

Automatic distribution of mailboxes across available databases is only possible when using the Exchange Management Shell to initiate the move requests. Using the Exchange Management Console requires you to specify a target database for the mailboxes being moved.

The Exchange Management Shell can also be used to monitor the progress of move requests. For example this command will list all move requests that have a target database of MB-HO-01.

[PS] C:\>Get-MoveRequest | where {$_.targetdatabase -eq "MB-HO-01"} | Get-MoveRequestStatistics

DisplayName               Status                    TotalMailboxSize          TotalArchiveSize         PercentComplete
-----------               ------                    ----------------          ----------------         ---------------
Joanna Hughes             Queued                    204 MB (213,900,039 by...                          0
Joy Singh                 Queued                    201.6 MB (211,394,039 ...                          0
Laoise Curtis             Queued                    203.4 MB (213,259,972 ...                          0
Maggie Hengist            Queued                    201.5 MB (211,268,161 ...                          0
Lydia Haines              Queued                    202.9 MB (212,717,146 ...                          0
Michael Phillips          Queued                    204.5 MB (214,421,891 ...                          0
Nancy Scott               Queued                    200.7 MB (210,499,528 ...                          0
Ravi Edmonds              Queued                    201.6 MB (211,396,972 ...                          0
Pakwei Dean               Queued                    201.9 MB (211,688,603 ...                          0
Rowena Khan               Queued                    203.9 MB (213,824,471 ...                          0
Prathee Dar               Queued                    201.9 MB (211,671,241 ...                          0
Sharmila Hafri            Queued                    203.1 MB (213,003,913 ...                          0
Stuart Beauchamp          Queued                    206.8 MB (216,879,621 ...                          0
Wendy Fyson               Queued                    202.3 MB (212,077,416 ...                          0
Tina Miller               Queued                    203.2 MB (213,039,339 ...                          0
Jas Dowden                InProgress                201.2 MB (210,950,587 ...                          79
Jagir Ward                InProgress                201.1 MB (210,838,575 ...                          79
Aisha Bhari               Completed                 0 B (0 bytes)                                      100
Andrew O'Grady            Completed                 204.2 MB (214,083,224 ...                          100
Denise Dartnell           Completed                 204.8 MB (214,717,706 ...                          100
Garth Gibbons             Completed                 203.4 MB (213,254,283 ...                          100
Harinder Rahman           Completed                 203.8 MB (213,746,554 ...                          100

About the Author

Paul Cunningham

Paul is a former Microsoft MVP for Office Apps and Services. He works as a consultant, writer, and trainer specializing in Office 365 and Exchange Server. Paul no longer writes for Practical365.com.

Comments

  1. Terry Grigg

    Hope this isn’t too old
    I did a local move of all the mail accounts to a new mail store
    But when I Dismount the old mail store I can connect to exchange & send emails but not recieve
    how do I default the new mail store

  2. Terry

    Hi Paul,
    Great article. I have the following question, will archive mailboxes be transferred as well during move request? We have some mailboxes with archives and I’m wondering if there is something else to do in order to move those.

    Thanks

  3. Craig M.

    Paul,
    Thanks for the tips, my question is this, I want to move all the mailboxes from one database to another using powershell, can you give some ideas how I can do this?

    Thanks,

    Craig

    1. Avatar photo
      Paul Cunningham

      What have you already tried, and what problem are you running into?

      1. Craig

        Paul,
        I have just used the Management Console to move mailboxes, but I wanted to know if using the following is okay to use to move bulk mailboxes from one db to another:

        Get-Recipient | where {$_.ServerName -eq “Mailbox DBSample1”} | New-MoveRequest -TargetDatabase DBSample2 (Local move request)

  4. Kev

    Hi Paul Just to confirm can the mailboxes be moved whilst the database is in a DAG? or does the DAG copy need to be reseeded from scratch once moved

  5. Sandile

    Good day Everyone,

    I am having a problem moving mailboxes in exchange 2010 from from one dc to another DC. i have enabled inheritance and granted access “exchange servers” to the users OU but still having a problem. here is the problem

    Error:
    Active Directory operation failed on dc. This error is not retriable. Additional information: Insufficient access rights to perform the operation.
    Active directory response: 00002098: SecErr: DSID-03150E49, problem 4003 (INSUFF_ACCESS_RIGHTS), data 0

  6. Arun Prasath M

    Hi!

    In Outlook Exchange Status, it is showing HTTPS running in Background. is it correct? My Boss suggests, it should be run in TCP/IP

  7. Arun Prasath M

    Hi!

    How to move 10 to 20 mailboxes from exchange 2003 to exchange 2010 using Exchange Powershell?

  8. Jesus

    In our Exchange 2010 environment we are always getting alerted on databases running low on space. We normally find one or two small mailboxes and manually move them to another db that has plenty of space until we can request more storage to grow our db that is running low on space.
    we always use the move request from the Mgmt console. Of course we need to look for the db that has the most space to move the mailboxes to it.
    I have two questions/requests if you could help.

    1- What would be the command to move a specific mailbox to whichever database has the largest free space. (without specifying the database. In other words. moving a mailbox and letting exchange figure out which db has the largest free space to move the mailbox there)

    2- on this command you used above: ( Get-Recipient | where {$_.ServerName -eq “esp-ho-ex2003”} | New-MoveRequest) – how does exchange determines to which database to move the mailbox?

    Thank you for your help.

  9. Jennifer Allen

    It means that they can’t recieve email. For example: If I send an email to Laura, she does not recieve it and I get an Undeliverable Error Message:

    This is an automatically generated Delivery Status Notification.

    Delivery to the following recipients failed.

    laura.davis@sykes.com

    I explained the events that lead to this: I completed a local move request. The status shows “Completed with Warning”. When I click on the Properties, it shows that my Source Database is DB02 (where they were moved from) and the Target Database as DB01 (which is correct). Under the Suspend comments under Details, I see this message:

    Warning: Failed to clean up the source mailbox after the move.
    Error details: MapiExceptionUnexpectedMailboxState: Unable to delete mailbox. (hr=0x80004005, ec=2634)

    I am new to using EMC 2010 so I haven’t performed any troubleshooting steps. I thought about just removing the Exchange Attributes in Active Directory and just start over.

    1. Avatar photo
      Paul Cunningham

      There should be more info in the NDR. It might be relevant. Can you post the full NDR? You can obfuscate sensitive info if you need to.

      1. Jenn Allen

        Hi Paul,

        I was able to resolve the issue. It was my mistake. I added the users UPN information in Active Directory as well as the EMC resulting in duplicates. As soon as I removed the UPN information from the EMC it did the trick and the users were able to send and recieve.

        Thanks for trying to help though, I appreciate it 🙂

  10. Jennifer Allen

    After performing a New Local Move Request, I got a CompletedWithWarning message. I noticed that the Source Database is showing: DB02 (which is where they were moved from) and Target Database: DB01. The logs are showing that the primary mailbox could not be deleted and has tried 6 of 6 times. The user is not able to recieve email now. Any suggestions on a fix for this?

    1. Avatar photo
      Paul Cunningham

      You’ll need to be more specific about what “not able to receive email now” means. What has your troubleshooting shown so far?

  11. Oliver

    Great article Paul!

    We are in the middle of planning a migration of an SBS 2011 over to Server 2012 R2 with Exchange 2013 installed. Can we use the Exchange 2010 Management Console to create move requests to the new Exchange 2013? Any tips of the trade would be appreciated.

    Thanks

    1. Avatar photo
      Paul Cunningham

      Move requests need to be created on the higher version of Exchange (in your case 2013).

  12. Jeff Strubberg

    Paul;

    We have a mail database that has gotten far too large. I’m working on splitting this out into 3 databases in order to keep database size down around that magic 200gb mark. The move mailbox process is very easy, but my original mailbox database isn’t shrinking? I’ve moved just a few mailboxes, around 10gb and waited overnight for database cleanup to run. The old database is exactly the same size as before the moves.

    Am I missing something? How does one reclaim the space in the database after a move?

  13. Debi

    Hi Paul

    Thanks for your helpful articles – I have a query though. After several successful move requests I have noticed an issue. I have moved 40 mailboxes away from a database that is to be removed in due course – let’s call it OLDDB and when I look in the EMC at a filtered view to show only the mailboxes in OLDDB it all looks as it should with the 40 no longer appearing. But – and here is my problem – when I run a powershell command Get-MailboxDatabase OLDDB | Get-Mailbox to show me a list of all the mailboxes remaining there it still shows 40 that have been moved. Why would that be? Is there a clean-up or other attribute that needs fixed?

    Thanks Debi

  14. ziyad R. Alashhab

    What is best way to move MailBox DataBase from Exchange server 2010 to another Exchange server 2010,
    Note:
    -Each of server in different country.
    -MailBoxes users around 3000.
    -If there is stypes for this case please tell me.

      1. Ziyad R. Alashhab

        -In different country? How if DataBase size if we say 60 GB or more?
        -From Exchange server 2010 to another (((NEW)))) Exchange server 2010

        1. Avatar photo
          Paul Cunningham

          Yes, the way to move mailboxes between two Exchange 2010 servers that are in the same organization, no matter where they are in the world, is to do mailbox moves as demonstrated in the article above.

          If there’s a lot of mailboxes or they are very big then it will simply take longer.

  15. Tom

    I have 2 exchange mailbox servers that were in a DAG but not any more. I have 3 individual mailboxes that live on 1 of the servers and the rest of the 100+ live on the other. How can I move the 3 boxes to the server with the rest of the boxes?

    Thank you!

    1. Avatar photo
      Paul Cunningham

      You can move them using the same process demonstrated in this article.

      1. Tom

        Summary: 1 item(s). 0 succeeded, 1 failed.
        Elapsed time: 00:00:01

        lchapparo
        Failed

        Error:
        Mailbox ‘corp.xxxxxxxxx.com/Users/xxxxxxx’ is already in the target database ‘BOH-MAIL’.
        Click here for help… http://technet.microsoft.com/en-US/library/ms.exch.err.default(EXCHG.140).aspx?v=14.3.181.6&t=exchgf1&e=ms.exch.err.Ex898995

        Exchange Management Shell command attempted:
        ‘corp.xxxxxxxxx.com/Users/xxxxxxx’ | New-MoveRequest -TargetDatabase ‘BOH-MAIL’

        Elapsed Time: 00:00:01

        they are still in the same database even though they resides on different mailbox servers. it won’t let me move the boxes.

        1. Avatar photo
          Paul Cunningham

          Mailbox databases have unique names in Exchange 2010. You would need to move them to a database that exists on the server where you want them to be located.

        2. Tom

          ok let me clarify….

          there is only one database – BOH-MAIL

          it is mounted & healthy on a server called Mail2 that at one point was part of a 2 server DAG with the other server called Mail1

          Both servers are still online just not in a DAG anymore

          When I run GetMailbox -Database “BOH-MAIL”, I see 3 mailboxes that show Mail1 under the server name field. I don’t see how that is possible. I am trying to figure out if that is accurate and if so, how can I move them to Mail2.

  16. igboennem

    This is an awesome resource. Better presented than Microsoft’s either too scanty or convoluted kb articles

  17. Patrik Jarlten

    Thanks for guide!

    When I do “New Local Move Request” from EMC. Client needs to restart Outlook to get access.
    From logfile.
    Couldn’t preserve the mailbox signature for mailbox ‘Primary (f62686b3-7494-466c-8c8f-51430a1362e3)’. Outlook clients will need to restart to access the moved mailbox.

    Is there any better way to do this? I need to move a lot of mailboxes without down time.

  18. Johh O'Reilly

    Very good information BUT what I want is the ability to set a schedule for non business hours. All this good info about setting a move and completing it immediately. WhatI need is the ability to schedule a move for ’10:00 pm tonight” In EX2003 the gui gave you the option to set a schedule for ‘whenever’ EX2010 does not have that in the GUI. How would you do it in Powershell.

    1. Avatar photo
      Paul Cunningham

      Not exactly a schedule, but you can start the online mailbox moves any time of day and add the -SuspendWhenReadytoComplete parameter. This moves them to 95% then puts the move requests in a suspended state.

      At the time you want the migration to finish you just:

      Set-MoveRequest -SuspendWhenReadyToComplete:$false

      Then…

      Resume-MoveRequest

      (note: for both those examples you’d probably want to pipe in a list of move requests from Get-MoveRequest so only the ones you want to resume get resumed)

      1. Alessandro Matano

        Hi Paul,

        I have an ongoing migration. It is taking more than expecting, so I want to set the -SuspendWhenReadyToComplete. If I run the command now:

        Get-MoveRequest -MoveStatus InProgress | Set-MoveRequest -SuspendWhenReadyToComplete:$True

        I run into an error: “SuspendWhenReadyToComplete and PreventCompletion flags cannot be specified on auto-resume jobs.”

        Should I manually suspend the migration, set the flag, and resume ?

        Thanks!

        A.

        1. Mike Tucker

          Were you able to resolve this issue? We are also getting this for migrations to Exchange 2013. We tried suspending, setting the flag & resuming but get the same error.

          Any feedback would be appreciated!!

  19. Andrew Roe

    Quick question for you. I move a ton of mailboxes as part of my routine for white space remediation. during these moves many of my mailboxes complete with warnings usually “failed to cleanup source mailbox” which is no big deal I remove the soft deleted once I confirm the mailboxes are moved and accessible. however every now and then some fail to to unreachable sub domain controller. I have been trying to write a powershell script that will allow me to filter these failures out and list them. The issue I run into is that the moverequeststatistics message property appears to be more than just text so the normal comparison tags like -like -notlike etc. do not work it seems to be some embedded object I even tried to take a layer deeper and compare the message.formatparameters but that also appears to be an object. is there a way for me to generate a list of moverequests that hav a status of “completedwithwarnings” based on a prticular warning message? I tried to query teh suspended comment property but I can’t find it accessible anywhere I’m guessing that’s just a label for the message property of the moverequest statistics

  20. Javier

    Helo Paul,

    A question… After that finish of move Mailboxes succesfully… I ran on Exchange Server a Get-MailboxDatabase to verify the change on both databases and the users are in both data bases. But in the exchange console on properties of the users the data base is OK…¿Why? Thanks!

  21. Chris

    We’ve just moved quite a few users from Exchange 2010 to Exchange 2010 (new hardware)

    The migration has gone well so far but the users still show the old exchange server name in both the account and under mail connection in outlook (under connection status) though under both directory listing the new server is shown.

  22. Brent Schrader

    If the moves are queued, how do we get those to continue?

    1. Avatar photo
      Paul Cunningham

      Exchange throttles the moves to prevent the server from being overwhelmed. The queued ones will start in due course.

  23. Maria Pardinas

    Does it affect the exchange enterprise vault?

  24. Steve

    Hi paul…can i ask you an exchange server 2010 question ?
    Thx

  25. David

    Do you know of a way modify the filter: Get-Recipient | Where {$_.LastName -like “A*”} to capture any last name in the range A through M? without having to have a 13 separate -like statements? Is there a “A-M” syntax?

    1. Avatar photo
      Paul Cunningham

      Here is a way you can do it. First, create an array of the letters you want to include.

      $letters = @(65..77 | ForEach-Object { $([char]$_) })

      Then, run this command to loop through the array.

      foreach ($letter in $letters) { Get-Recipient | Where {$_.LastName -like “$letter*”}}

Leave a Reply