สร้างบันทึกการทำธุรกรรมขึ้นใหม่


20

เรามีฐานข้อมูลขนาดใหญ่มาก (~ 6TB) ซึ่งไฟล์บันทึกธุรกรรมถูกลบ (ในขณะที่ SQL Server ปิดตัวลงเราได้ลอง:

  1. การถอดและติดตั้งฐานข้อมูลอีกครั้ง และ
  2. การยกเลิกการลบไฟล์บันทึกธุรกรรม

... แต่ยังไม่มีอะไรทำงาน

เรากำลังทำงานอยู่:

ALTER DATABASE <dbname> REBUILD 
LOG ON (NAME=<dbname>,FILENAME='<logfilepath>')

... แต่ด้วยขนาดของฐานข้อมูลอาจใช้เวลาสองสามวันจึงจะเสร็จสมบูรณ์

คำถาม

  • มีความแตกต่างระหว่างคำสั่งด้านบนและคำสั่งต่อไปนี้หรือไม่?

    DBCC CHECKDB ('<dbname>', REPAIR_ALLOW_DATA_LOSS)
  • เราควรจะดำเนินการREPAIR_ALLOW_DATA_LOSSแทนหรือไม่

เป็นที่น่าสังเกตว่าข้อมูลนั้นมาจากแหล่งอื่น ๆ เพื่อให้สามารถสร้างฐานข้อมูลใหม่ได้อย่างไรก็ตามเราสงสัยว่าจะซ่อมแซมฐานข้อมูลได้เร็วกว่าการแทรกข้อมูลทั้งหมดอีกครั้ง


ปรับปรุง

สำหรับคะแนนการรักษาเหล่านั้น: ALTER DATABASE/REBUILD LOGคำสั่งเสร็จสิ้นหลังจากประมาณ 36 ชั่วโมงและรายงาน:

คำเตือน: บันทึกสำหรับฐานข้อมูล 'dbname' ได้ถูกสร้างขึ้นใหม่ ความสอดคล้องของธุรกรรมสูญหายไป สายโซ่ RESTORE ใช้งานไม่ได้และเซิร์ฟเวอร์ไม่มีบริบทในไฟล์บันทึกก่อนหน้านี้อีกต่อไปดังนั้นคุณจะต้องรู้ว่าไฟล์เหล่านั้นคืออะไร
คุณควรรัน DBCC CHECKDB เพื่อตรวจสอบความสอดคล้องทางกายภาพ ฐานข้อมูลถูกวางในโหมด dbo-only เมื่อคุณพร้อมที่จะทำให้ฐานข้อมูลพร้อมใช้งานคุณจะต้องรีเซ็ตตัวเลือกฐานข้อมูลและลบไฟล์บันทึกเพิ่มเติม

จากนั้นเราก็วิ่งDBCC CHECKDB(ใช้เวลาประมาณ 13 ชั่วโมง) ซึ่งก็ประสบความสำเร็จ สมมติว่าเราได้เรียนรู้ถึงความสำคัญของการสำรองฐานข้อมูลแล้ว (และอนุญาตให้ผู้จัดการโครงการเข้าถึงเซิร์ฟเวอร์ ... )

คำตอบ:


20

อย่าแยกฐานข้อมูล Suspect อย่างไรก็ตามคุณแนบฐานข้อมูลหลังจากถอดออกได้อย่างไร คุณใช้CREATE DATABASEกับFOR ATTACH_REBUILD_LOGตัวเลือก?

คำสั่งเหล่านี้ควรทำเคล็ดลับ:

ALTER DATABASE recovery_test_2 SET EMERGENCY;   
ALTER DATABASE recovery_test_2 SET SINGLE_USER;  

DBCC CHECKDB (recovery_test_2, REPAIR_ALLOW_DATA_LOSS) 
WITH NO_INFOMSGS, ALL_ERRORMSGS;

ฉันเขียนโพสต์สำหรับสถานการณ์นี้:

ขั้นตอนการกู้คืนฐานข้อมูล SQL 2005/2008 - ไฟล์บันทึกถูกลบ (ตอนที่ 3)

คุณถามถึงความแตกต่างระหว่าง:

  • DBCC CHECKDB ('<dbname>', REPAIR_ALLOW_DATA_LOSS) และ
  • ALTER DATABASE <dbname> REBUILD LOG ON (NAME=<dbname>,FILENAME='<logfilepath>')

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

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

  1. DBCC CHECKDB (DBNAME, REPAIR_ALLOW_DATA_LOSS)รันบนฐานข้อมูลในสถานะฉุกเฉินตรวจสอบฐานข้อมูลเพื่อหาข้อผิดพลาดที่ไม่สอดคล้องกันพยายามใช้ไฟล์บันทึกก่อนเพื่อกู้คืนจากความไม่สอดคล้องใด ๆ หากไม่มีสิ่งนี้บันทึกธุรกรรมจะถูกสร้างใหม่

  2. ALTER DATABASE REBUILD LOG ON...เป็นขั้นตอนที่ไม่มีเอกสารและต้องมีDBCC CHECKDBการแก้ไขข้อผิดพลาดในภายหลัง


12

ใช่พวกเขาเป็นสองประโยคที่แตกต่างกันแต่ละคนทำสิ่งที่แตกต่างกันมาก

ขึ้นอยู่กับสถานะของฐานข้อมูลเมื่อไฟล์ถูกลบคุณอาจจะสามารถเริ่มต้นใช้งานได้โดยติดฐานข้อมูลและสร้างบันทึกใหม่โดยใช้:

EXEC sp_attach_single_file_db 'dbname here', 'file path and name here'

ดูsp_attach_single_file_db (Transact-SQL)ในเอกสารประกอบของผลิตภัณฑ์

ดูโพสต์บล็อกนี้โดยPaul S. Randal :

การซ่อมแซมโหมดฉุกเฉิน: เป็นทางเลือกสุดท้าย

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