ตั้งค่าขนาดของไฟล์บันทึกด้วยตนเองหลังจากลดขนาด SQL Server 2008 R2


10

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

เรามีฐานข้อมูล 40GB ในโหมดการกู้คืนเต็มไม่มีการสำรองข้อมูลบันทึกการกำหนดค่าและไฟล์บันทึกขนาดใหญ่ 84GB แผนของฉันในการกอบกู้สถานการณ์นี้คือการเรียกใช้การสำรองข้อมูลบันทึกเต็มรูปแบบในฐานข้อมูลลดขนาดแฟ้มบันทึกและสร้างแผนการบำรุงรักษาเพื่อเรียกใช้การสำรองข้อมูลบันทึกทุกคืนด้วยการสำรองฐานข้อมูลเพื่อช่วยให้สามารถควบคุมได้

ปัญหาของฉันคือฉันไม่ต้องการให้ล็อกไฟล์ย่อขนาดลงและใช้จ่ายในเช้าวันแรกของวันจันทร์ที่เติบโตอย่างต่อเนื่อง ฉันมีการประมาณการคร่าวๆว่าไฟล์ควรเป็นอย่างไร (ประมาณ 20% ของฐานข้อมูล) และต้องการตั้งค่านี้จาก get-go เพื่อให้แน่ใจว่ามีพื้นที่ต่อเนื่องมากที่สุด นี่เป็นเพียงกรณีของการเปลี่ยน "ขนาดเริ่มต้น" ภายใต้คุณสมบัติของฐานข้อมูล -> ไฟล์หรือไม่ ฉันเดาเช่นกันว่าฐานข้อมูลจะต้องออฟไลน์เพื่อให้เกิดสิ่งนี้?

ขอบคุณล่วงหน้า


2
คุณวางแผนที่จะสำรองฐานข้อมูลหนึ่งครั้งต่อคืนและทำการสำรองข้อมูลบันทึกหนึ่งครั้งต่อคืนหรือไม่ บางทีคุณควรพิจารณารูปแบบการกู้คืนอย่างง่ายดังนั้นบันทึกจัดการเอง
Aaron Bertrand

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

1
@ เคนเน ธ ดังนั้นหากคุณสำรองข้อมูลเต็มรูปแบบในเวลาเที่ยงคืนจากนั้นสำรองข้อมูลบันทึกเวลา 12:05 ฉันพบว่ามันค่อนข้างหลอกลวง YMMV
Aaron Bertrand

@Aaron อีกครั้งทุกการดำเนินการ แต่ถ้าฉันเข้าใจผิดคุณสามารถใช้การสำรองข้อมูลเต็มรูปแบบจากคืนก่อนหน้าและบันทึกที่ 12:05 และการกู้คืนไปยังจุดใด ๆ ในวันก่อนหน้า นอกจากนี้หากพวกเขาพบปัญหาก็ไม่ใช่เรื่องใหญ่ที่จะทำบันทึกกลับคืนจากคืนก่อนหน้าและทำเวลาเพื่อกลับไปไม่กี่นาทีที่ผ่านมา ฉันไม่ได้บอกว่าพวกเขาควรเก็บไว้อย่างเต็มที่แค่บอกว่ามีส่วนร่วมมากกว่ามุมมอง DR ที่ถูกกล่าวว่าหากพวกเขาจะรักษาเต็มพวกเขาควรจะทำสำรองข้อมูลบันทึกบ่อยกว่าวันละครั้ง
Kenneth Fisher

2
@ เคนเน็ ธ แต่ถ้าคุณสำรองข้อมูลบันทึกวันละครั้งนี่เป็นเหตุผลว่าทำไมมันถึงใหญ่มากในตอนแรก! หากคุณต้องการกู้คืนเป็น 12:07 น. เมื่อวานนี้คุณต้องโหลดบันทึกทั้งหมดตลอดทั้งวันเพื่อกู้คืน 2 นาที ไม่มีประโยชน์มาก
Aaron Bertrand

คำตอบ:


6

แค่ย่อขนาดที่คุณคิดว่ามีขนาดเหมาะสมที่สุด อย่าใช้ UI เพียงทำเช่นนี้สมมติว่า 200 MB เป็นขนาดที่เหมาะสมที่สุดของคุณ:

USE yourdb;
GO
DBCC SHRINKFILE(yourdb_log, 200);

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

หากคุณต้องการให้แบ็กอัพข้อมูลมีความหมายอย่าวางแผนที่จะทำการสำรองข้อมูลเต็มรูปแบบในเวลากลางคืนและจากนั้นจะมีการสำรองข้อมูลบันทึกเดียว สิ่งนี้จะช่วยให้คุณอยู่ในรูปแบบการกู้คืนเต็มทำให้บันทึกการทำงานยากมากและไม่ซื้ออะไรเลย ดังนั้นหากคุณต้องการกู้คืนข้อมูลแบบ point-in-time ให้รันการสำรองข้อมูลบันทึกบ่อยครั้งมากขึ้นในอัตราที่เหมาะสมกับการสูญเสียข้อมูลที่คุณยอมรับ หากคุณไม่ต้องการสูญเสียข้อมูลมากกว่า 15 นาทีให้เรียกใช้การสำรองข้อมูลบันทึกทุก ๆ 15 นาที


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

