Defrag em Databases: Como desfragmentar databases no Exchange 2010

Conforme as Databases em nosso Exchange Server vão populando, as mesmas irão manter um rítmo contínuo de aumento em espaço em disco; Ainda que apaguemos dados nestas databases ela não diminuem de tamanho ( Por exemplo você possui uma database com 10 gb e deletou uma mailbox de 1 gb o tamanho total da sua database não reduzirá para 9 gb automaticamente), entretanto os espaços " liberados " ficam identificados como espaço disponível;

Então como podemos recuperar este espaço?
Encontraremos prós e contras em cada umas das opções

1) Criar uma nova DataBase e mover todas as caixas de correio para esse banco de dados 
Isto fará com que a nova DataBase tenha somente o espaço utilizado como alocado;
Este método possui menos riscos, pode ser menos prejudicial como um todo, mas vai gerar um monte de log de transações que precisa ser mantido sob controle por isso pode demorar mais tempo (ou seja, várias noites / fins de semana para migrar );

2) Executar uma desfragmentação offline do banco de dados existente para reduzir o arquivo;
Para realizar uma desfragmentação off-line será necessário forçar o status da Database para Down e causará indisponibilidade dos usuários; 

VERIFICANDO O ESPAÇO DAS DATABASES:
Para realizarmos um defrag precisamos ter 110% do espaço atual utilizado pela database disponível na unidade em que ela se encontra ou para o qual iremos copiar o nosso arquivo temporário;

Para verificar o espaço total utilizado e o espaço " disponível " utilizamos o seguinte cmdlet:

[PS] C:\>Get-MailboxDatabase -Status | ft name,databasesize,availablenewmailboxspace -auto

Name             DatabaseSize                    AvailableNewMailboxSpace
----             ------------                    ------------------------
Edefensedb01         10.79 GB ( bytes)          9.544 GB ( bytes)
Edefensedb02         14.65 GB ( bytes)          3.696 GB ( bytes)
Edefensedb03         510.18 MB ( bytes)         134.6 MB ( bytes)
Vamos abrir o nosso Shell do Exchange e navegar até o diretório das Databases
cd D:\DataBases\Edefensedb01
Executar um  Dismount-Database na database que iremos rodar o defrag
Dismount-Database Edefensedb01
Executaremos o seguinte cmdlet para iniciarmos o processo: 

[PS] D:\DataBases\Edefensedb01> eseutil /d Edefensedb01.edb /t C:\defrag\temp.edb

Extensible Storage Engine Utilities for Microsoft(R) Exchange Server
Version 14.01
Copyright (C) Microsoft Corporation. All Rights Reserved.

Initiating DEFRAGMENTATION mode...
            Database: Edefensedb01.db

                  Defragmentation Status (% complete)

          0    10   20   30   40   50   60   70   80   90  100
          |----|----|----|----|----|----|----|----|----|----|
          ...................................................

Moving 'C:\defrag\temp.edb' to 'Edefensedb01.edb'...
                     File Copy Status (% complete)

          0    10   20   30   40   50   60   70   80   90  100
          |----|----|----|----|----|----|----|----|----|----|
          ...................................................

Note:
  It is recommended that you immediately perform a full backup
  of this database. If you restore a backup made before the
  defragmentation, the database will be rolled back to the state
  it was in at the time of that backup.

Operation completed successfully in 9756.218 seconds.
Executamos um Mount-Database 
mount-Database Edefensedb01
Agora podemos verificar o status da Database novamente e veremos que a Database está ocupando menos espaço em disco; 
Get-MailboxDatabase -Status | ft name,databasesize,availablenewmailboxspace -auto

Name             DatabaseSize                    AvailableNewMailboxSpace
----             ------------                    ------------------------
Edefensedb01         1.79 GB ( bytes)           5.443 mb ( bytes)
Edefensedb02         14.65 GB ( bytes)          3.696 GB ( bytes)
Edefensedb03         510.18 MB ( bytes)         134.6 MB ( bytes)
ERROS CONHECIDOS:
Durante a execução dos cmdlets alguns erros podem ser apresentados, segue a relação de alguns:

JET_bitDbOverwriteExisting
By default, if JetCreateDatabase is called and the database already exists, the API call will fail and the original database will not be overwritten. JET_bitDbOverwriteExisting changes this behavior, and the old database will be overwritten with a new one. Windows XP and later.

JET_bitDbRecoveryOff
JET_bitDbRecoveryOff turns off logging. Setting this bit loses the ability to replay log files and recover the database to a consistent usable state after a catastrophic event.

JET_bitDbShadowingOff
Setting JET_bitDbShadowingOff will disable the duplication of some internal database structures (shadowing). The duplication of these structures is done for resiliency, so setting JET_bitDbShadowingOff will remove that resiliency.

JET_errSuccess
The operation completed successfully.

JET_errDatabaseDuplicate
The database named in szFilename already exists. When this error is returned, the database does not get attached.

JET_errDatabaseInUse
Can be returned if exclusive access was requested, but could not be granted, or if another session has already opened the database exclusively.

JET_errDatabaseInvalidPages
Returned when cpgDatabaseSizeMax is larger than the maximum number of pages allowed in a database. The current maximum is 2147483646 (0x7ffffffe).

JET_errDatabaseInvalidPath
An invalid path was given in szFilenameszFilename must be non-NULL. By default, szFilename must point to a directory that exists. The path will be created if JET_paramCreatePathIfNotExist is set (See JetSetSystemParameter).

JET_errDatabaseLocked
Indicates that another session has already opened the database exclusively (using JET_bitDbExclusive).

JET_errDatabaseNotFound
The database was not previously attached (See JetAttachDatabase).

JET_errDatabaseSharingViolation
The database file has already been attached by a different session.

JET_errInTransaction
An attempt was made to create a database while in a transaction.

JET_errInvalidDatabase
An attempt was made to open a file that is not a valid database file.

JET_errOneDatabasePerSession
An attempt was made to open more than one database, and JET_paramOneDatabasePerSession was set. See Database Parameters.

JET_errOutOfMemory
The operation failed because memory could not be allocated.

JET_errTooManyAttachedDatabases
Only a finite number of database can be attached per instance. The limit is currently seven databases per instance.

OBS: Artigo utilizado para ambientes SEM DAG 

Wellington Agápto é Sócio Diretor da Edefense Segurança Digital, empresa com foco em Teste de Invasão e Análise de vulnerabilidades, Consultor UC em uma Partner Microsoft, Engenheiro Microsoft especializado em Unified Communications, Active Directory, Microsoft Lync Server e Exchange Server, Certificado Cisco CCNA, ITIL, MCP, MCSA, MCSE, MCSE Security, MCTS Lync, MCTS AD, MTA Lync 2013 Cisco, ITIL, MCSO, Security+, ISO 27002, Cobit, MCSE Security, Autor de artigos em sites especializados sobre tecnologia Microsoftsegurança da informação e empreendedorismo.

CONVERSATION

Inscreva-se