Batching Exchange 2010 mailbox moves


My post from November 22 about clearing mailbox move requests prompted some questions about auto suspending moves. This is new functionality introduced in Exchange 2010 as all mailbox moves performed in earlier versions occur synchronously. In other words, an administrator decides to move a selected mailbox and the chosen management tool goes ahead and runs the code to copy mailbox contents to the new location. The tool is either a management console (in Exchange 2003 or 2007) or the management shell (in Exchange 2007).

Exchange 2010 manages mailbox moves through the Mailbox Replication Service (MRS), which runs on every Client Access Server (CAS). All of the MRS instances running within a site monitor the system mailboxes in the databases that belong to their Active Directory site to “discover” new move requests. Once a move request is discovered, an MRS instance takes responsibility for its processing. A carefully orchestrated sequence then occurs to connect to the source and target database, enumerate the contents of the source mailbox, create the new mailbox, and move the contents from the source mailbox to the target database. These phases represent roughly 95% of the total work done to move a mailbox; the remaining processing is to perform a last incremental synchronization to identify and move any content that has been created in the source mailbox since MRS began to copy items followed by updating Active Directory to switch the user object to point to the new mailbox location. All of the work is done asynchronously and Exchange 2007 and 2010 users can continue to work while their mailbox contents are transferred.

When MRS reaches the 95% mark, it checks to see whether the administrator has marked the move request to be “auto suspended”. When you auto suspend a mailbox move, MRS will hold the request and not proceed with the final synchronization and Active Directory update until an administrator resumes the move request. The idea is that administrators can have Exchange perform the vast majority of mailbox move processing, perform a final check to ensure that everything has gone OK (for example, that a high number of bad items were not encountered), and then release the suspended requests to allow them to complete. You might, for instance, have a batch of mailbox moves occur over a weekend, check the move history for the requests early on Monday morning, and then resume the suspended requests before users arrive to begin work.

Mailbox move requests are created with EMC or EMS. In either event, the New-MoveRequest cmdlet is run. If you want to auto-suspend a mailbox move, you’ll have to create the request through EMS as EMC doesn’t offer the necessary user interface to allow an administrator to select this option. Neither EMS or EMC offer the choice to schedule a mailbox move to start at a particular time, a curious deficiency that I hope Microsoft will address in a future version of Exchange.

Here’s some example code that we could run to move my mailbox:

New-MoveRequest -SuspendWhenReadyToComplete -SuspendComment 'Move Queued by Admin on 24-Nov-2010 10:00' -BatchName 'Mailbox Batch 1' -BadItemLimit 5 -Identity 'Tony Redmond'      -TargetDatabase 'DB1'

The important things here are the SuspendWhenReadyToComplete and the BatchName parameters. The BatchName parameter is optional. It allows you to group mailbox move requests together in a convenient form for later processing. The really important item is the SuspendWhenReadyToComplete parameter because it’s what indicates to MRS that it has to pause the mailbox move before completion.

After MRS begins to process the mailbox move, you can check its progress with the Get-MoveRequest cmdlet. You’ll see that the request progresses from “Queued” to “InProgress” (where MRS spends most of its time as it copies items from the source to target database) and eventually go into an “AutoSuspended” status. This marks the point where MRS pauses to await an administrator decision.

Migration projects are where the batch name parameter comes into its own. Remember that any migration project from a legacy version of Exchange to Exchange 2010 can only be performed by mailbox moves. The reason why is complicated but it can be reduced for simplicity’s sake to the massive difference in the database internal structures and schema that exist between Exchange 2010 and earlier versions. In any case, if you want to migrate 5,000 mailboxes, that means you’ll be creating 5,000 mailbox move requests and it’s likely that you’ll batch them in user groups that you want to move together to Exchange 2010. The groups might be departments, users in a similar job, or people who work in a location.

Let’s assume that you can identify the mailboxes in a particular group with a filter that you apply to the Get-Mailbox cmdlet. You can then pipe the discovered set of mailboxes to the New-MoveRequest cmdlet and stamp them with a common batch name. Then, after all the move requests have reached “AutoSuspended” status and you’ve had the chance to check them out, you can then release them all with one command. Here’s an example of how you might find mailboxes for a group (in this case, any mailbox whose “Office” attribute is set to “Dublin”) and queue them all for moving:

Get-Mailbox -Filter {Office -eq 'Dublin'} | New-MoveRequest -BatchName 'Dublin Users'      -SuspendWhenReadyToComplete -TargetDatabase 'DB1' -BadItemLimit 5

