Администратор Exchange может перемещать ящики пользователей между почтовыми базами на одном сервере или между удалёнными mailbox серверами. В этой статье мы рассмотрим, как перемещать почтовые ящики в Exchange с помощью Exchange Admin Center и PowerShell (статья актуальна для всех поддерживаемых версий 2010/2013/2016/2019, с небольшими оговорками касательно графического интерфейса управления Exchange).
Чаще всего ящики в организации Exchange перемещают, если пользователь переместился на другую площадку с собственными почтовыми северами; когда заканчивается место на диске, где хранится текущая база; когда нужно выполнить офлайн дефрагментацию базы без прерывания почтового сервиса для пользователей.
Для переноса почтового ящика из одной базы в другую, нужно создать запрос на перемещение. Есть три типа запроса на перемещение:
- Local move – локальный запрос на перенос ящика внутри одного леса (из одной базы в другую на том же самом почтовом сервере, или на другой сервер в этой же организации Exchange);
- Cross-forest enterprise move – перенос почтовых ящиков между разными лесами Active Directory;
- Remote mailbox moves in hybrid deployments – перенос почтовых ящиков в гибридных конфигурациях (между on-premises Exchange и Office 365).
Перемещения почтовых ящиков с помощью Exchange Admin Center
С помощью Exchange Admin Center вы можете переместить один или несколько ящиков пользователей.
- Откройте EAC и перейдите на вкладку Recipients -> Migrations;
- Нажмите кнопку + и выберите пункт Move to a different database;
- Выберите учетные записи, ящики которых нужно переместить; Можно указать список пользователей для переноса в CSV файле и загрузить его в EAC.
- Затем нужно указать целевую почтовую базу, в которую нужно переместить ящики;
- Далее вы можете указать, нужно ли запустить перемещение сразу, или позднее, а также указать ящик, на который нужно доставить отчет об успешном перемещении ящика.
Я сам практически не пользуюсь возможностями перемещения ящиков через EAC, т.к. с помощью PowerShell можно выполнить эти действия гораздо удобнее и быстрее.
Управление перемещением ящиков Exchange с помощью PowerShell
Чтобы узнать, в какой почтовой базе находится ящик пользователя, запустите Exchange Management Shell и выполните команду:
Get-Mailbox aaivanov| Format-List Database
В этом примере ящик пользователя находится в базе DB01.
Для создания локального запроса на перенос ящика используется командлет New-MoveRequest. Например:
New-MoveRequest -Identity aaivanov -TargetDatabase "MBX01" –BadItemLimit 10
Кроме имени пользователя важные параметры это:
- TargetDatabase – имя целевой почтовой базы, в которую нужно переместить ящик;
- BadItemLimit – количество поврежденных элементов в ящике, которое можно пропустить (игнорировать) при переносе ящике.Если указать BadItemLimit 0, значит при наличии хотя бы одного поврежденного элемента, ящик не будет перемещен и останется в исходной базе. Если вы указали значение BadItemLimit > 50, нужно дополнительно указывать ключ AcceptLargeDataLoss.
Командлет вернет размер ящика и архива (TotalMailboxSize , TotalArchiveSize) и сообщение о том, что запрос на перенос добавлен в очередь (Queued)
Для переноса всех ящиков из одной почтовой базы Exchange в другую, используйте команду:
Get-Mailbox -Database DB01 -ResultSize Unlimited | New-MoveRequest -TargetDatabase DB02
Get-Mailbox -Database DB01 -Arbitration | New-MoveRequest -TargetDatabase DB02
В зависимости от размер ящика и местоположения целевого сервера, его перенос может занять длительное время. Для отслеживания статуса миграции почтового ящика в % используется командлет Get-MoveRequestStatistics.
Get-MoveRequestStatistics -Identity aaivanov
В данном примере статус переноса — InProgress, процент завершения (PercentComplete) – 26%.
Можно вывести статус всех запросов на перемещения ящиков в организации:
Get-MoveRequest | Get-MoveRequestStatistics
После того, как перенос завершен, значение PercentComplete достигнет 100, а статус переноса изменится на Completed.
Get-MoveRequest | where {$_.status -ne "completed"} | Get-MoveRequestStatistics | ft -a displayname,status*,percent
Вывести все ящики в процессе перемещения или ожидания в очереди:
Get-MoveRequest -movestatus inprogress
Get-MoveRequest -movestatus queued
Если при переносе произошла ошибка, можно вывести ее командой:
Get-MoveRequest aaivanov | Get-MoveRequestStatistics | fl *failure*, message
Для получения подробной информации об ошибках миграции ящиков, используйте:
Get-MoveRequest -resultsize unlimited | Where-Object {$_.status -like “failed”} | Get-MoveRequestStatistics -IncludeReport | select DisplayName, Message, FailureType, FailureSide, FailureTimeStamp, *bad*, *large*, Report, Identity | fl
Если нужно отменить перемещение ящика, выполните:
Remove-MoveRequest -Identity aaivanov
Чтобы удалить успешно завершенные запросы на перемещение (без этого вы не сможете перенести этот ящик в следующий раз), выполните:
Get-MoveRequest -MoveStatus Completed | Remove-MoveRequest
Пакетный перенос ящиков в Exchange
Для более удобного отслеживания перемещения ящиков можно использовать параметр –BatchName. Например, чтобы перенести все ящики из одной почтовой базы в другую в пакетном режиме, выполните:
Get-Mailbox -Database DB01 | New-MoveRequest -TargetDatabase DB02 -BatchName DB01toDB02Move20200915
Теперь, чтобы получить статус миграции всех ящиков в этом пакете нужно указать его имя:
Get-MoveRequest -BatchName DB01toDB02Move20200915| Get-MoveRequestStatistics
Так вы сможете убедиться, что все ящики из вашего задания успешно перенесены.
Можно временно приостановить перенос почтовых ящиков:
Get-MoveRequest | ? {$_.Batchname –like “*DB01toDB02Move20200915”}|Set-MoveRequest –SuspendWhenReadytoCompleate
Или продолжить миграцию:
Get-MoveRequest | ? {$_.Batchname –like “*DB01toDB02Move20200915”|Resume-MoveRequest
В Exchange 2013, 2016, 2019 и Exchange Online можно перемещать несколько ящиков с помощью пакетного режима (командлет New-MigrationBatch). Список ящиков для миграции нужно указать в CSV файле, а затем выполнить команду:
New-MigrationBatch -Local -AutoStart -AutoComplete -Name DB01Move20200915 -CSVData ([System.IO.File]::ReadAllBytes("C:\PS\DB01Move20200915.csv")) -TargetDatabases DB02 -BadItemLimit 10
PrimaryOnly
, чтобы перенести архивный почтовый ящик –
ArchiveOnly
.