PDA

View Full Version : Error در Restore



اقاقيا
سه شنبه 28 خرداد 1387, 14:04 عصر
با سلام به همه دوستان..
من به كمك كد زير مي خوام كه ديتابيسم رو Restore كنم ولي Error ميده...


if (opd.ShowDialog() == DialogResult.OK)
{
string path = opd.FileName;
string ServerName = "localhost";
string DatabaseName = "soha";
string UserName = "sohadialyze";
string Password = "1";
string cs = "";
try
{
cs = "server={0};database={1};uid={2};pwd={3};";
cs = string.Format(cs, ServerName, DatabaseName, UserName, Password);
SqlConnection connection = newSqlConnection(cs);
string sql = "RESTORE DATABASE soha FROM DISK = '{0}'";
sql = string.Format(sql, path);
SqlCommand command = newSqlCommand(sql, connection);
command.CommandType = CommandType.Text;
connection.Open();
command.ExecuteNonQuery();
connection.Close();
MessageBox.Show("بازيابي ديتابيس از مسير دلخواه با موفقيت انجام شد");
}
catch
{
MessageBox.Show("اشکال در ارتباط با بانک اطلاعاتی");
}
}



متن Error:
RESTORE cannot process database 'soha' because it is in use by this session. It is recommended that the master database be used when performing this operation
RESTORE DATABASE is terminating abnormally

لطفا بگين چطور اين Error رو رفع كنم..:متفکر:
از راهنماييتون ممنون مي شم...

حمیدرضاصادقیان
سه شنبه 28 خرداد 1387, 14:47 عصر
سلام.شما وقتی داری restore میکنی نباید هیچ کانکشنی به اون وصل باشه.اگر به دیتابیست connection ی وصل هست حتما باید اون کانکشن رو از بین ببری.

اقاقيا
سه شنبه 28 خرداد 1387, 15:44 عصر
اگر به دیتابیست connection ی وصل هست حتما باید اون کانکشن رو از بین ببری.
با سلام
ميشه بگين دقيقا چطور بايد اين كار رو بكنم؟؟؟
آيا با كد زير كانكشن بسته نميشه؟؟؟


connection.Close();

حمیدرضاصادقیان
سه شنبه 28 خرداد 1387, 22:47 عصر
سلام. من با این کد کانکشن هایی که به دیتابیسم وصل هست رو پیدا میکنم و در یک حلقه for همشو از بین میبرم.


select spid from master..sysprocesses where dbid=db_id('Test')

با این دستور از بین می برمش.


kill spid

منظور از Spid مقداری هست که این فیلد داره.

اقاقيا
چهارشنبه 29 خرداد 1387, 07:25 صبح
با سلام
ممنون از راهنماييتون...ولي ميشه واضح تر توضيح بدين...:متفکر:
يا اينكه يك مثال و نمونه كد بطور كامل بذاريد؟؟؟
dbid دقيقا چيه؟؟

منظور از Spid مقداری هست که این فیلد داره.
مقدار كدام فيلد مد نظر شماست؟؟

حمیدرضاصادقیان
چهارشنبه 29 خرداد 1387, 08:03 صبح
سلام .اون تستی که من نوشتم نام دیتابیس شماست.به جای اون نام دیتابیست رو قرار بده. spid شماره کانکشن هایی هست که به دیتابیس شما وصل هست.ممکنه تعدادش از یکی به بالا ادامه داشته باشه. که میتونی در برنامه ات چک کنی اگر بزرگتر از صفر بود در یک حلقه تا زمانی که query به انتها نرسید Spid (همون شماره کانکشنی که به دیتابیس شما وصل هست) رو جلوی دستور kill قرار بده و اونو از بین ببر.
موفق باشید.

اقاقيا
چهارشنبه 29 خرداد 1387, 16:26 عصر
میتونی در برنامه ات چک کنی اگر بزرگتر از صفر بود در یک حلقه تا زمانی که query به انتها نرسید Spid (همون شماره کانکشنی که به دیتابیس شما وصل هست) رو جلوی دستور kill قرار بده و اونو از بین ببر.
موفق باشید.
با سلام
ممكنه توضيح بدين اين حلقه رو چطور ايجاد كنم؟؟
راستي برنامه من Kill رو نميده...و بهم Server.KillProcess رو ميده...

