رفع خطای Suspect شدن Database در SQL Server
وضعیت Suspect جدیترین وضعیتی است که یک پایگاهداده در SQL Server میتواند به آن دچار شود. این یعنی SQL Server هنگام تلاش برای Recovery، با یک خطای غیرمنتظره روبهرو شده (معمولاً یک صفحهی خراب یا Corrupt در فایل Data یا Log) و برای جلوگیری از آسیب بیشتر، دسترسی به کل پایگاهداده را قطع کرده است.
REPAIR_ALLOW_DATA_LOSS میتواند بخشی از داده را برای همیشه از بین ببرد.مهمترین علتهای Suspect شدن
- خرابی سختافزاری دیسک — بدترین سناریو؛ بخشی از فایل .mdf یا .ldf روی دیسک آسیب دیده.
- قطع برق یا خاموشی ناگهانی سرور در وسط نوشتن داده روی دیسک.
- پر شدن ناگهانی دیسک هنگام یک عملیات نوشتن حیاتی.
- باگ در درایور دیسک یا نرمافزار آنتیویروس که فایلهای SQL Server را قفل یا تغییر داده.
مرحله ۱ — بررسی وضعیت دقیق با T-SQL
SELECT name, state_desc FROM sys.databases WHERE name = N'ShopDB'; -- اگر state_desc برابر SUSPECT بود، ادامه بده
مرحله ۲ — چککردن Error Log برای علت دقیق
در SSMS → Management → SQL Server Logs دنبال پیامهایی با کد 824 (خطای I/O یا Page Checksum) یا 825 (خطای خواندن مکرر دیسک) بگرد — این کدها معمولاً نشانهی مستقیم مشکل فیزیکی دیسک هستند.
گزینهی ۱ (توصیهشده): Restore از Backup
اگر Backup معتبر داری، پایگاهدادهی فعلی را Drop یا Offline کن و از Backup، نسخهی سالم را Restore کن. جزئیات کامل در راهنمای رفع خطاهای رایج هنگام Restore کردن Database.
گزینه ۲: تلاش برای بازیابی بدون Backup (با ریسک ازدسترفتن داده)
اگر واقعاً هیچ Backup ای در دسترس نیست، میتوانی با DBCC CHECKDB ابتدا میزان خرابی را ارزیابی کنی:
-- مرحله ۱: خارج کردن پایگاهداده از حالت Suspect به Emergency Mode (فقط Read-Only) ALTER DATABASE ShopDB SET EMERGENCY; -- مرحله ۲: بررسی میزان و نوع خرابی (بدون تغییر داده) DBCC CHECKDB (ShopDB) WITH NO_INFOMSGS, ALL_ERRORMSGS; -- مرحله ۳: قراردادن در Single-User Mode برای تعمیر ALTER DATABASE ShopDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE; -- مرحله ۴: تعمیر (فقط در صورت نبود Backup — ممکن است داده از بین برود) DBCC CHECKDB (ShopDB, REPAIR_ALLOW_DATA_LOSS); -- مرحله ۵: بازگرداندن به حالت چند-کاربره ALTER DATABASE ShopDB SET MULTI_USER;
REPAIR_ALLOW_DATA_LOSS ممکن است صفحات یا رکوردهای خراب را کاملاً حذف کند تا پایگاهداده دوباره سازگار (Consistent) شود. این آخرین راهحل است، نه اولین انتخاب — همیشه اول دنبال یک Backup سالم بگرد.چکلیست پیشگیری برای آینده
| اقدام پیشگیرانه | چرا مهم است |
|---|---|
| Backup منظم و تستشده | سریعترین راه بازگشت بدون ازدسترفتن داده |
اجرای دورهای DBCC CHECKDB | کشف زودهنگام خرابی صفحات قبل از بحرانیشدن |
| مانیتورینگ سلامت دیسک | پیشگیری از خرابی سختافزاری غافلگیرکننده |
| UPS برای جلوگیری از قطع ناگهانی برق | کاهش ریسک خرابی حین نوشتن روی دیسک |
جمعبندی
وضعیت Suspect معمولاً به معنای آسیب واقعی به داده است، نه فقط یک وقفهی موقت. همیشه اول دنبال یک Backup سالم بگرد؛ فقط در نبود آن سراغ ابزارهای تعمیر با ریسک ازدسترفتن داده برو. یک استراتژی Backup منظم، بهترین بیمه در برابر این سناریو است.
سوالات متداول دربارهی این موضوع
علت Suspect شدن پایگاهداده چیست؟
معمولاً خرابی فایلهای داده یا Log، قطعی ناگهانی برق، مشکل دیسک یا ناسازگاری فایلها هنگام Recovery.
آیا DBCC CHECKDB با REPAIR_ALLOW_DATA_LOSS امن است؟
نه؛ ممکن است بخشی از داده حذف شود و باید آخرین راه باشد. اولویت اول Restore از آخرین Backup سالم است.
چطور از Suspect شدن جلوگیری کنم؟
Backup منظم (شامل Log)، اجرای دورهای CHECKDB، پایش فضای دیسک و استفاده از UPS.
میخوای مفاهیم پایگاهداده را کامل یاد بگیری؟
دورهی رایگان SQLFarsi را همین حالا شروع کن.
شروع یادگیری