ฐานข้อมูลเริ่มต้นเสมอในโหมดการกู้คืน


11

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

  1. ฉันบอกว่าอาจเกิดจากไฟล์บันทึกขนาดใหญ่? นั่นถูกต้องไหม ถ้าไม่เช่นนั้นจะมีสาเหตุอะไรอีก?
  2. ฉันต้องการลดพื้นที่ของล็อกไฟล์เพื่อป้องกันการกู้คืน สิ่งที่ดีกว่า: การหดหรือตัดทอน
  3. ฉันจะลดขนาดหรือตัดทอนไฟล์บันทึก / ฐานข้อมูลเพื่อลดขนาดได้อย่างไร ไวยากรณ์คืออะไร

ฉันกำลังใช้ Microsoft SQL Server 2008


คุณมักจะมีการทำธุรกรรมขนาดใหญ่ในเที่ยวบินเมื่อคุณปิดตัวลง? ช่วงเวลาการกู้คืนถูกตั้งค่าเป็นเท่าใด
Martin Smith

ไม่มีการดำเนินการใด ๆ ที่จะดำเนินการ 20 นาทีก่อนที่จะรีสตาร์ทเซิร์ฟเวอร์นอกเหนือจากการเลือกคำสั่งช่วงเวลาจะถูกตั้งค่าไว้ที่ 0

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

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

ข้อมูลไม่เพียงพอ รูปแบบการกู้คืน? คุณใช้คุณสมบัติเช่นการมิเรอร์หรือการจำลองแบบหรือไม่ ขนาดของฐานข้อมูลและไฟล์ที่เกี่ยวข้อง? ฐานข้อมูลไม่จัดการใด ๆการทำธุรกรรมขนาดใหญ่?
Jon Seigel

คำตอบ:


6

ฉันมีปัญหาเดียวกันและฉันเชื่อว่าฉันได้แก้ไขแล้ว แต่ฉันไม่สามารถทดสอบได้อย่างสมบูรณ์เพื่อยืนยัน

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

นี่คือแบบสอบถามเพื่อดูว่าคุณมี VLF กี่ตัวที่ฉันใช้จากที่นี่ :

    Create Table #stage(
    FileID      int
  , FileSize    bigint
  , StartOffset bigint
  , FSeqNo      bigint
  , [Status]    bigint
  , Parity      bigint
  , CreateLSN   numeric(38));

Create Table #results(
    Database_Name   sysname
  , VLF_count       int 
);

Exec sp_msforeachdb N'Use ?; 
            Insert Into #stage 
            Exec sp_executeSQL N''DBCC LogInfo(?)''; 

            Insert Into #results 
            Select DB_Name(), Count(*) 
            From #stage; 

            Truncate Table #stage;'

Select * 
From #results
Order By VLF_count Desc;

Drop Table #stage;
Drop Table #results;

สำหรับคำอธิบายเพิ่มเติมเกี่ยวกับสิ่งที่ VLFs เห็นลิงค์นี้

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

เมื่อเสร็จสมบูรณ์ฉันเชื่อว่าคุณจะสามารถเห็นว่าฐานข้อมูลของคุณออกมาจากการกู้คืนเร็วขึ้นมาก

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



2

จากบทความ MSDN นี้ :

ธุรกรรมที่ไม่มีข้อผูกมัดที่ใช้เวลานานจะช่วยเพิ่มเวลาการกู้คืนสำหรับจุดตรวจทุกประเภท

โดยทั่วไปจะไม่แนะนำให้เรียกใช้ DBC shrinkfile ใด ๆ ในฐานข้อมูลการผลิต นอกจากนี้ยังมีพฤติกรรมการตัดทอน HAS เปลี่ยนจากรุ่นก่อนหน้าเป็น 2008 (ขอบคุณ @Edward) - ต่อบล็อกนี้:

บันทึกการสำรองข้อมูลที่มี trucate_only ไม่ได้รับการสนับสนุนใน SQL 2008 อีกต่อไปหากฐานข้อมูลของคุณอยู่ในรูปแบบการกู้คืนข้อมูลที่บันทึกจำนวนมากหรือเต็มรูปแบบให้กำหนดเวลาการสำรองข้อมูล T-Log ตามช่วงเวลาปกติ

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


0

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

การตัดทอนบันทึกธุรกรรมไม่เพิ่มพื้นที่ว่างบนฟิสิคัลฮาร์ดดิสก์จะอนุญาตให้ SQL Server นำพื้นที่นั้นกลับมาใช้ใหม่สำหรับการทำธุรกรรมที่เกิดขึ้นตั้งแต่ CHEKPOINT ครั้งล่าสุดเท่านั้น (นับตั้งแต่การสำรองข้อมูลบันทึกธุรกรรมล่าสุด)

หากคุณลดขนาดฐานข้อมูลคุณจะลดขนาดของไฟล์ หากต้องการลดขนาดฐานข้อมูล MyDB ลง 15 เปอร์เซ็นต์:

DBCC SHRINKDATABASE (MyDB, 15); ไป

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