NewFoxStudent
چهارشنبه 29 خرداد 1387, 16:47 عصر
Dim SqlCmd As New SqlClient.SqlCommand, SqlConn As New SqlClient.SqlConnection, SqlReader As SqlClient.SqlDataReader
Dim SPID As Integer
SqlConn.ConnectionString = "Data Source=(ServerName);Initial Catalog=(DataBaseName);User ID=sa;Password=;Connect Timeout=50"
SqlConn.Open()
SqlCmd.Connection = SqlConn
SqlCmd.CommandText = "select spid from master..sysprocesses where dbid=db_id('Test')"
SqlReader = SqlCmd.ExecuteReader()
Do While SqlReader.Read
SPID = SqlReader("SpID")
SqlCmd.CommandText = "Kill " + SPID.ToString
SqlCmd.ExecuteNonQuery()
Loop

اقاقيا
چهارشنبه 29 خرداد 1387, 17:12 عصر
ممكنه براتون كد C# رو هم بذاريد..
ممنون و مرسي از كمكتون...

ASKaffash
چهارشنبه 29 خرداد 1387, 17:13 عصر
سلام
این خط کد را بجای کد خودت اضافه کن :


string DatabaseName = "master";

NewFoxStudent
چهارشنبه 29 خرداد 1387, 17:22 عصر
SqlConnection SqlConn = new SqlConnection("Data Source=(ServerName);Initial Catalog=(DataBaseName);User ID=sa;Password=;Connect Timeout=50");
SqlCommand SqlCmd = new SqlCommand();
SqlDataReader SqlReader ;
string SPID;
SqlConn.Open();
SqlCmd.Connection = SqlConn;
SqlCmd.CommandType = CommandType.Text;
SqlCmd.CommandText = "select spid from master..sysprocesses where dbid=db_id('Test')";
SqlReader = SqlCmd.ExecuteReader();
while (SqlReader.Read())
{
SPID = SqlReader.GetString(1);
SqlCmd.CommandText = string.Concat("Kill " , SPID);
SqlCmd.ExecuteNonQuery();
}

اقاقيا
چهارشنبه 29 خرداد 1387, 19:05 عصر
سلام
این خط کد را بجای کد خودت اضافه کن :


string DatabaseName = "master";

با سلام
من منظورتونو متوجه نشدم:متفکر:يعني بجاي كل كدم اين رو بنويسم؟

NewFoxStudent عزيز كد شما به خط زير error ميگيره

SPID = SqlReader.GetString(1);
متن error :
Unable to cast object of type 'System.Int16' to type 'System.String'.
راستي يه سوال ديگه اين كد رو بايد قبل از كدي كه در پست 1 گذاشتم بذارم؟؟

NewFoxStudent
پنج شنبه 30 خرداد 1387, 08:32 صبح
من این کد رو امتحان کردم مشکگلی نداشت
به هر حال اینجوری تغییرش بده


SPID = SqlReader.GetInt16(1).ToString();

این کدها باید قبل از کد ریستور دیتابیس باشن

اقاقيا
شنبه 15 تیر 1387, 11:20 صبح
من این کد رو امتحان کردم مشکگلی نداشت
به هر حال اینجوری تغییرش بده


SPID = SqlReader.GetInt16(1).ToString();

این کدها باید قبل از کد ریستور دیتابیس باشن
با سلام
اول باید یه عذر خواهی بکنم چون می دونم تقریبا یه 2 هفته ای از آخرین پست این تاپیک گذشته...من به دلیل یکسری مشکلات نتونستم جواب بدم
مرسی از راهنماییتون ولی حالا باز یه Error دیگه میگیره به این خط
متن error :
Index was outside the bounds of the array.
من کل کد مربوط به restore رو میذارم...
شاید اینطوری بهتر باشه..


OpenFileDialog opd = newOpenFileDialog();
opd.Filter = "(*.BAK)|*.bak";
opd.Title = "انتخاب مسير";
if (opd.ShowDialog() == DialogResult.OK)
{
string path = opd.FileName;
string ServerName = "localhost";
string DatabaseName = "soha";
string UserName = "sohadialyze";
string Password = "1";
string cs = "";
try
{
cs = "server={0};database={1};uid={2};pwd={3};";
cs = string.Format(cs, ServerName, DatabaseName, UserName, Password);
SqlConnection connection = newSqlConnection(cs);
SqlCommand SqlCmd = newSqlCommand();
SqlDataReader SqlReader;
string SPID;
connection.Open();
SqlCmd.Connection = connection;
SqlCmd.CommandType = CommandType.Text;
SqlCmd.CommandText = "select spid from master..sysprocesses where dbid=db_id('soha')";
SqlReader = SqlCmd.ExecuteReader();
while (SqlReader.Read())
{
SPID = SqlReader.GetInt16(1).ToString();
SqlCmd.CommandText = string.Concat("Kill ", SPID);
SqlCmd.ExecuteNonQuery();
}
string sql = "RESTORE DATABASE soha FROM DISK = '{0}'";
sql = string.Format(sql, path);
SqlCommand command = newSqlCommand(sql, connection);
command.CommandType = CommandType.Text;
//connection.Open();
command.ExecuteNonQuery();
connection.Close();
MessageBox.Show("بازيابي ديتابيس از مسير دلخواه با موفقيت انجام شد");
}
catch
{
MessageBox.Show("اشکال در ارتباط با بانک اطلاعاتی");
}
}

