PDA

View Full Version : مشگل با Restore



Blackk_lightt
سه شنبه 29 مرداد 1387, 21:32 عصر
سلام
من این کد رم برای 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.

Blackk_lightt
چهارشنبه 30 مرداد 1387, 19:18 عصر
لطفا یکی کمک کنه.

pars.engineer
پنج شنبه 31 مرداد 1387, 02:33 صبح
سلام،
براي 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 را قرار دهم.(چون كمي طولاني بود الان ننوشتم)
موفق باشيد

mehrnoosh_al62
پنج شنبه 31 مرداد 1387, 09:11 صبح
برای روش اول در پست قبلی میتونید از 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. */

mehrnoosh_al62
پنج شنبه 31 مرداد 1387, 09:16 صبح
میتونید یه تابع بنویسید و 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 استفاده کردم و جواب داده. انتخاب با خودتونه...

danial82
جمعه 13 دی 1387, 03:52 صبح
گرفتن Backup و Restore کردن دیتابیس
http://barnamenevis.org/forum/attachment.php?attachmentid=25462&d=1226600148

barnamen
چهارشنبه 07 اسفند 1392, 09:26 صبح
سلام،
براي 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 اضافه بشه.