ログスペースを解放していないように見えるTDS over TCPを介して約50のクライアントからアクセスされるデータベースがあります。プロセスの数は予想される50前後にとどまり、それらのいくつかは非常に長寿命(> 120日)です。
これで、データベースのログ領域に40 GB(データは14 GBのみ)、39 GBが解放されました。ドライブのスペースの制限により、私はもっと妥当なもの(10GBくらい)に縮小したいと思います。を実行する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、16 GBメモリ、データとログ用のパススルーディスク、OSディスクはVHD
Hyper-V(Windows Server 2008 R2 SP1 x64 Datacenter)デュアルIntel X5650(6コア、2.67 GHzで12スレッド)72 GBメモリ
ハイパーバイザーにはVMが3つしかなく、リソースの使用率は高くありません。SQL Server VMは、負荷がかかっている状態で最大40%のCPUと99%のキャッシュヒットを示しています。