Um pouco de cabeça aqui.
Eu tenho um banco de dados com menos de 1 GB de dados, mas um arquivo de log de 40 GB. Os logs de transação são copiados diariamente e não há muita atividade neste banco de dados; aproximadamente uma vez por semana, ele registra novas informações de folha de pagamento e, em seguida, regurgita esses dados para fins de relatório. O banco de dados está definido como Encolhimento Automático.
em execução sp_spaceused @updateusage = true
fornece as seguintes informações:
database_name database_size unallocated space
PayrollImports 39412.06 MB 105.00 MB
reserved data index_size unused
321728 KB 278640 KB 42816 KB 272 KB
a execução DBCC shrinkfile (N'PayrollImports_log', 1 , notruncate)
produz o seguinte:
DbId FileId CurrentSize MinimumSize UsedPages EstimatedPages
19 2 4991088 3456 4991088 3456
...a discrepância entre o UsedPages
e o EstimatedPages
é confusa, mas continuo DBCC shrinkfile (N'PayrollImports_log', 1 , truncateonly)
e obtenho:
DbId FileId CurrentSize MinimumSize UsedPages EstimatedPages
19 2 4991088 3456 4991088 3456
Nada mudou neste ponto. O arquivo de log ainda tem 40 GB. Então eu acho que talvez eu tenha alguma transação em aberto. A execução dbcc opentran
deve verificar:
No active open transactions.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
Porcaria. Bem, talvez meus índices estejam fragmentados. Vou desfragmentá-los sp_msForEachTable 'DBCC indexdefrag([PayrollImports], ''?'')'
e tentar encolher novamente:
DbId FileId CurrentSize MinimumSize UsedPages EstimatedPages
19 2 4991088 3456 4991088 3456
Ainda nada mudou. Ok, que tal eu reindexar com sp_msForEachTable 'DBCC dbreindex([?])'
?
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
...e agora temos:
DbId FileId CurrentSize MinimumSize UsedPages EstimatedPages
19 2 4991088 3456 4991088 3456
nenhuma mudança. Tudo bem, que tal sp_msForEachTable 'ALTER INDEX ALL ON [PayrollImports].[?] REBUILD WITH (FILLFACTOR = 10)'
?
Imediatamente, isso falha com:
Cannot find the object "(One of my tables)" because it does not exist or you do not have permissions.
Huh? Está lá, tudo bem. Eu faço um select top 10 * from (My table)
e sai vazio. Bem, isso não está certo. Esta é uma tabela de pesquisa que deve ter mais de 200 linhas. Isso é um problema de corrupção de dados, talvez? Coleto os dados do meu ambiente de desenvolvimento e os insiro novamente.
Mas estou sem ideias. Eu não posso encolher esta coisa. O que mais posso tentar? Por que minhas UsedPages são incrivelmente mais altas que minhas EstimatedPages? O que está acontecendo aqui?
Verifique sua saída
DBCC LOGINFO
dentro do contexto de seu banco de dados. Isso mostrará o status de todos os VLFs no arquivo de log. Sua operação de redução não reduzirá o arquivo de log além do último ativo (Status=2). Como os VLFs são usados de forma seqüencial, round-robin, você precisará executar backups de log de transações o suficiente até que seus VLFs ativos estejam no ponto físico no arquivo que você deseja reduzir.Embora você afirme que o banco de dados não está muito ativo, os backups de log de transações uma vez por dia parecem muito pouco frequentes e, dependendo do tipo de transações executadas nesse banco de dados, podem estar contribuindo para o crescimento contínuo desse banco de dados. Eu recomendaria executar seus backups de log pelo menos a cada hora. Se você não precisa desse tipo de recuperação em seu banco de dados e só precisa restaurar para algum momento nas últimas 24 horas, sugiro que você converta o banco de dados para o
SIMPLE
modo e faça um backup completo uma vez por dia.Mike Walsh fornece uma explicação detalhada aqui .
Sua reindexação fará muito pouco para reduzir ou permitir que o arquivo diminua e, de fato, pode prejudicá-lo. Isso ocorre porque a reindexação criará transações adicionais em seu log que ficarão ativas até que você execute um backup de log.
Além disso, algumas recomendações de práticas recomendadas:
truncate_only
Isso basicamente torna seu log inútil para fins de recuperação. Você também pode usar oSIMPLE
modo e backups completos neste momento.