In part 3 of the article series "Migration from Exchange 2016 to Exchange 2019", it's now time to migrate the data. Specifically, it is about moving the various mailboxes and public folders from Exchange 2016 to Exchange 2019.
I am moving the various mailbox types individually here; if no public folders or shared mailboxes (shares) are used, the corresponding points can of course be skipped. However, it is important to migrate the system mailboxes and of course the user mailboxes.
If there are only a few mailboxes, all mailboxes can be migrated in one go. The corresponding commands can then simply be entered one after the other. The MoveRequests described below are then processed accordingly.
Migration of system mailboxes
Before the mailboxes of the users and public folders are moved, the Exchange system mailboxes must first be moved to the new database. The following command can be used to display the mailboxes in the Exchange 2016 database:
get-mailbox -Database DB2016 -Arbitration
These mailboxes must now be moved to the Exchange 2019 database. The following command can be used for this:
get-mailbox -Database DB2016 -Arbitration | New-MoveRequest -TargetDatabase DB2019
The status can be checked with the following command:
Get-MoveRequest
After a short time, all MoveRequests should have the "Completed" status:
As the system mailboxes have now been moved, the move requests can be removed:
Get-MoveRequest | Remove-MoveRequest
Continue with the user mailboxes.
Migration of user mailboxes
Once the system mailboxes have been moved, you can start moving the user mailboxes.
I recommend separating user and shared mailboxes (including room and device mailboxes). As a rule, there are fewer problems when users with mailboxes on the newer Exchange version access shared mailboxes on the older Exchange version. I therefore move the shared mailboxes after the user mailboxes.
Mailboxes can generally be moved via Exchange Management Shell and Exchange Admin Center (EAC). I still use the CMDLet "New-MoveRequest" instead of the migration batches, as I have the impression that the MoveRequest is significantly faster than the migration batches (these are created by the EAC by default, but can also be created via the shell). In this example I use the shell and the CMDLet "New-MoveRequest", another example for migration batches can be found at the end of this section.
The following command can be used to display all user mailboxes in the Exchange 2016 database:
Get-Mailbox -Database DB2016 -RecipientTypeDetails UserMailbox
If all user mailboxes are to be moved from the Exchange 2016 database "DB2016" to the Exchange 2019 database "DB2019" in one go, the following command can be used:
Get-Mailbox -Database DB2016 -RecipientTypeDetails UserMailbox | New-MoveRequest -TargetDatabase DB2019
Alternatively, it is of course also possible to filter something, for example, if only user mailboxes from a specific OU are to be moved, the following command can be used:
Get-Mailbox -Database DB2016 -RecipientTypeDetails UserMailbox | where {$_.OrganizationalUnit -match "frankysweblab.de/FrankysWeb"} | New-MoveRequest -TargetDatabase DB2019
Using the WHERE-CMDLet, almost any constellation of MoveRequests can be put together here.
However the MoveRequests are set up, all user mailboxes of the Exchange 2016 databases must be moved to the Exchange 2019 databases and then also have the status "Completed":
In a fresh test environment, moving usually works without any problems, but in productive environments there are always faulty items in the mailboxes. Without the "BadItemLimit" parameter, a MoveRequest simply aborts at the first faulty item and the mailbox is not moved.
The "BadItemLimit" parameter can be used to define the number of tolerable errors; faulty items are then not copied to the new database. Defective items are therefore no longer available in the target mailbox and may have to be restored from the data backup. However, as defective items cannot be moved to the new database anyway, the only thing that usually helps here is to specify the "BadItemLimit" parameter (number of tolerable errors):
Get-Mailbox -Database DB2016 -RecipientTypeDetails UserMailbox | New-MoveRequest -TargetDatabase DB2019 -BadItemLimit 50
I have now moved all user mailboxes to the Exchange 2019 database via shell, alternatively the mailboxes can also be moved via EAC.
After the MoveRequests have been completed, they can be deleted:
Get-MoveRequest | where {$_.status -eq "Completed"} | Remove-MoveRequest
Alternative: Migration batches via EAC
Mailboxes can also be moved to the new database via the Exchange Admin Center (EAC). Here is a small example:
The mailboxes to be moved can now be selected from the list of mailboxes. With many mailboxes, this is of course quite tedious (it is therefore easier to create migration batches or MoveRequests via shell):
The new migration batch requires a freely selectable name and the target database:
Finally, you can select which user should receive a report of the migration batch. EAC already indicates that the migration batch is not for the impatient:
The new migration batch initially receives the status "Synchronization", patience is required here:
After completion, the migration batch then changes to the "Completed" status:
As soon as the migration batch is complete, it can be deleted.
Migration of shared mailboxes (including rooms and devices)
After the user mailboxes have been moved, shared mailboxes, room mailboxes and device mailboxes can also be moved. The procedure here is almost identical to the user mailboxes. Here is the command for displaying the corresponding mailboxes:
get-mailbox -Database DB2016 -RecipientTypeDetails Shared, Roommailbox, EquipmentMailbox
In this case, there is only one mailbox; a MoveRequest can now be created for this mailbox as well:
get-mailbox -Database DB2016 -RecipientTypeDetails Shared, Roommailbox, EquipmentMailbox | New-MoveRequest -TargetDatabase DB2019
As before, you can also filter or move the mailboxes via EAC if required, just like with the user mailboxes.
The MoveRequests for the shared mailboxes should also have the status "Completed" if they have been successfully moved:
The corresponding MoveRequest can now be removed again:
Get-MoveRequest | where {$_.status -eq "Completed"} | Remove-MoveRequest
Continue with the public folders.
Migration of public folders
First of all, the good news is that since there is no longer a public folder database, but public folder mailboxes were introduced with Exchange 2013, there is no longer any need to set up the annoying replication of public folders. The mailboxes for public folders can now also be easily moved using MoveRequest or Migration Batch.
The procedure is almost identical to user and shared mailboxes. Here is the command to display it:
get-mailbox -Database DB2016 -PublicFolder
And here is the command to move it:
get-mailbox -Database DB2016 -PublicFolder | New-MoveRequest -TargetDatabase DB2019
This MoveRequest also receives the status "Completed" as soon as all data has been migrated:
As soon as this was successful, this request can also be deleted:
Get-MoveRequest | where {$_.status -eq "Completed"} | Remove-MoveRequest
The only thing missing now is the Discovery Search Mailbox.
Migration Discovery Search Mailbox
The procedure for the Discovery Search Mailbox is also almost identical to the other mailboxes, here again the command for displaying:
get-mailbox -Database DB2016 -RecipientTypeDetails DiscoveryMailbox
And the move command:
get-mailbox -Database DB2016 -RecipientTypeDetails DiscoveryMailbox | New-MoveRequest -TargetDatabase DB2019
As soon as the MoveRequest has also been completed here, the request can be removed:
Get-MoveRequest | where {$_.status -eq "Completed"} | Remove-MoveRequest
All mailboxes on the Exchange 2016 server should now be moved.
Addendum
Moving the mailboxes was of course very quick for me, simply because there was hardly any data in the mailboxes. Normally, of course, moving the user, shared and possibly public folder mailboxes takes quite a long time. This depends on the items in the mailbox and the size of the mailbox. So that you can roughly estimate the speed, you should first move a few large test mailboxes. This makes it easier to estimate the total time required.
The following command also provides further statistics on the MoveRequests:
Get-MoveRequest | Get-MoveRequestStatistics
It is also not unusual for large mailboxes in particular to contain defective items; the tolerable number of defective items can be set using the "-BadItemLimit" switch. I would set the parameter to 10 items for each MoveRequest (see section "Migration of user mailboxes"). Incidentally, the value can also be set retrospectively, but this is part of the last part of this article series (coming soon).
Hallo,
Danke für die Anleitung! Leider hänge ich gerade in einer Migration an dem Punkt das ich die Datenbank am 2016 nicht abhängen kann da angeblich noch ein Publicfoldermigration anfoderung zugeordnet wäre.
auf ein stop-migrationbatch meldet er aber:
der Migrationsbatch „eine ID) wurde nicht gefunden.
was kann ich tun?
Hallo,
Danke für die Anleitung! Leider hänge ich gerade in einer Migration an dem Punkt das ich die Datenbank am 2016 nicht abhängen kann da angeblich noch ein Publicfoldermigration anfoderung zugeordnet wäre.
auf ein stop-migrationbatch meldet er aber:
der Migrationsbatch „eine ID) wurde nicht gefunden.
was kann ich tun?
Hallo,
wie sieht das eigentlich mit der Autovervollständigung der E-Mails im Outlook aus, wird das mit übertragen?
Hallo Ansgar,
ja, da ändert sich nichts und alle Einstellungen (auch Autovervollständigung) bleibt erhalten.
Beste Grüße,
Frank
Bei meiner Migration eines alten Exchange-2016-CU8-Servers auf einen Exchange-2019-CU9 bin ich auf eine Hürde gestoßen: Bis nach der Migration des ersten Postfachs lief alles im grünen Bereich.
Ich habe zwei Datenbanken: „Mailbox Database 2016“ auf dem 2016er (in der bis auf eines alle Postfächer enthalten sind), „DB2019A“ auf dem 2019er (in der sich genau ein Postfach befindet). Versuche ich nun Mails von den Postfächern auf dem 2016er an das Postfach auf dem 2019er zu senden, dann landen diese mit dem Fehler „Zurzeit ist keine Route zur Postfachdatenbank vorhanden.“ in der Queue „Unreachable“. Die Gegenrichtung, also 2019 -> 2016 funktioniert allerdings. Das fehlende Routing schlägt auch bei Externen Mails durch, die vom PopBeamer abgeholt und an den 2019er-Server übergeben werden.
Ich gebe zu, dass ich ein wenig auf dem Schlauch stehe und jetzt keinen Ansatzpunkt finde, hätte irgendjemand eine Idee?
Bei mir hat ein Server Neustart beider Exchange geholfen.
Müssen Monitoring Mailboxen (Get-Mailbox -Monitoring) auch auf den neuen Exchange umgezogen bzw. migriert werden?
Moin,
als erstes vielen Dank für die tollen Anleitungen und Erklärungen zu Exchange Themen. Ich habe nun die Migration von 2013 zu 2019 angefangen. Nun besteht das Problem darin, dass ich die Datenbanken des 2019er im ECP sehen kann und diese auch als eingebunden angezeigt werden, jedoch kann ich sie nicht aufrufen. Es erschein: „Ihre Anforderung konnte nicht abgeschlossen werden. Versuchen Sie es in einigen Minuten noch mal.“ Auch beim Anlegen neuer Datenbanken gibt es eine Fehlermeldung, angelegt werden diese aber. Per Shell ist auch alles gut, aber man kann nicht wirklich drauf zugreifen. Ich scheine irgendwo etwas übersehen zu haben, hat jemand ne Idee?
Gruß,
Daniel
@Daniel
Die ECP Seite zwischen Exchange 2013 + 2016/2019 unterscheidet sich in der Version. Mit der 2013er Version kann man nicht auf einige Funktionen von 2016 / 2019 zugreifen. Gib im Browser mal https://exchange2016/2019/ecp?ExchClientVer=15.1 für 2016 bzw. 15.2 für 2019 ein. Dann sollte alles korrekt angezeigt werden. Exchange 2013 verwendet 15.0, damit klappt es nicht!
Servus,
bei Office365 ist es das Gleiche Problem, und hier werde ich von Microsoft hingeleitet. Gibt es hier auch ein HowTo?
Zum Exchange 2019: Was mache ich wenn ECP von extern erreichbar ist? Wir haben es hinter einer Sophos UTM in der WAF integriert…
Grüße
Norbert
Moin,
ich habe das Problem irgendwie gelöst, kann mich aber gerade nicht dran erinnern wie. Es hatte etwas mit den DNS Einträgen zu tun die man über Powershell Befehle explizit setzten muss. Finde die leider gerade nicht wieder.
Aber ich kann Deine Frage nicht ganz nachvollziehen, von wo nach wo möchtest Du migrieren?
Viele Grüße,
Daniel
@Daniel
Hast du das Problem mit der 2013er Migration lösen können? Wenn ja, wie genau?
Danke für das Feedback
Moin Max,
ja, ich habe die Migration erfolgreich abgeschlossen. An sich genau der Anleitung nach. Wenn ich es richtig in Erinnerung haben, dann hatte ich das falsche ECP verwendet um die Datenbanken zu bearbeiten/aufzurufen.
An welcher Stelle hakt es denn bei Dir?
Gruß,
Daniel
Hi Franky,
du meinst bestimmt EAC und nicht ECA?
Mfg
Stephan
Hallo Stephan,
danke für den Hinweis, ich hab es korrigiert. Wobei ich mich gerade frage, wieso ich das so häufig falsch geschrieben habe!? :-)
Gruß,
Frank
Klasse, danke.