12

การจัดการไฟล์ของคุณสามารถใช้งานออนไลน์ได้อย่างสมบูรณ์ คุณมีสองเส้นทางขึ้นอยู่กับความต้องการของคุณในการเก็บข้อมูลบันทึกของคุณเพื่อการกู้คืน:

ไม่ต้องการการกู้คืนเวลา

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

ฉันขอแนะนำให้ตั้งค่าจำนวนการเติบโตคงที่และการเติบโตแบบไม่ จำกัด หมายเหตุจำนวนการเติบโตคงที่นั้นขึ้นอยู่กับจำนวนเงินฉันขอแนะนำให้ใช้ขนาด 1-2 GB ในตอนแรกทั้งนี้ขึ้นอยู่กับปริมาณการเติบโตที่บันทึกคาดว่าจะเห็น เป็นการดีที่บันทึกของคุณจะไม่เติบโตมากนักดังนั้นสิ่งนี้จะไม่ส่งผลกระทบมากนัก หากบันทึกของคุณมีการเติบโตอย่างสม่ำเสมอคุณอาจต้องทบทวนขนาดของคุณอีกครั้ง

สำเร็จโดยใช้:

ALTER DATABASE [foo] 
SET RECOVERY SIMPLE;

CHECKPOINT;

DBCC SHRINKFILE (foo_log,0);

ALTER DATABASE [foo]
MODIFY FILE (NAME=foo_log,SIZE=8000MB,MAXSIZE=UNLIMITED,FILEGROWTH=1000MB);

--Optional if you want the database in full recovery mode 
--for point in time recovery going forward
ALTER DATABASE [foo] 
SET RECOVERY FULL;

ต้องการการกู้คืนเวลา

Hangup ที่ใหญ่ที่สุดคือคุณไม่สามารถย่อขนาดไฟล์บันทึกของคุณผ่านเซ็กเมนต์ VLF ที่ใช้งานอยู่ในปัจจุบัน หากต้องการดูสิ่งนี้คุณสามารถใช้DBCC LOGINFOในบริบทฐานข้อมูล ส่วนใด ๆ ที่มีสถานะ = 2 นั้นจะทำงาน เมื่อต้องการล้างเซกเมนต์ที่ใช้งานอยู่คุณจะต้องเรียกใช้การสำรองข้อมูลล็อกธุรกรรมเมื่อไม่มีธุรกรรมใดที่ทำงานอยู่ในเซกเมนต์นั้น ขั้นตอนของคุณคือ:

  1. เรียกใช้การสำรองข้อมูลบันทึกธุรกรรม
  2. ย่อขนาดไฟล์ของคุณ (แผ่แบน แต่ถ้าฐานข้อมูลของคุณใช้งานอยู่มันจะยากที่จะทำ)
  3. ทำซ้ำขั้นตอนที่ 1 และ 2 จนกระทั่งบันทึกของคุณมีขนาดที่เหมาะสมนึกคิดเล็กที่สุดเท่าที่จะทำได้
  4. ปรับขนาดบันทึกให้มีขนาดที่เหมาะสม

สำเร็จโดยใช้:

BACKUP LOG [foo] TO DISK='<Location of t-log backup>';

DBCC SHRINKFILE (foo_log,0);

--Repeat the above until your log file is small "enough"

ALTER DATABASE [foo]
MODIFY FILE (NAME=foo_log,SIZE=8000MB,MAXSIZE=UNLIMITED,FILEGROWTH=1000MB);

แหล่งข้อมูลเพิ่มเติมเพื่อให้เข้าใจสิ่งที่เกิดขึ้นที่นี่:


2

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

USE [DBName]
GO
DBCC SHRINKFILE (N'LogName' , SizeInMg)
GO

คุณสามารถทำได้โดยใช้ GUI และใช้ปุ่มตัวเลือกที่สองและช่องทำเครื่องหมายที่บอกว่าคุณต้องการให้บันทึกนั้นใหญ่ขนาดไหน คุณสามารถไปที่ GUI ได้โดยคลิกขวาที่ฐานข้อมูลใน Object explorer ใน SSMS เลือกงานย่อขนาดไฟล์


2

ในการตอบสนองของแอรอนเกี่ยวกับโหมดง่าย ๆคุณสามารถกำหนดตารางเวลาการสำรองข้อมูลที่แตกต่างกัน 2 ตัว (หรือมากกว่า) ต่อวันด้วยวิธีนี้จะช่วยลดหน้าต่างข้อมูลสูญหายของการดำเนินการฐานข้อมูลของคุณในขณะที่ยังคงโหมด SIMPLE

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