Администратор 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
.

Можно было бы добавить, что после перемещения ящика в новую базу, он не удаляется из исходной базы. Вместо этого помечается как Soft-Deleted. И будет находиться в таком состоянии в течение времени равному параметру MailboxRetention в свойствах базы, после чего удалится полность. В течение всего этого времи у нас будет сохраняться возможность восстановить ящик, в случае если после перемещения начнутся какие-либо проблемы.
У меня вопрос по перемещению ящика между 2мя DAG (например, если мы обновляем 2013 до 2016 exchange):
Например, мы имеем dag13 (2013) и dag16 (2016) в пределах одной организации exchange (леса\домена).
При перемещении ящика, любым из описанных способов, операция перемещения будет происходить физически между активными нодами кластеров dag? Я правильно понимаю?
Вопрос к тому, что на разных серверах(членах dag) могут быть установлены разные по скорости сетевые адаптеры, и хотелось бы ускорить скорость файловых операций перемещения между dag, за счет увеличения скорости обмена по сети между отдельными серверами. Путанно объясняю наверное, но смысл лишь в том, чтобы больше данных пролазило в единицу времени между старым и новым exchange.
Все верно, перенос между активными узлами кластера.
Не много не пойму вашей проблемы — если у вас на одном DAG скорость 10, а на втором 100 — но первый будет ограничением.
Но есть некоторые способы оптимизации переноса ящиков.
Посмотрите здесь:
_https://docs.microsoft.com/en-us/exchange/troubleshoot/move-mailboxes/large-mailbox-migrations-are-slow-due-to-network-latency
и почитайте про msexchangemailboxreplication.exe.config (в нем есть некоторые опции, которые позволяют увеличить количество одновременно перемещаемых ящиков и минимизировать задержки)
Подскажите пожалуйста по какой причине команда
Get-MoveRequest -BatchName DB01toDB02Move20200915| Get-MoveRequestStatistics
не выводит информацию на экран, просто проглатывается без ошибки, но информация по пакетному переносу на экране не отображается.
Из-за опечатки. Пробел пропущен после названия пакетника перед черт чертой.
Объясните пожалуйста поподробнее, что такое пакетная миграция и для чего она нужна?
Пакетая миграция удобно, когда нужно перенести сразу кучку ящиков. Пакет проще контролировать и отслеживать, чем индивидуальные MoveRequest для каждого пользователя.
Добрый день.
Существует проблема — не подключаются периодически некоторые почтовые ящики, в клиенте пишется что папки последний раз обновлены тогда -то . Спустя время ящик может заработать. Остальные ящики как работали так и продолжают работать. Проблема в 2-х 3-х ящиках. Можно ли создать еще одну базу данных и перенести туда проблемные ящики?
Возник вопрос, если была одна база на Exchange 2010, а теперь их будет 4 на Exchange 2016, то как выполнить выборочную пакетную миграцию, например первые 5000 ящиков в одну базу, следующие 5000 в другую? С помощью csv файла? Как сформировать этот файл и как он должен выглядеть?
В самом простом случае делаете 4 текстовых файла:
users_to_db1.txt
users_to_db2.txt
users_to_db3.txt
users_to_db4.txt
В файле список upn пользователей в формате email:
user1@domain.ruuser2@domain.ru
Затем пользователей из каждого файла мувите в отдельную базу
Get-Content users_to_db1.txt | New-MoveRequest -TargetDatabase "DB1" -BadItemLimit 10помогите
выполнил команду
New-MoveRequest -Identity ХХХХХХ -TargetDatabase «MBX01» –BadItemLimit 10
но ничего не происходит, прошло несколько часов, ящик весит 2Gb
что не так ? как посмотреть?
exch 2019
Висит на 0 процентах? или идет понемногу?
Get-MoveRequest -Identity user1 | Get-MoveRequestStatistics| Format-ListСмотрите на описание ошибки в атрибуте Message
Добрый день.
Скажите пожалуйста, New-MoveRequest выпадает в ошибку, статус Failed, в GUI можно мышкой запустить продолжение перемещения, а как сделать что бы он перемещался игнорируя ошибки? Или автоматический перезапуск перемещения в PS.
New-MoveRequest -TargetDatabase «DB1» -BadItemLimit 20
Добрый день.
Скажите пожалуйста — стороннее предприятие сливается с нашим. И там и там Exchange Online. У нас есть свободные лицензии. как нам присоединить почтовые ящики присоединяемой к нам организации?
Приветствую!
После переноса из одной базы в другую, не отобразился ящик в глобальной адресной книге, нужны ли какие-то дополнительные манипуляции для этого?
1. Проверьте, что ящик не скрыт: Get-Mailbox -Identity AdeleV | select name, HiddenFromAddressListsEnabled
2. Подождите некоторое время (в течении суток обычно) обновления автономной адресной книги
Добрый день, при попытке перенести служебные ящики ошибка, что не так?
Get-Mailbox -Arbitration | New-MoveRequest -TargetDatabase DB1
Не удается привязать объект ввода к любым параметрам команды, так как команда не принимает входные данные конвейера, либо входные данные и их свойства не
совпадают с любыми из параметров, принимающих входные данные конвейера.
+ CategoryInfo : InvalidArgument: (Microsoft Exchange:PSObject) [New-MoveRequest], ParameterBindingException
+ FullyQualifiedErrorId : InputObjectNotBound,New-MoveRequest
+ PSComputerName : mail.domain.ru
Не удается привязать объект ввода к любым параметрам команды, так как команда не принимает входные данные конвейера, либо входные данные и их свойства не
совпадают с любыми из параметров, принимающих входные данные конвейера.
+ CategoryInfo : InvalidArgument: (E4E Encryption Store — Active:PSObject) [New-MoveRequest], ParameterBindingException
+ FullyQualifiedErrorId : InputObjectNotBound,New-MoveRequest
+ PSComputerName : mail.domain.ru
Не удается привязать объект ввода к любым параметрам команды, так как команда не принимает входные данные конвейера, либо входные данные и их свойства не
совпадают с любыми из параметров, принимающих входные данные конвейера.
+ CategoryInfo : InvalidArgument: (Microsoft Exchange Federation Mailbox:PSObject) [New-MoveRequest], ParameterBindingException
+ FullyQualifiedErrorId : InputObjectNotBound,New-MoveRequest
+ PSComputerName : mail.domain.ru
Не удается привязать объект ввода к любым параметрам команды, так как команда не принимает входные данные конвейера, либо входные данные и их свойства не
совпадают с любыми из параметров, принимающих входные данные конвейера.
+ CategoryInfo : InvalidArgument: (Microsoft Exchange Migration:PSObject) [New-MoveRequest], ParameterBindingException
+ FullyQualifiedErrorId : InputObjectNotBound,New-MoveRequest
+ PSComputerName : mail.domain.ru
Не удается привязать объект ввода к любым параметрам команды, так как команда не принимает входные данные конвейера, либо входные данные и их свойства не
совпадают с любыми из параметров, принимающих входные данные конвейера.
+ CategoryInfo : InvalidArgument: (Помощник по утв…rosoft Exchange:PSObject) [New-MoveRequest], ParameterBindingException
+ FullyQualifiedErrorId : InputObjectNotBound,New-MoveRequest
+ PSComputerName : mail.domain.ru
Не удается привязать объект ввода к любым параметрам команды, так как команда не принимает входные данные конвейера, либо входные данные и их свойства не
совпадают с любыми из параметров, принимающих входные данные конвейера.
+ CategoryInfo : InvalidArgument: (Microsoft Exchange:PSObject) [New-MoveRequest], ParameterBindingException
+ FullyQualifiedErrorId : InputObjectNotBound,New-MoveRequest
+ PSComputerName : mail.domain.ru
Не удается привязать объект ввода к любым параметрам команды, так как команда не принимает входные данные конвейера, либо входные данные и их свойства не
совпадают с любыми из параметров, принимающих входные данные конвейера.
+ CategoryInfo : InvalidArgument: (Microsoft Exchange:PSObject) [New-MoveRequest], ParameterBindingException
+ FullyQualifiedErrorId : InputObjectNotBound,New-MoveRequest
+ PSComputerName : mail.domain.ru
EMS запустить от имени администратора?
Добрый день!
Головная компания выделяет почтовый сервер в дочернюю компанию.
Физически и географически сервера разные, доменное имя сервера остаётся.
Как правильно запустить миграцию почтовых ящиков со старого сервера на новый.
Сервера «видят» друг друга через VPN. Оба сервера 2019ые.
(по DAG, изменению записей в DNS`е — понятно).