我有一个大约50个客户端通过TCP的TDS访问的数据库,该数据库似乎没有释放日志空间。进程的数量保持在预期的50左右,其中一些进程的寿命很长(> 120天)。
现在,数据库的日志空间为40 gb(仅包含14 gb数据),空闲空间为39 gb。由于驱动器上的空间限制,我想缩小到更合理的大小(10gb-ish)。当我执行时DBCC SHRINKFILE('db_log', 10000)
,它返回一个错误,表示正在使用日志末尾。
为了释放对日志结尾的访问,我尝试通过以下方式将数据库置于单用户模式:
ALTER DATABASE db SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
ALTER DATABASE db SET MULTI_USER
GO
但脚本返回的消息重复了数百次:
Nonqualified transactions are being rolled back. Estimated rollback completion: 100%.
这使我相信,在某个地方,我没有进行某些事务。我不知道有什么过程会故意一次打开这么多交易,因此我认为它们必须随着时间的推移而积累,永远不要关闭。
问题:如何找到有问题的进程或脚本,或者为什么不发布日志?
sys.dm_tran_active_transactions
显示了合理的18笔交易,目的可以理解。 sp_who
仅显示我知道的过程。
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)
服务器版本:
Windows Server 2008 R2 x64-数据中心4个vCPU,16GB内存,通过磁盘进行数据和日志传递,OS磁盘为VHD
在Hyper-V(Windows Server 2008 R2 SP1 x64数据中心)上双Intel X5650(6核,2.67GHz上有12个线程)72 GB内存
系统管理程序仅具有三个VM,并且不显示高资源使用率。SQL Server VM显示负载下约40%的CPU和99%的缓存命中率。