از کمکتون ممنون میشم چون این برنامه رو باید هرچه زود تر تحویل بدم...

sahmah65
شنبه 15 تیر 1387, 14:54 عصر
برای Restore کردن اول باید Db به حالت offline در بیاد بعد restore بشه
کد:

Alter Database DbName Set Offline With RollBack Immediate

حالا Restore

Restore Database dbName From Disk='Path'

در Conection String هم Databse رو بزارmaster

string Master_Con="Sever=localhost ;database=master;integrated security=true"

اقاقيا
شنبه 15 تیر 1387, 16:12 عصر
با سلام کاری که گفته بودین رو انجام دادم ولی این error رو میده : :ناراحت:
The tail of the log for the database "soha" has not been backed up. Use BACKUP LOG WITH NORECOVERY to backup the log if it contains work you do not want to lose. Use the WITH REPLACE or WITH STOPAT clause of
یکی کمک کنه :گریه::گریه::گریه:

اقاقيا
یک شنبه 16 تیر 1387, 13:08 عصر
یعنی هیچ کس نمی تونه کمکم کنه...؟؟!!:متفکر:
نمی دونم چرا حل نمیشه :عصبانی++:
من واقعا بهش نیاز دارم...:ناراحت:

sahmah65
یک شنبه 16 تیر 1387, 20:34 عصر
یعنی هیچ کس نمی تونه کمکم کنه...؟؟!!:متفکر:
نمی دونم چرا حل نمیشه :عصبانی++:
من واقعا بهش نیاز دارم...:ناراحت:

این دقیقاً کدی هستش که خودم ازش استفاده کردم . که خودت بسته به پروژه ات تنظمیش کن.



private void btnBackUp_Click_1(object sender, EventArgs e)
{
if (txtBackName.Text.Length > 0 && txtBackName.Text != null)
{



DialogResult Result = FMessegeBox.FarsiMessegeBox.Show("آیا مایل به تهیه نسخه ی پشتیبان هستید؟", "تهیه ی پشتیبان", FMessegeBox.FMessegeBoxButtons.YesNo, FMessegeBox.FMessegeBoxIcons.Question);
if (Result == DialogResult.Yes)
{
string _BackUp = "BACKUP DATABASE Friends TO DISK=" + "'" + System.Environment.CurrentDirectory + "\\BackUPs" + "\\" + txtBackName.Text + ".bak" + "'";
SqlCommand BackUp = new SqlCommand(_BackUp, masters);
string _InsertToBackDetail = "InsertToBackDetail";
SqlCommand InsertToBackDetail = new SqlCommand();
InsertToBackDetail.CommandText = _InsertToBackDetail;
InsertToBackDetail.CommandType = CommandType.StoredProcedure;
InsertToBackDetail.Connection = FriendsConection;
InsertToBackDetail.Parameters.AddWithValue("@Name", txtBackName.Text);
InsertToBackDetail.Parameters.AddWithValue("@Desc", txtBackDef.Text);
masters.Open();
BackUp.ExecuteNonQuery();
masters.Close();
FriendsConection.Open();
InsertToBackDetail.ExecuteNonQuery();
FriendsConection.Close();
FMessegeBox.FarsiMessegeBox.Show("پشتیبان گیری با موفقیت انجام شد", "", FMessegeBox.FMessegeBoxButtons.Ok, FMessegeBox.FMessegeBoxIcons.Information);

}
}
else
{
FMessegeBox.FarsiMessegeBox.Show("نسخه ی پشتیبان نمی تواند بدون نام باشد", "", FMessegeBox.FMessegeBoxButtons.Ok, FMessegeBox.FMessegeBoxIcons.Error);
}


}

private void btnBacUPsNames_Click_1(object sender, EventArgs e)
{
using (BackUPDetailes frmBackUpDetailes = new BackUPDetailes())
{
frmBackUpDetailes.ShowDialog();
}
}

