۱۳۸۸/۰۴/۲۸

بازسازي msdb تخريب شده


حاصل قطع برق و يا يك ري استارت دستي ناصحيح را در نظر بگيريد:



Database 'msdb' cannot be opened. It has been marked SUSPECT by recovery. See the SQL Server errorlog for more information. (Microsoft SQL Server, Error: 926)

Msdb از نوع ديتابيس‌هاي سيستمي است و نمي‌شود مطابق روال متداول ديتابيس‌هاي SUSPECT شده آن‌را بازيابي كرد. اين روش متداول به صورت زير است:

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

در ابتداي كار ديتابيس در حالت اورژانسي قرار مي‌گيرد. بعد وضعيت و ميزان تخريب نمايش داده شده، سپس تك كاربره مي‌شود. در ادامه به اس كيوال سرور اجازه داده مي‌شود كه ديتابيس را با هر وضعي (حتي به قيمت از دست رفتن تعدادي ركورد) ترميم كند و در آخر ديتابيس مجددا به حالت چند كاربره بازگشت داده مي‌شود.
اين روشي است كه سال قبل با قطعي‌هاي مكرر برق زياد كاربرد داشت.

اما ديتابيس سيستمي msdb را نمي‌شود در حالت اورژانسي قرار داد؛ بنابراين بايد به دنبال راه چاره‌ي ديگري بود. پس از مدتي جستجو در وبلاگ‌هاي msdn ، راه حل زير يافت شد و كاملا عملي است (تست شده!) :

روش زير در مورد اس كيوال سرور 2008 ، 2005 و حتي 2000 نيز قابل استفاده است.
ابتدا خونسردي خودتان را حفظ كنيد! الان فقط ديگر با management studio نمي‌توانيد ديتابيس‌ها را مرور كنيد و همچنين تمام job هاي تعريف شده شما نابود شده‌اند! اما سرور به كار عادي خودش مي‌تواند ادامه دهد. سپس :
الف) تمام سرويس‌هاي مربوط به اس كيوال سرور را stop كنيد. به كنسول سرويس‌ها مراجعه كرده و هر آنچه كه در نام آن sql را مشاهده مي‌كنيد، stop كنيد.
ب) با استفاده از خط فرمان، ابتدا به مسير زير وارد شويد:
cd "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Binn\"

و سپس دستور زير را اجرا نمائيد:
start sqlservr.exe -c -m -T3608

به اين ترتيب اس كيوال سرور در يك حالت حداقل كه بتوان ديتابيس msdb تخريب شده را detach كرد راه اندازي مي‌شود. (پرچم 3608 مجوز detach كردن اين ديتابيس را مي‌دهد)
ج) management studio را اجرا كنيد. زمانيكه پنجره كانكت ظاهر مي‌شود آن‌را كنسل كرده و در نوار ابزار بالاي صفحه روي دكمه new query كيك كنيد (چون حالت راه اندازي سرور در حالت تك كاربره است نمي‌خواهيم اتصال ديگري برقرار شود و در كار اخلال كند). با كليك بر روي new query پنجره connect to server ظاهر مي‌شود. در همين پنجره بر روي دكمه options كليك كرده در برگه connection properties در قسمت connect to database نام master را وارد نمود و اكنون بر روي دكمه connect كليك نمائيد.
ج) سپس دستور زير را وارد كنيد تا ديتابيس msdb را بتوان detach كرد.
Use master;
sp_detach_db 'msdb'

مراحلي كه عنوان شد مهم است. اگر به اين صورت عمل نكنيد با پيغام خطاي زير مواجه خواهيد شد:
Cannot detach an opened database when the server is in minimally configured mode

اگر به اين خطا برخورديد، يكبار ديگر از صفر شروع كنيد. تمام سرويس‌هاي مرتبط با sql را استاپ كنيد (حتي در صورت نياز كارت شبكه سرور را نيز غيرفعال كنيد). و از مرحله الف مجددا شروع نمائيد تا حتما حالت تك كاربره‌ي اتصال برقرار شود. (همچنين پنجره‌ي كوئري جديدي را نيز باز نكنيد چون در اين حالت فقط و فقط يك اتصال مجاز است)

تا اينجا موفق شديم كه ديتابيس msdb را detach كنيم. اكنون به پوشه ديتابيس‌ها مراجعه كرده و mdf و ldf اين ديتابيس تخريب شده را rename كنيد (به هر اسمي كه مايل بوديد).
د) اكنون نوبت بازسازي مجدد اين ديتابيس است.
محتويات فايل instmsdb.sql را كه در مسير C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\install قرار دارد، در پنجره‌ي كوئري تك كاربره‌اي كه در مرحله قبل بازكرده‌ايم، copy/paste كرده و دكمه F5 را فشار دهيد. پس از مدتي ديتابيس msdb باز سازي شده و مشكل برطرف مي‌شود.
ه) اكنون سرور را stop و start كنيد يا كلا كامپيوتر سرور را restart‌ كنيد تا تمامي سرويس‌هاي stop شده راه اندازي مجدد شوند.