This article is part of a series based on my notes during the migration of an Exchange organization from version 2010 to 2016. It is not a complete procedure, but a description of the main points and areas. The examples relate to a specific design, but can generally be generalized. Similarly, although it is a description of a migration, the information is also suitable for a new installation or administration.
Official documentation: Exchange Server 2016.
Setting Limits
Before moving the first mailbox, it's a good idea to set the limits on mailbox size within the database (if we didn't do it when creating the DB) and the maximum size of messages sent on the Receive Connectors (if we didn't set it when creating the connector), and possibly also on the organization and Send Connectors.
Mailbox Limits
Documentation: Manage mailbox databases in Exchange Server, Configure storage quotas for a mailbox.
We set the limits on the Mailbox DB, or we can adjust them for an individual mailbox.
Using the Exchange Management Shell, we can list the settings of all databases in summary.
[PS] C:\>Get-MailboxDatabase -IncludePreExchange2013 | FT Name, Server, IssueWarningQuota, ProhibitSendQuota, ProhibitSendReceiveQuota DBold MAILOLD 1 GB (1,073,741,824 bytes) 1.5 GB (1,610,612,736 bytes) 1.602 GB (1,719,664,640 bytes) DBnew MAIL1 1.5 GB (1,610,612,736 bytes) 2 GB (2,147,483,648 bytes) 2.2 GB (2,362,232,832 bytes)
And then set the new databases according to the requirements.
Set-MailboxDatabase -Identity DBnew -IssueWarningQuota "1,5 GB" -ProhibitSendQuota "2 GB" -ProhibitSendReceiveQuota "2,2 GB"
Settings can also be done using the Exchange Admin Center.
- EAC - Servers - Databases - choose DB - Edit - Limits
Limits on Sending and Receiving Mail
Documentation: Message size limits in Exchange Server.
We can set limits for the entire organization, on the transport connectors, partially on the server, or for an individual mailbox. We set the maximum size of a sent or received message and the maximum number of recipients per message.
Checking the organization settings using the Exchange Management Shell.
[PS] C:\>Get-TransportConfig | FL MaxReceiveSize, MaxSendSize, MaxRecipientEnvelopeLimit MaxReceiveSize : 50 MB (52,428,800 bytes) MaxSendSize : 50 MB (52,428,800 bytes) MaxRecipientEnvelopeLimit : 1000
Configuration in the Exchange Admin Center.
- EAC - Mail flow - Receive connectors - three dot icon (More) - Organization transport settings - Limits
Checking the settings on the connectors using the Exchange Management Shell.
Get-ReceiveConnector | FT Server, Name, MaxMessageSize, MaxRecipientsPerMessage Get-SendConnector | FT Name, MaxMessageSize
Example of setting the connectors using the Exchange Management Shell.
Set-SendConnector Internet -MaxMessageSize "49 MB" Get-ReceiveConnector -Server mail1 | Set-ReceiveConnector -MaxMessageSize "49 MB" -MaxRecipientsPerMessage 1000 -MaxHeaderSize "256 kB"
Checking the settings on the mailbox using the Exchange Management Shell.
[PS] C:\>Get-Mailbox bouska | FL MaxReceiveSize, MaxSendSize, RecipientLimits MaxReceiveSize : Unlimited MaxSendSize : Unlimited RecipientLimits : Unlimited
Moving System Mailboxes
The first step is to move the system mailboxes (Arbitration Mailboxes) from the old servers to the new database.
[PS] C:\>Get-Mailbox -Arbitration -Server mailold | New-MoveRequest -TargetDatabase DBnew DisplayName StatusDetail TotalMailboxSize TotalArchiveSize PercentComplete ----------- ------------ ---------------- ---------------- --------------- Microsoft Exchange Approval Assistant WaitingForJobPickup 75.64 KB (77,452 bytes) 0 Microsoft Exchange Federation Mailbox WaitingForJobPickup 73.12 KB (74,873 bytes) 0 Microsoft Exchange WaitingForJobPickup 2.253 MB (2,362,565 ... 0
Mailbox Moves - Mailbox Move
Documentation: Manage on-premises mailbox moves in Exchange Server, Mailbox moves in Exchange Server.
We can move a single mailbox using a Move Request or multiple mailboxes using a Migration Batch. Using the EAC, a batch is always created, even if we're moving only one mailbox (perhaps by selecting the mailbox and clicking the right-hand option Move Mailbox To another database).
On Exchange 2010, when a mailbox migration - Move Request - was completed, you had to run Clear or Remove Move Requests afterwards. This removed the InTransit flag on the mailbox, until then a new migration couldn't be performed.
For Exchange 2016, the Remove-MoveRequest documentation states that this step, necessary on Exchange 2010, is no longer required on newer versions, and this cmdlet is used to cancel an existing move request. Nevertheless, in practice, once a mailbox move (either Move Request or Migration Batch) has been performed, a new move cannot be performed until the appropriate Move Request is deleted.
[PS] C:\>New-MoveRequest bouska -TargetDatabase DBnew Mailbox 'Bouška Petr' has a completed move request associated with it. Before you create a new move request for the mailbox, run the Remove-MoveRequest cmdlet to clear the completed move request.
It is also mentioned that to remove Exchange 2010 Move Requests, we must use the Remove-MoveRequest cmdlet on Exchange 2010, not on the newer version.
Preparation for the Move
Before we start moving mailboxes, we can save certain basic information (we can redirect the output of the commands to a text file or save it to CSV), which we will use for migration planning and subsequent checks. We can list the information for selected mailboxes, databases, or for all of them.
Example commands:
Get-Mailbox | FT Alias, Name, Database, ServerName -AutoSize Get-Mailbox bouska | FT Alias, Name, Database, ServerName Get-MailboxStatistics bouska | FT DisplayName, Database, TotalItemSize Get-MailboxStatistics -database DBold | FT DisplayName, Database, TotalItemSize -AutoSize Get-Mailbox -Database DBold | FT Alias, Name -AutoSize
Number of Mailboxes in the Database and Database Size
Before and during the move, it can be helpful to list the number of mailboxes in the individual databases. This can help us plan the moves and monitor the release of the databases.
[PS] C:\>Get-Mailbox -resultsize unlimited | Group-Object -Property:Database | Select-Object Name, Count | Sort-Object Name | Format-Table -Auto Name Count ---- ----- DBPFProxy 1 DBold 175 DBnew 19
Similarly, we may be interested in the size of the individual databases.
[PS] C:\>Get-MailboxDatabase -Status -IncludePreExchange2013 | Select-Object Name, DatabaseSize, AvailableNewMailboxSpace | Sort-Object Name | FT -AutoSize Name DatabaseSize AvailableNewMailboxSpace ---- ------------ ------------------------ DBPF 247.9 MB (259,981,312 bytes) 87.97 MB (92,241,920 bytes) DBPFProxy 8.063 MB (8,454,144 bytes) 2.375 MB (2,490,368 bytes) DBold 115 GB (123,498,725,376 bytes) 595 MB (623,935,488 bytes) DBnew 13.38 GB (14,361,296,896 bytes) 879.2 MB (921,927,680 bytes)
Deleting Deleted Items
In some cases, the following command may be helpful. If we want to clean up the mailbox before the move and delete a large content, it will still be copied during the move, as deleted items are normally retained for 14 days. We can view how much space the items occupy and delete them.
[PS] C:\>Get-Mailbox bouska | Get-MailboxStatistics | FL *delete* DeletedItemCount : 514 TotalDeletedItemSize : 11.04 MB (11,581,031 bytes) [PS] C:\>Search-Mailbox bouska -SearchDumpsterOnly -DeleteContent
Moving via the Exchange Management Shell
We can use the New-MigrationBatch cmdlet, where the input is a CSV file. Or the New-MoveRequest cmdlet to move a single mailbox or create a batch for multiple mailboxes. Detailed information is in the official documentation.
Let's perform a simple move of a single mailbox.
New-MoveRequest bouska -TargetDatabase DBnew
The EMS has an advantage over the EAC in that we can use switches like CompleteAfter or StartAfter to control when the migration will take place.
We also have a number of cmdlets that display information. We can view the existing Move Request for all the mailboxes being moved (these are created even from a batch for each mailbox), as well as the Migration Batch and list the users, summary statistics (takes only existing (non-deleted) migrations), and statistics for individual mailboxes.
Get-MoveRequest Get-MigrationBatch Get-MigrationUser Get-MigrationStatistics Get-MigrationUserStatistics
Deleting Old Move Requests
As we mentioned, if we want to perform a new mailbox move, we need to delete the old request. We can delete all the completed ones, for example.
Get-MoveRequest -MoveStatus Completed | Remove-MoveRequest -Confirm:$false
Note: If we delete a Migration Batch, for example in the EAC, all associated Move Request will also be deleted.
Moving Using the Exchange Admin Center
The EAC always performs a batch move using a Migration Batch, where we can easily define the parameters and either manually select the mailboxes or use a CSV file.
- EAC - Exchange Admin Center
- Recipients - Migration
- click the + (New) - Move to a different database
- add the mailboxes you want to move
- in the next step, name the batch and choose the DB to move the mailboxes to
- in the last step, choose the address to which the completion report will be sent, we can leave the automatic start and end of the batch or set it manually
Note: The mailbox move is performed as a standard transport, so transaction logs are created for the entire content. Therefore, during migration, you need to make sure the disk for these logs does not get full.
If the entire batch does not complete, for example, if there is an error on some mailbox, we can resume the incomplete mailboxes. We can view the statistics for individual mailboxes by selecting the batch and clicking View Details in the Mailbox status section on the right. Here we can remove a mailbox from the batch, but unfortunately, we cannot add a new one.
Moving the Discovery Search Mailbox
After moving all the system and user mailboxes, the DiscoverySearchMailbox remained in one of the old databases. Most migration guides do not mention this. It is a mailbox for storing the results of In-Place eDiscovery searches. I found various information that it is either not necessary for Exchange 2016 or vice versa is required, and it should either be migrated or recreated from scratch (Delete and re-create the default discovery mailbox in Exchange). I preferred to migrate it. Some additional information Discovery Mailbox In Exchange 2010, Migrate Discovery Search Mailbox from Exchange 2010 to Exchange 2013?.
[PS] C:\>Get-Mailbox -RecipientTypeDetails DiscoveryMailbox | FT Name, Database
Name Database
---- --------
DiscoverySearchMailbox {D919BA05-46A6-415f-80AD-7E09334BB852} DBold
[PS] C:\>New-MoveRequest DiscoverySearchMailbox* -TargetDatabase DBnew
DisplayName StatusDetail TotalMailboxSize TotalArchiveSize PercentComplete
----------- ------------ ---------------- ---------------- ---------------
Discovery Search Mailbox WaitingForJobPickup 76.48 KB (78,319 bytes) 0
Mailbox Move Process - How to Proceed with the Migration
In general, the mailbox move can be performed during normal operation. At the moment it is completed, the user is notified that they need to restart Outlook. Then they need to download Autodiscover with the new information. In many cases, this happened automatically without any problems, but not always. According to the information, it depends on the AD DS replication and Autodiscover caching. It is probably better to complete the mailbox migration outside of working hours.
For the problem where Autodiscover does not return the correct information, I found information in the article Troubleshooting connection issues from users migrated from Exchange 2010 to Exchange 2013/2016 that it is possible to restart the application pool on IIS (on all Exchange servers). This immediately solved the problem of the user accessing the moved mailbox.
Restart-WebAppPool MSExchangeAutodiscoverAppPool
Offline Address Books (OAB)
Documentation: Email addresses and address books in Exchange Server, Offline address books in Exchange Server.
- Global Address List (GAL) - the main list of all recipients in the organization, usually the Default Global Address List
- Address List - a dynamic subset of the GAL that contains a group of recipients, such as all distribution groups
- Offline Address Book (OAB) - a group of Address Lists that users can download and use when offline, usually containing the Default Global Address List
OAB was improved in Exchange 2013, so only version 4 is supported, with web-based distribution, and generation taking place in a designated Arbitration mailbox, not a designated server. Therefore, the OAB generation may not need to be moved to another server during the migration to Exchange 2016. Only the Organization Mailbox SystemMailbox{bb558c35-97f1-4cb9-8ff7-d53741dc928c} will be moved.
Configuring OAB
When installing the first Exchange 2016, a new OAB is created (with "Ex2013" in the name, even though it's version 2016) version 4. We can list all the OABs in the organization.
[PS] C:\>Get-OfflineAddressBook
Name Versions AddressLists
---- -------- ------------
Default Offline Address List {Version4} {\Default Global Address List}
Default Offline Address List (Ex2013) {Version4} {\Default Global Address List}
We can assign an OAB to individual mailbox databases that the mailboxes in it will use. If we don't have an OAB assigned, the latest version will be used. If we have a large organization and have created special OABs that don't contain everything, it is recommended to set the required OAB on the new DBs before migrating the mailboxes. In general, it is recommended to have the OAB set so that it is clear which OAB will be used.
[PS] C:\>Get-MailboxDatabase -IncludePreExchange2013 | FT Name, OfflineAddressBook Name OfflineAddressBook ---- ------------------ DBold \Default Offline Address List DBnew
In a typical company, the new OAB may contain the same as the old one, and we can immediately set the use of the new OAB. Either on individual DBs or on all (in the example only on the new server DBs).
Set-MailboxDatabase DBnew -OfflineAddressBook "Default Offline Address List (Ex2013)" Get-MailboxDatabase | Set-MailboxDatabase -OfflineAddressBook "Default Offline Address List (Ex2013)"
We can, of course, also list the existing GALs and Address Lists.
Get-GlobalAddressList Get-AddressList
Generating OAB
The OAB generation is managed by the Mailbox Assistant named OABGeneratorAssistant, which runs under the Microsoft Exchange Mailbox Assistants service. It takes place in a designated Arbitration Mailbox that has the PersistedCapability property set to OrganizationCapabilityOABGen. By default, OAB generation occurs every 8 hours. The Outlook client downloads the OAB by default every 24 hours or we can manually initiate it.
We can change the scheduled OAB generation according to the procedure Change the offline address book generation schedule in Exchange Server. We can manually trigger the OAB generation (update) using the Update-OfflineAddressBook cmdlet, Use the Exchange Management Shell to update offline address books. OAB files are stored on the Exchange server in the folder %ExchangeInstallPath%ClientAccess\OAB\<OAB GUID>.
There are no comments yet.