识别损坏的 Exchange 2013 邮箱

识别损坏的 Exchange 2013 邮箱

我们正准备摆脱内部部署的 Exchange,并从外包托管服务提供商迁移到 Office 365。我们正在运行完全修补的 Exchange 2013 版本,以及同样经过完全修补的 Server 2012。

在迁移测试邮箱期间,我们发现多个数据库中的许多邮箱都已损坏。有关原因的更多信息,请参见这里。本质上:存储我们的 Exchange VM 的 SAN 已超额认购,并且 I/O 等待时间通常超过 5 秒,并且持续读取速度很少超过 500KBps。

缓慢的速度足以导致迁移过程中浪费大量时间,但是当遇到损坏的邮箱时,迁移 1GB 数据的时间将从 2-3 小时增加到 10-20 小时。每个有问题的邮箱(到目前为止我发现的)在对照 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>

对所有数据库运行 New-MailboxRepairRequest 发现一些损坏并进行了修复,但不是全部。我似乎找不到让 Get-MailboxStatistics 记录每个邮箱中都有损坏的事实的方法,尽管我确信有一个邮箱。将邮箱从一个数据库移动到另一个数据库似乎可以解决问题。我们有大约 50 个数据库,每个数据库大约有 50 个用户,因此手动完成这项工作是不可能的。

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

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

但是,我不知道如何从 Get-MailboxStatistics 中捕获“警告:这已损坏”文本,并且返回的结果对象中没有任何表明它已损坏的内容。

我是否只需要捕捉警告并假设所有抱怨不一致的问题都可以通过这种方式修复,然后返回并检查在移出和移回后实际有问题的邮箱列表,看看是否仍然有问题?有没有更好的方法来完成我需要做的事情?

更换 SAN 是不可能的,修复任何其他根本原因也是不可能的。

答案1

要将消息与现有的 PowerShell cmdlet 隔离,您可以使用

警告变量 大多数默认 cmdlet 都有-WarningVariable可用的参数,您可以将其与-WarningAction SilentlyContinue抑制警告并将其输出存储到变量中,然后可以按照您的喜好对其进行操作或显示。因此,您可以运行此

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

我尝试复制警告事件以再次检查上述内容,但无法通过 MailboxStats cmdlet。上述操作应该可行 - 但尚未在此上下文中测试。

相关内容