Eu tenho um banco de dados acessado por cerca de 50 clientes via TDS sobre TCP, que parece não estar liberando espaço para log. O número de processos permanece em torno dos 50 esperados e alguns deles têm uma vida útil bastante longa (> 120 dias).
O banco de dados agora possui 40 GB de espaço de log (possui apenas dados de 14 GB), 39 GB livres. Devido a limitações de espaço na unidade, eu gostaria de diminuir para algo mais razoável (10gb-ish). Quando executo DBCC SHRINKFILE('db_log', 10000), ele retorna um erro indicando que o final do log está em uso.
Para liberar o acesso ao final do log, tentei colocar o banco de dados no modo de usuário único com o seguinte:
ALTER DATABASE db SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
ALTER DATABASE db SET MULTI_USER
GO
mas o script está retornando a seguinte mensagem repetida centenas de vezes:
Nonqualified transactions are being rolled back. Estimated rollback completion: 100%.
O que me leva a acreditar que, em algum lugar, estou deixando algumas transações não confirmadas. Não conheço nenhum processo que possa abrir intencionalmente tantas transações ao mesmo tempo, por isso acho que elas devem se acumular ao longo do tempo, nunca sendo fechadas.
Pergunta: Como localizo o processo ou script incorreto ou por que o log não está sendo liberado?
sys.dm_tran_active_transactionsestá mostrando 18 transações razoáveis com propósitos compreensíveis. sp_whomostra apenas os processos que eu conheço.
Versão do SQL Server:
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64)
Apr 2 2010 15:48:46
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)
Versão do servidor:
Windows Server 2008 R2 x64 - Datacenter 4 vCPUs, 16 GB de memória, Passagem de disco para dados e log, disco do sistema operacional é VHD
no Hyper-V (Datacenter x64 do Windows Server 2008 R2 SP1) Intel X5650 duplo (6 núcleos, 12 threads a 2,67 GHz) de memória de 72 GB
O hipervisor possui apenas três VMs e não mostra alto uso de recursos. A VM do SQL Server mostra ~ 40% da CPU sob carga e 99% de acertos no cache.