识别具有损坏的邮箱Exchange 2013

我们正在准备摆脱Exchange本地化,并正在从外包托pipe服务提供商迁移到Office 365。我们正在运行完全修补版本的Exchange 2013,在Server 2012上,也完全修补。

在迁移testing邮箱的过程中,我们发现跨多个数据库的许多邮箱都已损坏。 有关原因的更多信息可以在这里find。 从本质上讲,存储我们的Exchange虚拟机的SAN超额订阅,并经常有I / O等待超过5秒,持续读取速度很less通过500KBps。

缓慢的速度足以在迁移过程中浪费大量时间,但遇到损坏的邮箱时,将1GB数据从2-3小时迁移到10-20小时。 每个有问题的邮箱(到目前为止我已经find)在对get-mailboxstatistics进行检查时会给出类似于以下的邮件:

WARNING: The object <GUID> has been corrupted, and it's in an inconsistent state. The following validation errors happened: WARNING: Cannot extract the property value of 'DeletedItemCount'. Source: PropTag(DeletedMsgCount), PropType(Int), RawValue(-2), RawValueType(System.Int32). Target: Type(System.Nullable`1[System.UInt32]), IsMultiValued(False). Error Details: <n/a> 

针对所有数据库运行新邮箱修复请求确定了一些损坏并修复了它,但不是全部。 我似乎无法find一种方法来获取get-mailboxstatisticslogging每个这些邮箱中有东西被破坏的事实,但我确信有一个。 将邮箱从一个数据库移动到另一个似乎解决了这个问题。 我们有大约50个数据库,每个数据库大约有50个用户,所以手动完成。

我想要做的是通过PowerShell(请原谅懒惰的伪代码):

 foreach ($mailbox in $database){ if get-mailboxstatisics -eq $corrupted { move $mailbox to $otherdb wait move $mailbox back to $database} } 

但是,我无法弄清楚如何从get-mailboxstatistics中捕获“Warning:this is broken”这个文本,并且返回的结果对象中没有任何内容显示它已经损坏。

我只需要抓住警告,并假设所有抱怨不一致的东西都可以通过这种方式来解决,然后回去查看实际存在问题的邮箱列表,然后再查看是否仍然存在破碎? 有没有更好的方法来做我需要做的事情?

replaceSAN不在可能的范围之内,因此修复任何其他的根本原因。

从可以使用的现有PowerShell cmdlet中分离消息

警告variables大多数默认的cmdlet都有-WarningVariable参数可用,您可以将其与-WarningAction SilentlyContinue结合使用来抑制警告并将其输出存储到variables中,然后可以对其进行操作或显示。 所以你可以运行这个

 $mailbox | Get-MailboxStatistics -WarningAction SilentlyContinue -WarningVariable MyWarning; if($MyWarning -like '*corrupted*'){ Write-Host "possible corruption"; } 

我试图复制一个警告事件doulbe检查上面,但不能通过MailboxStats cmdlet。 以上应该工作 – 但在这方面没有经过testing。