sexta-feira, 21 de junho de 2019

Diminuindo o tamanho do banco de dados Dynamics AX 2012 R3

Disclaimer: Antes de mais nada é bom alertar que a solução abaixo resolveu um problema que eu tinha e não quer dizer que é uma solução pronta, utilize as orientações por sua conta e risco.


Temos uma implementação do Dynamics AX 2012 R3 a pelo menos 17 meses e temos percebido o crescimento exponencial do volume do banco de dados e com isso trouxe alguns transtornos significativos:

1. Disponibilidade de armazenamento para o banco de dados da aplicação;
2. Disponibilidade de armazenamento do backup do banco de dados;
3. Disponibilidade de armazenamento para bases de homologação e desenvolvimento;
4. Aumento do tempo de restauração de um ambiente (seja ele homologação, ou disaster recovery);
5. Aumento do tempo de realização de backup;
6. Necessidade de banda larga maior para tráfego de backup em nuvem (se aplicável);

Para diminuirmos significamente o tamanho do banco, primeiro é preciso identificar quais são as tabelas que estão impactando este crescimento, a consulta abaixo demonstra qual é o volume de informação em cada tabela do banco de dados:

SELECT
    t.NAME AS Entidade,
    p.rows AS Registros,
    SUM(a.total_pages) * 8 AS EspacoTotalKB,
    SUM(a.used_pages) * 8 AS EspacoUsadoKB,
    (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS EspacoNaoUsadoKB
FROM
    sys.tables t
INNER JOIN
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN
    sys.allocation_units a ON p.partition_id = a.container_id
LEFT OUTER JOIN
    sys.schemas s ON t.schema_id = s.schema_id
WHERE
    t.NAME NOT LIKE 'dt%'
    AND t.is_ms_shipped = 0
GROUP BY
    t.Name, s.Name, p.Rows
ORDER BY
    Registros DESC

No meu caso haviam quatro tabelas que estavam com um volume muito grande e que haveria a necessidade de analisar o que poderia ser feito:

1. SYSDATABASELOG
2. AIFDOCUMENTLOG
3. AIFMESSAGELOG
4. AIFRESPONSE

Análise e descarte:

SYSDATABASELOG
Negociado com as áreas de negócio a periodicidade necessária de guarda dos registros, decidido que parâmetros deveriam ter os logs indefinidamente e transações poderiam ter o período de apenas seis meses, exceto transações abertas de clientes e fornecedores, que também não teriam prazo definido;

AIFDOCUMENTLOG
Mantidas apenas as transações da última semana (Utilizado o campo CreatedDateTime);

AIFMESSAGELOG
Mantidas apenas as transações da última semana (Utilizado o campo CreatedDateTime)

AIFRESPONSE
Mantidas apenas as transações da última semana (Utilizado o campo CreatedDateTime)

Todo o processo de limpeza usando "DELETE FROM" do SQL é bem demorado e para alguns casos, como em uma restauração de ambiente de homologação, foi utilizado o comando "TRUNCATE TABLE" para todas as tabelas acima.

Após a limpeza dos registros desnecessários, para que o volume do banco de dados em disco diminua, é necessário realizar um "SHRINK" do banco:

Redução do arquivo de banco de dados
Usando script:

USE [NOME DA INSTÂNCIA]
GO
DBCC SHRINKFILE (N'NOME DO BANCO DO AX' , 0, TRUNCATEONLY)
GO
DBCC SHRINKFILE (N'NOME DO BANCO DO AX' , TAMANHO)
GO

Usando menus do sql server:

1. Botão direito sobre o banco de dados;
2. Clicar em tarefas/reduzir/arquivos;
3. Em tipo de arquivo, selecionar "dados"
4. Em ação de redução, colocar em reorganizar páginas antes de liberar espaço não utilizado e em "reduzir arquivo para" colocar um pouco a mais do valor mínimo indicado;

As tarefas acima irão demorar algum tempo e quando executei escolhi um horário que os usuários não estavam usando o ERP.

Nenhum comentário:

Postar um comentário