Identificando caixas de correio com corrupção Exchange 2013

4

Estamos nos preparando para nos livrar do Exchange no local e estamos migrando de um provedor de hospedagem terceirizado para o Office 365. Estamos executando uma versão totalmente corrigida do Exchange 2013, no topo do Server 2012, também totalmente corrigida.

Durante a migração das caixas de correio de teste, descobrimos que muitas caixas de correio em vários bancos de dados estão corrompidas. Mais informações sobre a causa podem ser encontradas AQUI . Essencialmente: a SAN que armazena nossa VM do Exchange é sobrecarregada e rotineiramente tem E / S que espera em excesso de 5 segundos, e a velocidade de leitura sustentada raramente passa de 500KBps.

As velocidades lentas seriam suficientes para causar perda significativa de tempo durante a migração, mas quando são encontradas caixas de correio com corrupção, a migração de 1 GB de dados passa de um caso de 2 a 3 horas para um de 10 a 20 horas. Cada uma das caixas de correio com problemas (que encontrei até agora) fornece mensagens semelhantes às abaixo quando verificadas em 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>

A execução de New-MailboxRepairRequest em todos os bancos de dados identificou algum dano e o reparou, mas não todos. Eu não consigo encontrar uma maneira de obter Get-MailboxStatistics para registrar o fato de que há algo quebrado em cada uma dessas caixas de correio, embora eu tenho certeza que existe um. Mover caixas de correio de um banco de dados para outro parece corrigir o problema. Nós temos ~ 50 DBs, e cerca de 50 usuários por DB, então passar por isso manualmente está fora.

O que eu quero fazer é, via PowerShell (por favor pseudo código preguiçoso por favor):

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

No entanto, não consigo descobrir como capturar o texto "Aviso: isso está corrompido" em Get-MailboxStatistics, e o objeto resultante retornado não tem nada que mostre que ele está quebrado.

Eu só preciso pegar o aviso e presumir que tudo que reclama de inconsistências pode ser corrigido dessa forma, depois volte e verifique a lista de caixas de correio que realmente têm um problema depois de terem sido removidas e voltadas para ver se as coisas ainda estão quebradas? Existe uma maneira melhor de fazer o que preciso fazer?

A substituição da SAN está fora do campo de possibilidades, portanto, está corrigindo outras causas subjacentes.

    
por RobbieCrash 05.05.2015 / 20:25

1 resposta

0

Para isolar as mensagens dos cmdlets existentes do PowerShell, você pode usar

Variável de advertência A maioria dos cmdlets padrão tem o parâmetro -WarningVariable disponível, você pode combinar isso com -WarningAction SilentlyContinue para suprimir o aviso e armazenar sua saída na variável, que pode ser manipulada ou exibida da maneira que desejar. Então você poderia rodar este

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

Tentei replicar um evento de aviso para verificar o acima, mas não consegui acessar o cmdlet MailboxStats. Acima deve funcionar - mas não foi testado neste contexto.

    
por 26.04.2016 / 02:33