ฉันจะลดขนาดของไฟล์บันทึกของ SQL Server ได้อย่างไร


10

ฉันไม่สามารถหาวิธีย่อขนาดของไฟล์ ldf ฐานข้อมูล

DBA บอกว่าฉันควรใช้ backup log dbname with truncate_only

และในขณะที่ดูเหมือนว่าจะดำเนินการอย่างถูกต้องใน SQL Query Analyzer ไฟล์ ldf ยังคงเกิน 2 Gb

** การชี้แจงตามความคิดเห็นและคำตอบด้านล่าง *** ฐานข้อมูลที่เป็นปัญหาคือฐานข้อมูลอยู่บนแล็ปท็อปของฉันและฉันใช้สำหรับกระบวนการพัฒนาเท่านั้น ล็อกไฟล์เพิ่มขึ้นจนถึงจุดที่ทำให้ดิสก์เต็ม ไม่มีความเสี่ยงในการผลิตที่เกี่ยวข้อง ฉันเข้าใจว่าวิธีการในคำถามที่ฉันถามและคำตอบที่ฉันยอมรับมีความเสี่ยงในสภาพแวดล้อมการผลิต *


นี่เป็นคำถามที่ซ้ำกันหรือไม่
JamesRyan

ฉันค้นหาและพบเพียงคนเดียวที่ถามคำถามเกี่ยวกับเมื่อ SHRINKFILE ล้มเหลว ในเวลานั้นมันไม่สมเหตุสมผลดังนั้นฉันจึงโพสต์คำถามนี้ ฉันได้พิจารณาลบคำถาม แต่แล้วฉันคิดว่าจะมีคนอื่นที่อยู่ในเรือลำเดียวกัน หากคุณสามารถค้นหาคำถามที่ซ้ำกัน (ที่จริงถามคำถามเดียวกันไม่ใช่คำถามที่คล้ายกัน) ฉันยินดีที่จะลบคำถามนี้
Ron Tuffin

มีคำตอบประมาณ 8 คำตอบในหน้าแรกของการค้นหาที่รวมไว้ แต่ฉันคิดว่าคุณต้องรู้ว่าคุณกำลังมองหาอะไร ฉันเห็นมันเป็นประจำเพื่อเป็นส่วนหนึ่งของคำตอบฉันรู้สึกประหลาดใจที่ไม่ได้ถูกถามในลักษณะตรงไปตรงมา
JamesRyan

คำตอบนั้นขึ้นอยู่กับตัวเลือกการกู้คืนฐานข้อมูล: ง่าย ๆ หรือเต็ม?
ริชาร์ด

1
ขอบคุณสำหรับการชี้แจงรอน เนื่องจากเป็นฐานข้อมูล dev คุณจะต้องเปลี่ยนรูปแบบการกู้คืนเป็น SIMPLE นอกเหนือจากการลดขนาดไฟล์บันทึกลงมิฉะนั้นปัญหาของคุณจะเกิดขึ้นอีก
BradC

คำตอบ:


11

โอ้หนังสยองขวัญ! กรุณาหยุดบอกคนพวกเขาควรลดขนาดไฟล์บันทึกของพวกเขา!

หากคุณได้รับตัวเองในสถานการณ์นี้กรณีต่อไปนี้อย่างใดอย่างหนึ่งอาจเป็นไปได้มาก:

  1. ฐานข้อมูลของคุณอยู่ในโหมดการกู้คืนแบบเต็มและควรจะอยู่ในโหมดง่าย ๆ
  2. ฐานข้อมูลของคุณอยู่ในโหมดการกู้คืนเต็มและคุณควรทำการสำรองข้อมูลบันทึกปกติ
  3. ฐานข้อมูลของคุณอยู่ในโหมดการกู้คืนเต็มและการสำรองข้อมูลบันทึกของคุณล้มเหลวด้วยเหตุผลบางอย่าง
  4. คุณกำลังเรียกใช้ธุรกรรมขนาดใหญ่ที่มีขนาดใหญ่และมีขนาดใหญ่

คำตอบสำหรับแต่ละข้อมีดังนี้:

