ฉันได้รับมอบหมายให้พยายามกู้คืนฐานข้อมูลที่ประสบจากความเสียหาย (เนื่องจากความล้มเหลวของ I / O ซึ่งได้รับการแก้ไขตั้งแต่) ฉันไม่คุ้นเคยกับฐานข้อมูลหรือสิ่งที่มีอยู่
ฉันได้รับการสำรองข้อมูลเต็มรูปแบบเก่า (~ 3 สัปดาห์) และชุดบันทึกธุรกรรม ... แต่มีบันทึกธุรกรรมขาดหายไปดังนั้นฉันสามารถกู้คืนได้จนถึงวันที่กำหนด ข้อมูลหายไป 2.5 สัปดาห์ (และมีข้อมูลจำนวนมากถูกเพิ่มลงในฐานข้อมูลนี้อย่างต่อเนื่อง)
ฉันยังได้รับสำเนาของฐานข้อมูลที่เสียหาย (ซึ่งสามารถเข้าถึงได้ แต่มีหลายหน้าเสียหาย / ขาดหายไป)
ฉันได้ลองDBCC CHECKDB
คำสั่งทั่วไป(ยังไม่repair_allow_data_loss
ว่าจะเป็นทางเลือกสุดท้ายของฉันถ้าไม่มีอะไรทำงาน)
หลังจากหลายคนมาและไปที่ฐานข้อมูล (db เป็นสัตว์ประหลาดตัวเล็ก ๆ 1.5 เทราไบต์และทุกอย่างที่ฉันทำช้าและใช้เวลาสักครู่) ฉันพยายามทำการกู้คืนหน้าออนไลน์จากการสำรองข้อมูลที่ดีที่รู้จักล่าสุดสำหรับเพจที่เสียหาย
ในการทำเช่นนั้นฉันได้ทำสคริปต์ที่สร้างRESTORE DATABASE <foo> PAGE='pages' FROM DISK='<bar.bak>'
คำสั่งจำนวนมากจากDBCC CHECKDB
ผลลัพธ์ (โดยปกติ regex และแตกต่างกันไป) ... ดีมากจนถึงตอนนี้มันใช้งานได้จนถึงจุดที่บอกว่าฉันมีจำนวนหน้าถึง 1,000 หน้า ต่อไฟล์ (มี 8 ไฟล์ใน db นี้) ต่อคำสั่งกู้คืน
ดังนั้นจึงขอให้ฉัน "ทำการกู้คืนข้อมูลออนไลน์ให้เสร็จสมบูรณ์" แต่ฉันกำลังสูญเสียวิธีการทำเช่นนั้น ... ฉันไม่มีบันทึกท้ายหรืออะไรที่สมบูรณ์กว่าการสำรองข้อมูลทั้งหมดที่ฉันเริ่มด้วย โดยทั่วไปฉันไม่รู้วิธีการคืนค่าให้สมบูรณ์เพื่อลองกับส่วนที่เหลือของหน้า
ฉันได้ลองแล้วRESTORE DATABASE <foo> WITH RECOVERY
แต่มันก็ไม่ได้ผลเหมือนกันมันจะขอบันทึกที่ฉันไม่มี
ใครบ้างมีเคล็ดลับเกี่ยวกับวิธีที่ฉันสามารถกู้คืนอะไรจากที่นี่? หรือวิธี "คืนค่า" ออนไลน์ให้สมบูรณ์เพื่อให้ฉันสามารถพยายามกู้คืนหน้าได้มากขึ้น ฉันจะมีปัญหาเดียวกันไหมถ้าฉันลองกู้คืนออฟไลน์ (โดยทั่วไปเพิ่มWITH NORECOVERY
ทุกอย่างแล้วลองนำมันกลับมาตอนท้าย)
การจัดการฐานข้อมูลด้วยมือนั้นเป็นสิ่งที่ไม่สามารถทำได้ ... มีหลายร้อยตารางที่มีหลายล้านแถวและไม่มีความหมายที่ชัดเจนว่ามันคืออะไร ฐานข้อมูลที่เสียหายจะล้มเหลวในSELECT
แบบสอบถามหลังจากแถวบางล้านแถว แต่ฉันไม่แน่ใจว่าฉันสามารถทำงานที่ไหน ฉันได้ลองสร้างดัชนีที่ไม่ได้ทำคลัสเตอร์ใหม่ทั้งหมด แต่มีหน้าเสียหายด้วยข้อมูลแถวดังนั้นมันจึงไม่ได้ผล
การสูญเสียข้อมูลบางอย่างอาจเป็นที่ยอมรับ แต่อย่างน้อยก็ควรพยายามทำให้ฐานข้อมูลมีความสม่ำเสมอ
ฐานข้อมูลที่เสียหายคือ - หยุดออนไลน์และลูกค้ากำลังทำงานอยู่ (เพื่อให้ได้รับข้อมูลใหม่) ดังนั้นกระบวนการใด ๆ ที่ฉันทำบนโต๊ะปฏิบัติการควรจะทำซ้ำในฐานข้อมูลการผลิตหลังจากนั้น (การหยุดทำงานจะยากสำหรับมัน)
นี่คือ SQL Server 2014 Enterprise
PS: ฉันไม่ใช่ DBA ... ฉันเป็นโปรแกรมเมอร์ แต่ลูกค้าได้ลองใช้บริการกู้คืนความเสียหาย "ผู้เชี่ยวชาญ" ของ sql และพวกเขาเลิกใช้ดังนั้นฉันจึงถูกขอให้ดูและดูว่าฉันสามารถ ทำอะไรก็ได้
อัปเดต : หลังจากการทดสอบหลายครั้งการเรียกคืนทีละหน้าเป็นสิ่งที่ไม่ต้องดำเนินการดังนั้นเราจึงนำแนวคิดดังกล่าวมาใช้ เราจะทำการกู้คืนด้วยตนเอง (ด้วยตนเองเลือกระเบียนที่ขาดหายไปจากตารางที่เสียหายและแทรกลงในการสำรองข้อมูลที่ดีที่รู้จักล่าสุด) ทำเครื่องมืออัตโนมัติบางอย่างสำหรับมัน (อีกครั้งมีหลายร้อยและหลายร้อยตาราง)