ฐานข้อมูลหลักเสียหายอินสแตนซ์จะไม่เริ่ม - ตัวเลือกของฉันคืออะไร


11

ช่วยด้วย! ฐานข้อมูลหลักของฉันเสียหายฉันไม่สามารถนำอินสแตนซ์ SQL ออนไลน์มาใช้ได้! ตัวเลือกของฉันคืออะไรในการทำให้เซิร์ฟเวอร์สำรอง

ฉันมีการสำรองข้อมูลของมาสเตอร์ แต่หน้า MSDN "การกู้คืนฐานข้อมูลหลัก"ขอให้ฉันเริ่มอินสแตนซ์ในโหมดผู้ใช้คนเดียวซึ่งฉันทำไม่ได้!

(หมายเหตุ: ฉันทิ้งคำถามนี้ไว้โดยไม่ระบุว่าเป็นเวอร์ชัน SQL เพื่ออ้างอิงที่ใช้กันอย่างแพร่หลายมากขึ้นมีคำถามที่คล้ายกันใน DBA.SE แต่ไม่มีใครที่เกี่ยวข้องกับเซิร์ฟเวอร์ไม่สามารถเริ่มต้นได้)


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

คำตอบ:


12

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

1. ตรวจสอบ SQL Error Log โดยตรง

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

2. ลองเริ่มอินสแตนซ์ในโหมดผู้ใช้คนเดียว

นี่คือรายการทั้งหมดของตัวเลือกการเริ่มต้นสำหรับเซิร์ฟเวอร์ SQLรวมถึง-m(โหมดผู้ใช้คนเดียว) และ-f(โหมดการกำหนดค่าขั้นต่ำ) ตัวเลือกอื่น ๆ ช่วยให้คุณสามารถระบุเส้นทางสำหรับฐานข้อมูลหลักหากเป็นปัญหา

หากคุณสามารถที่จะได้รับเช่นเริ่มทำตามขั้นตอนในบทความ MSDN คุณเชื่อมโยงสำหรับการเรียกคืนฐานข้อมูลหลักหรือรายละเอียดเกี่ยวกับเรื่องนี้โดยโทมัส Larock

หากแอปพลิเคชันอื่นคว้าการเชื่อมต่อผู้ใช้คนเดียวก่อนที่คุณจะทำได้ก่อนอื่นให้ปิดใช้งานตัวแทน SQL เพื่อไม่ให้เริ่ม ประการที่สองดูแนวคิดเกี่ยวกับคำถามนี้สำหรับการใช้-m"Application Name"พารามิเตอร์เพื่อระบุชื่อแอปพลิเคชัน

3. กู้คืนmasterไปยังอินสแตนซ์อื่นและคัดลอกไฟล์

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

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

  • คืนค่าเป็นชื่ออื่นแน่นอน ( master_please_god_let_this_work) WITH MOVEดังนั้นคุณจะไม่เขียนทับmasterบนเซิร์ฟเวอร์ที่ดี
  • WITH NORECOVERYฟื้นฟู ไม่แน่ใจว่าสิ่งนี้จำเป็น แต่ทำให้ฉันรู้สึกดีขึ้นที่ฉันรู้ว่าเซิร์ฟเวอร์ตัวอื่นจะไม่เปลี่ยนแปลงสิ่งใดในต้นแบบที่กู้คืนมา
  • ตั้งเป็นออฟไลน์: ALTER DATABASE [master_please_god_let_this_work] SET OFFLINE
  • คัดลอกไฟล์ MDF และ LDF ที่กู้คืนจากเซิร์ฟเวอร์ที่ดีไปยังเซิร์ฟเวอร์ที่ตายแล้ว
  • เปลี่ยนชื่อmaster.mdfและmastlog.ldfไฟล์ตามที่จำเป็นเพื่อแทนที่ไฟล์มาสเตอร์ที่ไม่ดีด้วยเวอร์ชันที่คุณกู้คืน
  • ข้ามนิ้วของคุณและเริ่มอินสแตนซ์
  • ทางเลือก: ทำการกู้คืนต้นแบบใหม่บนเซิร์ฟเวอร์ที่เรียกคืน masterไม่แน่ใจว่านี้เป็นสิ่งจำเป็นเนื่องจากเรากำลังระวังสวยไม่ได้มีการเปลี่ยนแปลง

4. สร้างฐานข้อมูลระบบใหม่

หากคุณไม่มีอินสแตนซ์อื่นที่ใช้รุ่นเดียวกันหรือหากคุณไม่สะดวกในการใช้ขั้นตอนที่ไม่มีเอกสารที่ระบุไว้ใน # 3 หรือหากคุณไม่มีข้อมูลสำรองmaster( ทำไมคุณไม่มีข้อมูลสำรอง ) คุณสามารถสร้างฐานข้อมูลระบบ SQL จากแผ่นดิสก์การติดตั้งเดิม :

Setup.exe /ACTION=REBUILDDATABASE /...

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

5. กู้คืนฐานข้อมูล USER ทั้งหมดเป็นอินสแตนซ์ SQL ใหม่ (หรือที่มีอยู่)

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

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

CREATE DATABASE foo 
ON (FILENAME = 'D:\data\foo.mdf'),
   (FILENAME = 'D:\data\foo_log.ldf')
FOR ATTACH;

6. ทำการเปลี่ยนแปลงอีกครั้งเพื่อ master

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

  • การเปลี่ยนแปลงความปลอดภัย
  • ฐานข้อมูลใหม่ (ไฟล์จะยังอยู่ในดิสก์เพียงแนบไฟล์)
  • การตั้งค่าทั้งเซิร์ฟเวอร์

ไม่มีวิธีที่วิเศษในการค้นหาสิ่งเหล่านี้คุณจะต้องกลับไปที่เอกสารประกอบของ บริษัท ของคุณเองสำหรับการเปลี่ยนแปลงประเภทนี้หากคุณมี


1
Nice Post +1 ฉันทำการทดสอบที่ทำให้ต้นแบบของฉันเสียหายคืนค่าการสำรองข้อมูลบนเซิร์ฟเวอร์อื่นแล้วคัดลอกไฟล์ไปยังเซิร์ฟเวอร์เก่า มันทำงานได้โดยไม่มีปัญหา โดยวิธีการที่ฉันได้รับข้อผิดพลาด 3411 ในขณะที่ต้นแบบเสียหาย
Racer SQL

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

1
@RafaelPiccinelli หลักเก็บ "meta-data" เกี่ยวกับทุกสิ่งบนเซิร์ฟเวอร์ (ความปลอดภัยฐานข้อมูลอื่น ๆ ฯลฯ ) ดังนั้นจึงเหมาะสม ดูคะแนนของฉัน # 5 และ # 6 คุณจะต้องแนบฐานข้อมูลเหล่านั้นอีกครั้งและตั้งค่าความปลอดภัยที่คุณมี BTW ฉันหวังว่าคุณจะทำสิ่งนี้ทั้งหมดในห้องทดลอง !!
BradC

ใช่นั่นคือเหตุผลที่การทดสอบ ฉันได้รับข้อผิดพลาด แต่อาจได้รับอนุญาตจากที่เก็บข้อมูลของฉัน โพสต์ที่ดีอีกครั้ง ฉันจะลบความคิดเห็นล่าสุดนี้ฮ่าฮ่า
Racer SQL

2

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


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