Администратор 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:
[email protected]
[email protected]
Затем пользователей из каждого файла мувите в отдельную базу
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. Подождите некоторое время (в течении суток обычно) обновления автономной адресной книги