หาก (1) จากนั้นสลับฐานข้อมูลไปที่โหมดง่าย ๆ
หาก (2) จากนั้นกำหนดเวลาการสำรองข้อมูลบันทึกปกติ
หาก (3) จากนั้นแก้ไขการสำรองข้อมูลบันทึกตามกำหนดเวลาของคุณ
หาก (4) จากนั้นเพียงแค่ไม่ทำเช่นนั้น :) ทำงานเป็นกลุ่มเล็ก ๆ

โปรดทราบว่าไม่มีสิ่งเหล่านี้ต้องการการใช้ (คัดค้าน) "บันทึกการสำรองข้อมูล dbname ด้วย truncate_only"

แต่เมื่อคุณล้างไฟล์บันทึกโดยใช้หนึ่งในเทคนิคข้างต้นแล้วลดขนาดบันทึก (ว่างเปล่า) ด้วย:

DBCC SHRINKFILE ('log logical name', 2000)

ระบุขนาดสุดท้ายที่เหมาะสมเสมอมิฉะนั้นจะลดขนาดลงเหลือเกือบ 0 และครั้งต่อไปที่จำเป็นจะต้องใช้เวลาในการเติบโต


มันเลวร้ายเกินไปคำตอบที่ยอมรับนั้นรวดเร็วมาก นี่เป็นหนึ่งในคำถามที่ฉันใช้เพื่อกำจัดผู้ดูแลระบบ SQL ระหว่างการสัมภาษณ์ หากพวกเขากลับมาพร้อมกับการสำรองข้อมูลด้วย truncate_only ที่นับเป็น 2 ตีออกจากค้างคาว
Jim B

2
ฉันยอมรับว่ามันเป็นสิ่งสุดท้ายที่แน่นอนที่ต้องทำหดไฟล์ การบำรุงรักษาที่ถูกต้องไม่จำเป็นสำหรับสิ่งนี้ แต่เมื่อมันใหญ่และคุณต้องการมันเล็กลงคุณต้องหดมัน อย่างไรก็ตามเมื่อทำการย่อขนาดจะเป็นการดีที่จะย่อขนาดไฟล์ให้เล็กที่สุดเท่าที่จะทำได้จากนั้นขยายไฟล์ให้มีขนาดที่ถูกต้องโดยเพิ่มขึ้นทีละ 8GB สิ่งนี้จะปรับจำนวน VLFs ให้เหมาะสมในไฟล์ See - sqlskills.com/BLOGS/KIMBERLY/post/...
Brian Knight

1
ลิงก์ที่น่าสนใจดูเหมือนว่าจะมีผลเฉพาะเมื่อบันทึกการโอนข้อมูลของคุณมีขนาดเกิน 8Gb ฉันคิดว่าประเด็นของ BradC (หรืออย่างน้อยฉัน) ก็คือใช่มีเหตุฉุกเฉินที่จะทำให้คุณหด logfile ของคุณ แต่คุณควรตระหนักว่าถ้าคุณใช้การสำรองข้อมูลที่มีชื่อเสียง / ตัดทอนแล้วตามด้วย shrinkfile คุณเพิ่งซ่อนโซ่สำรองของคุณ (หวังว่าไม่มีอะไรสำคัญ) และนอกเหนือจากปัญหาพื้นที่ดิสก์คุณมีแนวโน้มที่จะมีปัญหาเซิร์ฟเวอร์ sql ร้ายแรงบางอย่างอาจมาจากมุมมองการออกแบบฐานข้อมูลหรือแผนกสถาปัตยกรรม โดยไม่ต้องซ่อมคิวพื้นฐานที่คุณซื้อเวลาที่ดีที่สุด
Jim B

4

หลังจากทำการ "สำรองข้อมูลด้วย truncate_only" คุณควรออกคำสั่งต่อไปนี้เพื่อลดขนาด

dbcc SHRINKFILE (logfilename,shrink_tosize)

เช่น

dbcc SHRINKFILE (mydatabase_Log,512)

3

สคริปต์ที่คุณเขียนด้านบนจะทำเครื่องหมายเนื้อหาของบันทึกเพื่อนำมาใช้ซ้ำ ติดตามสคริปต์นั้นด้วย:

USE <database>;

DBCC SHRINKFILE (<log logical file name>)

ที่จะหดมันลงสำหรับคุณ

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