نمایش نتایج 1 تا 7 از 7

نام تاپیک: مشگل با Restore

  1. #1

    Question مشگل با Restore

    سلام
    من این کد رم برای restore بانکم مینویسم :

    SqlCon.Open();
    SqlCom.CommandText =
    "RESTORE DATABASE Test FROM DISK='c:\\dbBackup.bak'";
    SqlCom.Connection = SqlCon;
    SqlCom.ExecuteNonQuery();
    SqlCon.Close();

    ولی خطا میده :

    Exclusive access could not be obtained because the database is in use.
    RESTORE DATABASE is terminating abnormally.

  2. #2

    نقل قول: مشگل با Restore

    لطفا یکی کمک کنه.

  3. #3
    کاربر دائمی آواتار pars.engineer
    تاریخ عضویت
    فروردین 1387
    محل زندگی
    تهران
    پست
    187

    نقل قول: مشگل با Restore

    سلام،
    براي Restor كردن بايد تمامي كانكشن هايي كه از ديتا بيس استفاده مي كنند، Kill شوند.
    حال براي اين كار مي توانيد:
    1- يك SP در SQL Server بنويسيد كه تمامي كانكشن هاي باز را Kill كند و قبل از Restor كردن ديتا بيس آن SP را فراخواني كنيد.
    2- راه ساده تر و بهتر (البته از نظر برخي اساتيد) اين است كه ديتا بيس را به حالت Single User ببريد، سپس دستور Restor را اجرا كنيد و بعد دوباره ديتا بيس را به حالت Multi User ببريد. تصحيح شده كد شما به شكل زير مي باشد.


    SqlCon.Open();
    SqlCom.CommandText =
    "ALTER DATABASE Test SET SINGLE_USER WITH ROLLBACK IMMEDIATE" +
    " USE master; RESTORE DATABASE Test FROM DISK ='c:\\dbBackup.bak'"
    ;
    SqlCom.Connection = SqlCon;
    SqlCom.ExecuteNonQuery();
    SqlCon.Close();

    *******************//
    SqlCon.Open();
    SqlCom.CommandText =
    "ALTER DATABASE Test SET MULTI_USER ";

    SqlCom.Connection = SqlCon;
    SqlCom.ExecuteNonQuery();
    SqlCon.Close();



    چنانچه به روش اول احتياج داشتيد، بگوييد تا كد SP را قرار دهم.(چون كمي طولاني بود الان ننوشتم)
    موفق باشيد

  4. #4
    کاربر دائمی آواتار mehrnoosh_al62
    تاریخ عضویت
    اردیبهشت 1387
    محل زندگی
    شمال ایران...
    پست
    374

    نقل قول: مشگل با Restore

    برای روش اول در پست قبلی میتونید از dbo.sp_dbm_kill_users در دیتابیس Master استفاده کنید که تمامی کانکشن های باز رو Kill میکنه...

    /**************************************************  */
    /* This procedure executes KILL for all connections in the specified database. */
    /* The procedure can be mofified so it kills all connections for a server. */
    /* The procedure takes the following parameters: */
    /* @dbname SYSNAME (required): Database name. */
    /* @delay DATETIME (optional) [0] : Optional delay (s) before resume. */

  5. #5
    کاربر دائمی آواتار mehrnoosh_al62
    تاریخ عضویت
    اردیبهشت 1387
    محل زندگی
    شمال ایران...
    پست
    374

    نقل قول: مشگل با Restore

    میتونید یه تابع بنویسید و Sp مورد نظر رو هر بار فراخوانیش کنید :
     public void kill_connections()
    {
    string connectionString = "Your Connection String";
    SqlConnection cn = new SqlConnection(connectionString);
    SqlCommand cm = new SqlCommand("master.dbo.sp_dbm_kill_users", cn);
    cm.CommandType = CommandType.StoredProcedure;
    cm.Parameters.Add("@dbName", SqlDbType.VarChar).Value = "DbName";
    cm.Parameters.Add("@Delay", SqlDbType.DateTime).Value = "00:00:00";
    cn.Open();
    cm.ExecuteNonQuery();
    //cm.ExecuteNonQuery();
    cn.Close();
    cn.Dispose();
    cm.Dispose();
    }


    البته من خودم تو برنامم از روش اول و دستور Alter استفاده کردم و جواب داده. انتخاب با خودتونه...

  6. #6
    کاربر دائمی آواتار danial82
    تاریخ عضویت
    مرداد 1384
    محل زندگی
    iran_tehran
    پست
    531

    نقل قول: مشگل با Restore

    گرفتن Backup و Restore کردن دیتابیس
    https://barnamenevis.org/attach...2&d=1226600148

  7. #7

    نقل قول: مشگل با Restore

    نقل قول نوشته شده توسط pars.engineer مشاهده تاپیک
    سلام،
    براي Restor كردن بايد تمامي كانكشن هايي كه از ديتا بيس استفاده مي كنند، Kill شوند.
    حال براي اين كار مي توانيد:
    1- يك SP در SQL Server بنويسيد كه تمامي كانكشن هاي باز را Kill كند و قبل از Restor كردن ديتا بيس آن SP را فراخواني كنيد.
    2- راه ساده تر و بهتر (البته از نظر برخي اساتيد) اين است كه ديتا بيس را به حالت Single User ببريد، سپس دستور Restor را اجرا كنيد و بعد دوباره ديتا بيس را به حالت Multi User ببريد. تصحيح شده كد شما به شكل زير مي باشد.


    SqlCon.Open();
    SqlCom.CommandText =
    "ALTER DATABASE Test SET SINGLE_USER WITH ROLLBACK IMMEDIATE" +
    " USE master; RESTORE DATABASE Test FROM DISK ='c:\\dbBackup.bak'"
    ;
    SqlCom.Connection = SqlCon;
    SqlCom.ExecuteNonQuery();
    SqlCon.Close();

    *******************//
    SqlCon.Open();
    SqlCom.CommandText =
    "ALTER DATABASE Test SET MULTI_USER ";

    SqlCom.Connection = SqlCon;
    SqlCom.ExecuteNonQuery();
    SqlCon.Close();



    چنانچه به روش اول احتياج داشتيد، بگوييد تا كد SP را قرار دهم.(چون كمي طولاني بود الان ننوشتم)
    موفق باشيد
    مشکلم حل شد ممنون فقط باید آخر دستورتون with replace اضافه بشه.

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •