پایگاهدادهی MSSQL Server بنا به دلایل مختلفی مانند «قطع برق، خاموشی ناگهانی سیستم، در دسترس نبودن فایلهای پایگاه داده، حذف عمدی یا سهوی دادهها، خراب شدن دیسک سرویس دهنده و غیره»، ممکن است از دسترس خارج گردد. چنانچه هرکدام از این اتفاقات در زمان باز بودن تراکنشها (فعالیت MSSQL) رخ دهد، باعث خرابی دادهها و اطلاعات آن خواهد شد. همچنین ممکن است، پایگاهداده به حالت ناخواستهی Suspect Mode برود، که این حالت بیشتر به دلیل آسیب دیدن fileGroup پایگاهداده رخ میدهد، درحالت کلی امکان دسترسی و استفاده از پایگاهداده در این حالت امکان پذیر نمیباشد.
در این شرایط، میتوان از امکان Emergency Database Repair (ترمیم اورژانسی پایگاهداده) که از نسخه 2005 به بعد به مجموعهی MSSQL Server افزوده شده است، استفاده نمود. برای این منظور بایست یک Log file جدید ایجاد، سپس دستور DBCC CHECKDB را با استفاده از REPAIR_ALLOW_DATA_LOSS اجرا نمود.
DBCC دستوراتی برای کنترل و اطمینان از یکپارچگی و پیوستگی منطقی و فیزیکی پایگاهداده هستند که عبارتند از:
- DBCC DBREINDEX برای Defrag کردن جداول و ایندکسها.
- DBCC SHRINKFILE برای احیاء فضاهای از دست رفته.
- DBCC SHOWCONTIG برای اینکه آگاهی از وضعیت پیوستگی و ساختار داخلی دیتابیس.
- DBCC CHECKDB برای رفع اشکالات احتمالی در ساختار داخلی دیتابیس.
پس از اتمام اجرای دستور DBCC CHECKDB، بایست پیام ذخیره شده در SQL Server error log را بررسی نمایید، چنانچه متن پیغام حاوی کلمهی «success» و زمان صرف شدهی اجرای دستور(ها) باشد، بدین معناست که دستورات به درستی و با موفقیت اجرا شدهاست، در غیر اینصورت شما عبارت «command was terminated»، شماره وضعیت (state value) و زمان صرف شده تا رخ دادن خطا را مشاهده خواهید کرد. در زیر میتوانید جدول شماره وضعیت و توضیح آنرا مشاهده کنید:
شماره وضعیت |
توضیحات |
0 |
خطای شماره 8930 رخ داده، بدین معنا که خرابی metadata باعث توقف اجرای دستور DBCC شدهاست. |
1 |
خطای شماره 8967 رخ داده، بدین معنا که یک خطای داخلی در DBCC رخ دادهاست. |
2 |
یک خطا در هنگام ترمیم اورژانسی رخ دادهاست. |
3 |
خرابی metadata باعث توقف اجرای دستور DBCC شدهاست. |
4 |
یک ادعای یا نقص دسترسی تشخیص داده شدهاست. |
5 |
خطای شناختهای باعث توقف اجرای دستور DBCC شدهاست. |
قابلیت ترمیم اورژانسی پایگاهداده بایست چند گام را طی کرد:
- باید flag مربوط به حالت suspect پایگاهداده را reset (صفر) کنید (چنانچه پایگاهداده وارد این حالت شدهباشد اجرای این گام ضروریست).
- مُد EMERGENCY Mode پایگاهداده را فعال نموده تا تنها قابلیت خواندن از آن وجود داشته باشد و دیگر کاربران به آن دسترسی نداشتهباشند.
- با استفاده از دستور dbcc checkdb کلیهی allocation ،structural ،logical integrity و خطاهای آبجکتهای پایگاهداده را بررسی کنید.
- سپس حالت Single User پایگاهداده را فعال کرده، تا امکان recover کردن دادههای آسیب دیده را داشتهباشید.
- دستور DBCC را همراه با پارامتر “REPAIR_ALLOW_DATA_LOSS” اجرا کرده برای بررسی و ترمیم (Repair) خطاهایی که این دستور پیدا خواهد کرد.
- در پایان دیتابیس را به حالت Multi User (حالت پیشفرض) باز میگردانیم.
به کمک دستورات زیر میتوانید گامهای بالا را طی نمایید:
- ابتدا یک new query ایجاد نمایید.
- سپس دستورات زیر را در آن کپی نمایید.
- هرجا عبارت DBName وجود دارد، آنرا به نام پایگاهداده خود تغییر دهید.
- Query را اجرا نمایید.
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
1 دیدگاه. دیدگاه تازه ای بنویسید
با سلام و خسته نباشید
مطلب خیلی جالب و پر باری بود.همیشه در مورد پایگاه داده ها سوال داشتم که با این مطلب شما، به جواب یکسری سوالاتم رسیدم