Заметки о Windows и других программных продуктах Microsoft...

Скрипт для перемещения почтовых ящиков между базами

Скрипт для перемещения почтовых ящиков между базами

Возникла задача смигрировать все почтовые ящики из одной базы в другую. Задача простая и, на первый взгляд, элементарно решается с помощью командлета 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 и более новых версий.

 
 
Комментарии
Андрей

Спасибо за статью! В верхнем скрипте пропустили ; после первой строки.

Все гораздо проще
Get-Mailbox -Database DB01 -ResultSize Unlimited | New-MoveRequest -TargetDatabase DB02

По умолчанию в exchange разрешено 10 потоков, соответсвенно у вас будут ехать ящики в 10 потоков. Можно изменить значение и получите быструю миграцию без перегрузки дисковой подсистемы

Leave a Reply to Dave