To find all the move requests that have been auto-suspended, we could then run this command:

Get-MoveRequest -MoveStatus 'AutoSuspended' -BatchName 'Dublin Users'

And when we have checked out the move requests and are ready to proceed, we can pipe the output of the Get-MoveRequest cmdlet to the Resume-MoveRequest cmdlet.

Get-MoveRequest -MoveStatus 'AutoSuspended' -BatchName 'Dublin Users' | Resume-MoveRequest

MRS will then complete processing and the users will be able to access their brand new Exchange 2010 mailboxes.

– Tony

For more information about the Mailbox Replication Service and how mailbox moves work in Exchange 2010, see Microsoft Exchange Server 2010 Inside Out, also available at Amazon.co.uk.

About Tony Redmond

Lead author for the Office 365 for IT Pros eBook and writer about all aspects of the Office 365 ecosystem.
This entry was posted in Exchange, Exchange 2010 and tagged , , , , , . Bookmark the permalink.

12 Responses to Batching Exchange 2010 mailbox moves

  1. Neill Tinlin says:

    Hi Tony, My understanding was that you couldn’t do an ‘online’ suspendable move between EX2003 and EX2010, only between EX2007 SP2 and EX2010?

    • Absolutely correct. Exchange 2003 doesn’t have the capacity to support online moves. As you point out, a server must be running at least Exchange 2007 SP2 to have the necessary “smarts” to support online moves. You can still move mailboxes between Exchange 2010 and Exchange 2003, but these moves are the traditional “wait while I do it” variety.

      TR

  2. Pingback: Tweaking the Mailbox Replication Service configuration file | Thoughtsofanidlemind's Blog

  3. Hello,

    Great article. I was actually going to post one myself based on my experience with a multi-site dag and migrating mailboxes from disparate sources in a structured manner but you have done a better write up than I could have hoped to accomplish 🙂

    My question is why you autosuspend prior to the move completing? Doesn’t that just leave to more for you to watch and a longer mail downtime for end users? Why not just batch a very large number of move requests directly in suspended state (with the -Suspend flag) then select the users you want to move and “resume” the move? If they fail due to corrupt items the user simply continues to access their mail on the old mail server?

  4. There are two very distinct parameters available for New-MoveRequest. The -Suspend parameter tells MRS to suspend the move request and not allow it to reach the “InProgress” state. The -SuspendWhenReadyToComplete parameter tells MRS to do a lot of the heavy lifting in a mailbox move by copying all of the initially enumerated content to the new mailbox and then pausing until an administrator releases the request to proceed to the end. They are really different in their meaning.

    To answer your question, I would always use the -SuspendWhenReadyToComplete parameter when I wanted to move mailboxes but have the opportunity to check each request before releasing it to completion. In a nutshell, -Suspend just sets up a move request while -SuspendWhenReadyToComplete allows MRS to do the majority of the work to move a mailbox, leaving just a small amount of work to be done when a move request is eventually released.

    – TR

  5. Great article as usual Tony! I’m in the process of moving a lot of mailboxes right now and needed a way to track batches and came up with http://mailmaster.se/blog/?p=617. Maybe usefull to someone

  6. matt smith says:

    Lol…Tony, you are looking old. I remember wavy long hair at the Compaq Exchange 2000 event in California where we were all offered free new blackberry devices. My favorite article of yours are “The top 10 reasons PSTs are bad”…

    Best wishes and glad to find your blog. Matt

  7. Saiyan says:

    Nice share Tony,
    I was having a query on which was not related to mailbox move. I work on hosted exchange platform. Recently I noticed my end users are receiving bounce back messages(NDR) that shows list of all my transport rules with its names followed by sequence using % symbol eg” %rule1%rule2% This behavior is noticed rarely but any idea why this is happening and how to prevent this from happening. Thanks in advance.

  8. Mark Hicks says:

    Tony,

    Great article. Do I understand correctly that this process could allow us to move mailboxes from 2007 to 2010 “during the day” (while users continue to “use” their mailbox on the old 2007 server) and then “complete” the moves after they leave the office in the evening? What is the difference between this approach and a “live mailbox move”?

    Thanks,
    -/\/\ark

    • Yes, the scenario that you describe is absolutely possible. Move mailboxes during a period, hold before final synchronization, make sure that everything is OK, and then let the moves complete. All done while the users continue to access their mailboxes. This works very well and is the method also used in Exchange 2013 and Exchange Online, albeit with the benefit of a migration service framework that automates the process even more.

      TR

Leave a reply to Neill Tinlin Cancel reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.