Recovery SQL Server Suspect Database
สาเหตุของ Suspect Mode
การที่ฐานข้อมูล SQL Server เข้าสู่ Mode Suspect นั้นมีได้จากหลายสาเหตุ ดังนี้
- Hardware เกิดความเสียหาย
- มีการปิด (Shutdown) ฐานข้อมูลที่ไม่เหมาะสม คือปิดโดยที่ยังมีกระบวนการทำงานยังไม่เสร็จสมบูรณ์ หรือมีบาง Transaction ค้างอยู่
- เกิดความเสียหายกับ Database Files (*.mdf,*.log)
- SQL Server ไม่พบ Device ที่เก็บ Files
- SQL Server ไม่พบ Database Files
- Database Resource ถูกใช้งานอยู่โดย Operation System
- ไม่มีพื้นที่มากพอใน Page space ที่มีการเพิ่ม (Insert) ข้อมูลเข้าไป
วิธีแก้ปัญหา
แต่ต้องอยู่บนพื้นฐานที่ไม่มีอะไรผิดปกติที่เกิดจาก Devices หรือ ตัว Database Files จึงจะ สามารถ Recovery โดยวิธีดังนี้
EXEC sp_resetstatus [YourDatabase]; |
ALTER DATABASE [YourDatabase] SET EMERGENCY |
DBCC checkdb([YourDatabase]) |
ALTER DATABASE [YourDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE |
DBCC CheckDB ([YourDatabase], REPAIR_ALLOW_DATA_LOSS) |
ALTER DATABASE [YourDatabase] SET MULTI_USER |
อธิบาย
- EXEC sp_resetstatus [YourDatabase];
เป็นคำสั่งทำการปิด suspect mode เมื่อทำแล้วก็ต้อง Stop และ Restart SQL Server ด้วย
- ALTER DATABASE [YourDatabase] SET EMERGENCY
เป็นคำสั่งให้ Database เข้าสู่ READ_ONLY MODE และจำกัดการเข้าถึงให้เข้าได้เฉพาะ SysAdmin Account เท่านั้น
- DBCC checkdb([YourDatabase])
CheckDB จะตรวจสอบการจัดสรรทรัพยากรสำหรับทุกๆ Object และตรวจสอบความสมบูรณ์ของโครงสร้างฐานข้อมูลทั้งหมด
- ALTER DATABASE [YourDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
กำหนดให้สามารถเข้าใช้งานฐานข้อมูลได้เพียง User เดียวเท่านั้น
- DBCC CheckDB ([YourDatabase], REPAIR_ALLOW_DATA_LOSS)
จะมีการทำงานหลายขั้นตอนซึ่งแรกสุดจะเป็นการตรวจสอบทรัพยากรต่างๆและมีการตรวจสอบโครงสร้างของฐานข้อมูลจะมีการ Run คำสั่ง DBCC CheckAlloc, DBCC CheckTable, DBCC CheckCatalog ทั้งฐานข้อมูล มีการตรวจสอบข้อมูลของแต่ละ Indexed View ตรวจสอบ Link-Level Consistency ระหว่าง table metadata และ file system directories ตรวจสอบ Service Broker Data ในฐานข้อมูลทั้งหมด
ส่วน Option REPAIR_ALLOW_DATA_LOSS นั้นจะมีการพยายามซ้อมแซ่มฐานข้อมูลในส่วนที่เสียไปตามรายการที่ได้จากการ CheckDB และเป็นการอนุญาตให้ข้อมูลสามารถศูนย์หายได้บาง
- ALTERDATABASE [YourDatabase] SET MULTI_USER
เป็นการ set database ให้กลับมาใช้งานตามปกติ
หลังจากขั้นตอนเหล่านี้แล้ว ผมจะทำการ Shutdown Server แล้วเปิดขึ้นมาใหม่แล้วลองใช้คำสั่ง DBCC CheckDB() ตรวจสอบอีกครั้งเพื่อความแน่ใจ