Возникла задача смигрировать все почтовые ящики из одной базы в другую. Задача простая и, на первый взгляд, элементарно решается с помощью командлета New-MoveRequest.
Так для перевоза всех ящиков из базы DB1 в базу DB2 достаточно выполнить пару команд:
$mailboxes = Get-Mailbox -Database DB1
foreach ($mailbox in $mailboxes) {New-MoveRequest -Identity $Mailbox -TargetDatabase DB2}
При таком подходе все ящики одновременно ставятся в очередь и едут в новую базу в несколько потоков. В принципе вполне рабочий сценарий, но в моем случае для одновременной миграции не хватило производительности дисковой подсистемы и в результате миграция просто встала.
При этом по одному ящику все прекрасно переезжало, однако возить несколько сот ящиков вручную не очень удобно. Следовательно надо сделать так, чтобы ящики переезжали поочередно, но в автоматическом режиме. В результате получился вот такой скриптик:
$mailboxes = Get-Mailbox -Database DB1;
foreach ($mailbox in $mailboxes) {
New-MoveRequest -Identity $mailbox -TargetDatabase DB2;
while ($(Get-MoveRequest -Identity $mailbox.alias).status -ne ″completed″) {
Start-Sleep 60;
Get-MoverequestStatistics -Identity $mailbox.alias
}
}
Возможно не самое изящное решение, но в моем случае работает. Ящики хоть и не очень быстро, но едут.
Актуально для Exchange Server 2010 и более новых версий.
Спасибо за статью! В верхнем скрипте пропустили ; после первой строки.