在迁移测试邮箱期间,我们发现多个数据库中的许多邮箱已损坏.有关原因的更多信息可以在HERE找到.基本上:存储我们的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中捕获“Warning:this is broken”文本,并且返回的结果对象中没有任何显示它已损坏的内容.
我是否只需要捕获警告并假设所有抱怨不一致的内容都可以通过这种方式修复,然后返回并检查实际上有问题的邮箱列表,这些邮箱在移出后再返回以查看是否仍然存在问题破碎?有没有更好的方法来做我需要做的事情?
更换SAN不在可能的范围内,因此解决任何其他根本原因.
警告变量
大多数默认cmdlet都具有-WarningVariable参数可用,您可以将其与-WarningAction SilentlyContinue结合使用以抑制警告并将其输出存储到变量中,然后可以根据需要对其进行操作或显示.所以你可以运行它
$mailBox | Get-MailBoxStatistics -WarningAction SilentlyContinue -WarningVariable MyWarning; if($MyWarning -like '*corrupted*'){ Write-Host "possible corruption"; }
我试图复制一个警告事件给doulbe检查上面但不能通过MailBoxStats cmdlet.上面应该工作 – 但在这种情况下它没有经过测试.