ฉันมีฐานข้อมูลที่เข้าถึงได้โดยไคลเอนต์ประมาณ 50 คนผ่าน TDS ผ่าน TCP ซึ่งดูเหมือนจะไม่ปล่อยพื้นที่บันทึก จำนวนกระบวนการอยู่รอบ 50 ที่คาดไว้และบางกระบวนการค่อนข้างยาวนาน (> 120 วัน)
ขณะนี้ฐานข้อมูลมีพื้นที่บันทึก 40 gb (มีเพียง 14 gb data), 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 - Datacenter 4 vCPUs, หน่วยความจำ 16GB, ผ่านดิสก์สำหรับข้อมูลและบันทึก, ดิสก์ระบบปฏิบัติการคือ VHD
บน Hyper-V (Windows Server 2008 R2 SP1 x 64 Datacenter) Dual Intel X5650 (6 คอร์, 12 เธรดที่ 2.67GHz) หน่วยความจำ 72 GB
Hypervisor มีสาม VMs เท่านั้นและไม่แสดงการใช้ทรัพยากรสูง SQL Server VM แสดง ~ 40% CPU ภายใต้โหลดและฮิตแคช 99%