มีวิธีใดในการลด / ลดขนาด tempdb.mdf โดยไม่ต้องรีสตาร์ท SQL Server


15

มีความจำเป็นต้องรีสตาร์ท SQL Server หลังจากที่DBCC SHRINKFILEในtempdb.mdfหรือมีวิธีการอื่น ๆ เพื่อลดขนาดของtempdb.mdfโดยไม่ต้องรีสตาร์ท SQL Server?

กรุณาช่วยตามที่ฉันต้องการสำหรับเซิร์ฟเวอร์ที่ใช้งานจริงและฉันหวังว่าจะลดขนาดลงโดยไม่ต้องหยุดทำงาน


2
DBCC SHRINKFILE ไม่จำเป็นต้องเริ่มบริการใหม่
เกร็ก

คุณไม่สามารถลดขนาด tempdb ขณะใช้งานได้ และใช่มีวิธีแก้ปัญหาสำหรับเรื่องนี้ แต่ก็ไม่ค่อยสะอาดและมีผลข้างเคียง
Ionic

คำตอบ:


15

คุณสามารถทำได้เช่นนี้:

-- write everything from your buffers to the disc!
CHECKPOINT; 
GO
-- Clean all buffers and caches
DBCC DROPCLEANBUFFERS; 
DBCC FREEPROCCACHE;
DBCC FREESYSTEMCACHE('ALL');
DBCC FREESESSIONCACHE;
GO
-- Now shrink the file to your desired size
DBCC SHRINKFILE (TEMPDEV, 40960);
-- Make sure that there is no running transaction which uses the tempdb while shrinking!
-- This is most trickiest part of it all.
GO

ขั้นตอนสุดท้ายนั้นยากที่สุด ในระหว่างกระบวนการย่อขนาดไม่มีการดำเนินการอื่นใดที่ควรใช้ tempdb เนื่องจากอาจทำให้การSHRINKFILEดำเนินการของคุณถูกยกเลิกได้ เนื่องจากความจริงที่ว่า tempdb นั้นค่อนข้างง่ายต่อการหดจึงไม่ควรใช้เวลานานในการย่อขนาด

ระวังว่านี่เป็นสิ่งที่ "soft restart" ทุกอย่างจะถูกลบออกจากบัฟเฟอร์และเขียนไปยังแผ่นดิสก์ นี่หมายถึงผลกระทบต่อระบบย่อย I / O ของคุณ (เขียน) เนื่องจากต้องจัดการการดำเนินการเขียนทั้งหมด หลังจากนั้นคุณสามารถลดขนาดไฟล์ (ซึ่งมีผลต่อประสิทธิภาพการอ่านและเขียน) และในตอนท้ายกระบวนการทั้งหมดที่สืบค้นตารางใด ๆ จะต้องดึงข้อมูลกลับจากระบบย่อย I / O ลงในบัฟเฟอร์ สิ่งนี้อาจเจ็บมากกว่าการรีสตาร์ท

หากคุณใช้ระบบพัฒนาคุณควรรีสตาร์ทเครื่องแทนวิธีนี้ แต่ในบางระบบการผลิตที่ไม่มีพันธมิตรล้มเหลวนี่อาจเป็นประโยชน์


ขอบคุณ Ionic สำหรับคำอธิบายที่ดี tempdb.mdf มีขนาด 46 GB ในกรณีของฉัน หากไม่มีธุรกรรมเกิดขึ้นฉันสามารถย่อให้เหลือ 100% กรุณาแนะนำ
Manii

ใช่ 40960MB เป็นเพียงตัวอย่าง ในระบบของฉัน tempdb ทำงานตามปกติที่ ~ 50GB และในบางกรณีจะเพิ่มขึ้นเป็น 200GB :-)
Ionic

<pre> ฉันเรียกใช้คิวรีเป็น DBCC SHRINKFILE (tempdev, 1024); </b> </b> และทำให้พื้นที่ว่างประสบความสำเร็จ แต่ฉันเรียกใช้งานได้อีกครั้ง </b> </b> ฉันเรียกใช้แบบสอบถามเป็น DBCC SHRINKFILE (tempdev, 30000); </b> </b> และให้ผลลัพธ์กับฉันดังนี้: </b> </b> ฟิลด์ DbId ขนาดปัจจุบันขนาดขั้นต่ำสุดหน้าที่ใช้งานประมาณ 2 2 5699352 1024 696 696 </b> </b> แต่ขนาด
เทมเพลตที่ทำเครื่องหมาย

ข้อความนี้อาจเกิดขึ้นหากธุรกรรมใช้ tempdb ขณะลดขนาด อาจเป็นได้ว่าขนาดการหดที่กำหนดไว้ของคุณ (~ 30GB) เกินขีด จำกัด ฟรีของ tempdb ของคุณ
Ionic

1

คุณสามารถทำตามขั้นตอนด้านล่างเท่านั้น

USE tempdb;
GO;
dbcc freeproccache;
DBCC SHRINKFILE (tempdb_file_name, memory_in_MB);
GO;

คำตอบของคุณแตกต่างจากคำตอบข้างต้นอย่างไร
Kin Shah

1
สวัสดี Kin ขนาดไฟล์ Tempdb จะลดลงด้วย DBCC FREEPROCCACHE; จากนั้นย่อขนาดไฟล์ tempdb เราไม่ต้องการคำสั่งด้านล่างสำหรับการลดขนาด tempdb DROPCLEANBUFFERS DBCC; DBCC FREESYSTEMCACHE ('ทั้งหมด'); DBREFREESESSIONCACHE;
JERRY

1
นี่เป็นคำตอบที่ง่ายกว่าในกรณีส่วนใหญ่จำเป็นต้องมีเพียง DBCC FREEPROCCACHE เพื่อให้คุณลดขนาด tempdb ดูคำถามที่เกี่ยวข้อง
James Jenkins
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.