Очистка транспортной очереди Exchange с большим количеством элементов
Однажды так случилось, что в транспортной очереди на сервере Exchange скопилось ну очень много писем – несколько сотен тысяч. Ввиду того, что письма эти были сгенерированы и разослан по ошибке, доставлять их было не нужно, а нужно было удалить. Казалось бы, все просто – есть статья на TechNet, которая рассказывает, как это сделать - White Paper: Remove Specific Messages from Exchange Server - https://technet.microsoft.com/en-us/library/hh547012(v=exchg.141).aspx#removeMQ. Т.е. план такой:
- Ставим службу транспорта на паузу, чтобы сервер не принимал больше новых писем, но при этом мог обрабатывать имеющиеся:
net pause MsExchangeTransport
- Далее получаем список элементов в очереди нужного нам сервера и удаляем их:
Get-TransportServer <имя сервера> | Get-Queue | Get-Message -ResultSize unlimited | Where {$_.Subject -eq "Surprise Party"} | Remove-Message -WithNDR $False
в качестве фильтра можно использовать и другое условие, или не использовать фильтр вовсе.
Вроде все просто, но в случае с большим количеством элементов в очереди, вы получите ошибку вида:
The query produced too many results. To reduce the number of results, use a more restrictive filter.
+ CategoryInfo : InvalidOperation: (:) [Get-Message], LocalizedException
+ FullyQualifiedErrorId : 88B8D789,Microsoft.Exchange.Management.QueueViewerTasks.GetMessageInfo
Чтобы обойти эту ошибку, я предлагаю попробовать использовать следующую конструкцию:
Get-Message -filter {Subject -eq "…"} -resultsize 1000 | remove-Message -withNDR $False
Т.е. фильтровать сообщения сразу, а не передавать их все по конвейеру, при этом выбирать сообщения пачками по нескольку тысяч.
Но к сожалению, и здесь вы можете натолкнуться на некоторые ограничения, например, ограничение размера объема передаваемых данных на виртуальном каталоге IIS.
Sending data to a remote command failed with the following error message: The total data received from the remote client exceeded allowed maximum. Allowed maximum is 524288000. For more information, see the about_Remote_Troubleshooting Help topic.
+ CategoryInfo : OperationStopped: (System.Manageme...pressionSyncJob:PSInvokeExpressionSyncJob) [], PSRemotingTransportException
+ FullyQualifiedErrorId : JobFailure
Чтобы обойти это ограничение, нужно изменить этот лимит в настройках виртуального каталога PowerShell (в IIS) на том сервере, куда подключилась консоль. Нужно поменять два атрибута в файле web.config - PSMaximumReceivedObjectSizeMB и PSMaximumReceivedDataSizePerCommandMB.
Нажмите на виртуальный каталог powershell правой кнопкой -> Explore, в открывшейся папке Вы найдете web.config (для Exchange 2013 надо смотреть на Back-End`e):
<InitializationParameters>
<Param Name="PSVersion" Value="2.0" />
<Param Name="ApplicationBase" Value="%ExchangeInstallPath%Bin" />
<Param Name="AssemblyName" Value="Microsoft.Exchange.Configuration.ObjectModel.dll" />
<Param Name="PSSessionConfigurationTypeName" Value="Microsoft.Exchange.Configuration.Authorization.ExchangeAuthorizationPlugin" />
<Param Name="PSMaximumReceivedObjectSizeMB" Value="75" />
<Param Name="PSMaximumReceivedDataSizePerCommandMB" Value="500" />
</InitializationParameters>
Далее выполнить IISRESET
!После выполнения работ желательно значения этих атрибутов вернуть в дефолтные.
Если у вас есть вопросы\педложения\пожелания, или вы столкнулись с другим типом ошибки при выполнении подобных действие - добро пожаловать в комментарии.
Alexey Bogomolov,
CTS Support Escalation Engineer, Microsoft
- Anonymous
February 19, 2016
А есть ли что-нибудь подобное для Exchange Online?