۱۳۸۷/۱۰/۰۴

نحوه راه اندازي مجدد يك ديتابيس اس كيوال سرور پس از پر شدن هارد ديسك


امروز يكي از برنامه‌ها (برنامه ASP.Net) با مشكل زير مواجه شده بود:

پيغام خطا:
اتصال با سرور اس كيوال قطع شده است. لطفا با مسئول مربوطه هماهنگ نمائيد.
SQLErr:4060

اين خطا به معناي عدم امكان باز كردن ديتابيس است.

در طي اين مدت با موارد زيادي از اين دست (مشكلات مختلف عدم امكان برقراري ارتباط با اس كيوال سرور) برخورد داشتم كه خلاصه تمام آن‌ها تابع زير شده است:
public void CheckSQLServerStat(Exception ex)
{
try
{
SqlException ar = (SqlException) ex;
switch (ar.Number)
{
case 2:
case 11:
case 17:
case 40:
case 4060:
case 1326:
case 17142:
case 18456:
HttpContext.Current.Response.Write("<br/>" + "اتصال با سرور اس كيوال قطع شده است. لطفا با مسئول مربوطه هماهنگ نمائيد." + "<br/> SQLErr:" + ar.Number + "<br/>");
break;
}
}catch{}
}

هنگام رخ‌دادن يك خطا (در توابعي كه با اس كيوال سرور كار مي‌كنند)، exception حاصل را به اين تابع پاس كرده و خطاي حاصل را به صورت مختصر و مفيد به كاربر نشان مي‌دهم. كاربر متوجه مي‌شود كه يك مشكل اساسي در سيستم رخ داده است. برنامه نويس هم با جستجو در مورد شماره خطا مي‌تواند مشكل يابي كند. تابع Response.Write هم بالاتر از هر المان ديگري در صفحه، اين خطا را به شكل واضحي نمايش مي‌دهد. (كلا ريخت صفحه را به هم مي‌ريزد كه از لحاظ رواني لازم است! چون عملا در اين حالت سيستم از كار افتاده است)

به management studio اس كيوال سرور كه مراجعه كردم، علامت خاصي كنار نام ديتابيس نبود فقط برخلاف ساير ديتابيس‌ها كه آيكون + مربوط به باز شدن tree آن وجود دارد، اين يك مورد آن‌را نداشت. بر روي نام ديتابيس كليك راست كردم و انتخاب خواص، خطاي زير نمايش داده شد:
------------------------------
An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)
------------------------------
Database 'dbName' cannot be opened due to inaccessible files or insufficient memory or disk space. See the SQL Server errorlog for details. (Microsoft SQL Server, Error: 945)
------------------------------

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

use master;
alter database dbName set OFFLINE;
alter database dbName set online;

به اين صورت ديتابيس مربوطه به حالت عادي بازگشت و قابل استفاده شد.