private void btnRestore_Click_1(object sender, EventArgs e)
{
if (txtResName.Text.Length > 0 && txtResName.Text != null)
{
DialogResult Result = FMessegeBox.FarsiMessegeBox.Show("آیا مایل به بازیابی نسخه ی پشتیبان هستید؟", "بازیابی", FMessegeBox.FMessegeBoxButtons.YesNo, FMessegeBox.FMessegeBoxIcons.Question);
if (Result == DialogResult.Yes)
{
try
{
string _OffDB = "ALTER DATABASE Friends SET OFFLINE WITH ROLLBACK IMMEDIATE";
string _ResDB = "RESTORE DATABASE Friends FROM DISK=" + "'" + System.Environment.CurrentDirectory + "\\BackUPs" + "\\" + txtResName.Text + ".bak" + "'" + " With Replace";
SqlCommand OffDB = new SqlCommand(_OffDB, masters);
SqlCommand ResDB = new SqlCommand(_ResDB, masters);

masters.Open();
OffDB.ExecuteNonQuery();
ResDB.ExecuteNonQuery();
FMessegeBox.FarsiMessegeBox.Show("بازیابی با موفقیت انجام شد", "", FMessegeBox.FMessegeBoxButtons.Ok, FMessegeBox.FMessegeBoxIcons.Information);
masters.Close();
}
catch
{
string _OnDB = "ALTER DATABASE Friends SET ONLINE";
SqlCommand OnDB = new SqlCommand(_OnDB, masters);

OnDB.ExecuteNonQuery();
masters.Close();
FMessegeBox.FarsiMessegeBox.Show("فایل پشتیبانی با نام وارد شده وجود ندارد", "", FMessegeBox.FMessegeBoxButtons.Ok, FMessegeBox.FMessegeBoxIcons.Error);
}
}
}
else
{

FMessegeBox.FarsiMessegeBox.Show("نام نسخه ای را که می خواهید بازیابی شود را باید وارد کنید", "", FMessegeBox.FMessegeBoxButtons.Ok, FMessegeBox.FMessegeBoxIcons.Error);

}
}

در ضمن یه یه پیشنهاد هم به شما دارم اون هم اینه که سوال های خودتون رو حتی در زمینه ی
پایگاه داده تو تالار های سی شارپ و وی بی دات نت مطرح کنید .چون من ندیدم اینجا به یه سوال نسبتاً سخت جواب درست و حسابی بدن و اکثراً نصفه هست.
موفق باشید.

اقاقيا
سه شنبه 18 تیر 1387, 10:54 صبح
با سلام
ممنون از راهنماييتون..
من کد شمارو هم براي backup و Restore امتحان کردم...
که Backup به راحتي گرفته مي شد...
ولي براي Restore دقيقا erorr ي که در بالا گفته بودم رو ميده:

The tail of the log for the database "soha" has not been backed up.
Use BACKUP LOG WITH NORECOVERY to backup the log if it contains work you do not want to lose.
Use the WITH REPLACE or WITH STOPAT clause of

که من فکر ميکنم مربوط به تنظيمات Sql من ميشه
از اساتيد ميخوام که علت اين erorr رو بهم بگن...
يه موضوع ديگه اينکه بعد از تست کردن کد هاي موجود براي Restore در Sql جلوي اسم ديتابيسم تو پرانتز نوشته شده:
Restricted User

ar.mahdian
چهارشنبه 26 تیر 1387, 21:23 عصر
سلام میکنم به اون دوستمون که مشکل داشت
من از کدی که یکی از اساتید پیشنهاد کرده بودند استفاده کردم و بعد از چند بار امتحان و آزمون خطا به نتیجه رسیدم
اگر میخوای این کد sql رو بهتر درک کنی پیشنهاد میکنم که توی enterprise manager اونو تست کنی
یکی از نکات مهم این عملیات اینه که باید به پایگاه داده master در sql sqrver وصل بشی نه به اون پایگاهی که میخوای بازیابی کنی که البته قبلا اساتید اشاره کرده بودند
نکته دیگه اینکه باید اون سه کامند پشت سر هم اجرا بشن و بین اجرای اونا دستور دیگهای نباشه به هر حال امیدوارم که مفید واقع بشه.


private void button2_Click(object sender, EventArgs e)
{
SqlConnection con;
SqlCommand com, com1, com2, com3;
con = new SqlConnection("Data Source=mycom;Initial Catalog=master;Integrated Security=True");
com1 = new SqlCommand("ALTER DATABASE mydb1 SET OFFLINE WITH ROLLBACK IMMEDIATE",con);
com2 = new SqlCommand("RESTORE DATABASE mydb1 FROM DISK='d:\\a\\backup1'", con);
com3 = new SqlCommand("ALTER DATABASE mydb1 SET ONLINE", con);

con.Open();
com1.ExecuteNonQuery();
com2.ExecuteNonQuery();
com3.ExecuteNonQuery();
con.Close();
}


فایل بکاپ من در مسیر d:\a با نام backup1 ذخیره شده
درضمن با اینکه مطمئنم که میدونی گفتنش ضرر نداره که به فرمت مسیر فایل بکاپ دقت کن