گروه آموزشی مجموعه فاوا
پایگاهدادهی MSSQL Server بنا به دلایل مختلفی مانند «قطع برق، خاموشی ناگهانی سیستم، در دسترس نبودن فایلهای پایگاه داده، حذف عمدی یا سهوی دادهها، خراب شدن دیسک سرویس دهنده و غیره»، ممکن است از دسترس خارج گردد. چنانچه هرکدام از این اتفاقات در زمان باز بودن تراکنشها (فعالیت MSSQL) رخ دهد، باعث خرابی دادهها و اطلاعات آن خواهد شد. همچنین ممکن است، پایگاهداده به حالت ناخواستهی Suspect Mode برود، که این حالت بیشتر به دلیل آسیب دیدن fileGroup پایگاهداده رخ میدهد، درحالت کلی امکان دسترسی و استفاده از پایگاهداده در این حالت امکان پذیر نمیباشد.
در این شرایط، میتوان از امکان Emergency Database Repair (ترمیم اورژانسی پایگاهداده) که از نسخه ۲۰۰۵ به بعد به مجموعهی MSSQL Server افزوده شده است، استفاده نمود. برای این منظور بایست یک Log file جدید ایجاد، سپس دستور DBCC CHECKDB را با استفاده از REPAIR_ALLOW_DATA_LOSS اجرا نمود.
DBCC دستوراتی برای کنترل و اطمینان از یکپارچگی و پیوستگی منطقی و فیزیکی پایگاهداده هستند که عبارتند از:
پس از اتمام اجرای دستور DBCC CHECKDB، بایست پیام ذخیره شده در SQL Server error log را بررسی نمایید، چنانچه متن پیغام حاوی کلمهی «success» و زمان صرف شدهی اجرای دستور(ها) باشد، بدین معناست که دستورات به درستی و با موفقیت اجرا شدهاست، در غیر اینصورت شما عبارت «command was terminated»، شماره وضعیت (state value) و زمان صرف شده تا رخ دادن خطا را مشاهده خواهید کرد. در زیر میتوانید جدول شماره وضعیت و توضیح آنرا مشاهده کنید:
|
شماره وضعیت |
توضیحات |
|
۰ |
خطای شماره ۸۹۳۰ رخ داده، بدین معنا که خرابی metadata باعث توقف اجرای دستور DBCC شدهاست. |
|
۱ |
خطای شماره ۸۹۶۷ رخ داده، بدین معنا که یک خطای داخلی در DBCC رخ دادهاست. |
|
۲ |
یک خطا در هنگام ترمیم اورژانسی رخ دادهاست. |
|
۳ |
خرابی metadata باعث توقف اجرای دستور DBCC شدهاست. |
|
۴ |
یک ادعای یا نقص دسترسی تشخیص داده شدهاست. |
|
۵ |
خطای شناختهای باعث توقف اجرای دستور DBCC شدهاست. |
قابلیت ترمیم اورژانسی پایگاهداده بایست چند گام را طی کرد:
به کمک دستورات زیر میتوانید گامهای بالا را طی نمایید:
|
1
2
3
4
5
6
|
EXEC sp_resetstatus‘DBName’
ALTER DATABASE DBName SET EMERGENCY
DBCC CheckDB(‘ DBName’)
ALTER DATABASE DBName SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DBCC CheckDB(‘ DBName ‘,REPAIR_ALLOW_DATA_LOSS)
ALTER DATABASE DBName SET MULTI_USER
|