PDA

View Full Version : سوال: مشكل در backupگيري از ديتابيس



navid1n2000
سه شنبه 30 تیر 1388, 21:50 عصر
من توي برنامه م يك قسمتي دارم به اسم پشتيبان گيري
براي ذخيره پشتيبان مشكلي ندارم
اما براي بازيابي پشتيان مشكل دارم
اين ارور رو ميده كه فكر كنم به ديتابيسش ربط دار:
http://www.uui.ir/pictures/9fc7900480a5a2e45ee704d28acc0939.jpg
اينم كدشه :

SqlConnection objConnection = newSqlConnection("Server=PC;Database=VamDB;Integrated Security = True");
SqlDataAdapter objDataAdapter = newSqlDataAdapter();
objDataAdapter.SelectCommand = newSqlCommand();
objDataAdapter.SelectCommand.Connection = objConnection;
objDataAdapter.SelectCommand.CommandText = "Restore DataBase VamDB From Disk= '" + Masir + "' ";
objDataAdapter.SelectCommand.CommandType = CommandType.Text;
objConnection.Open();
objDataAdapter.SelectCommand.ExecuteNonQuery();
objConnection.Close();

davar22
چهارشنبه 31 تیر 1388, 10:42 صبح
سلام
این پیغام رو زمانی میده که sql server داره کار میکنه اگر database ra dar halat normal نذاری restor انجام میشه روی حالات دیگز آن تحقیق کن

navid1n2000
چهارشنبه 31 تیر 1388, 15:26 عصر
سلام
این پیغام رو زمانی میده که sql server داره کار میکنه اگر database ra dar halat normal نذاری restor انجام میشه روی حالات دیگز آن تحقیق کن
نفهميدم . راهنمايي بيشتر

بهنام بهمنی
پنج شنبه 01 مرداد 1388, 09:41 صبح
برای restore کردن باید به پایگاه داده ای غیر از پایگاه داده ای که میخواهید restore کنید مثلا master وصل شوید بعد کد زیر را



SET NOCOUNT ON
DECLARE @spid INT, @cnt INT, @sql VARCHAR(255)
SELECT @spid = MIN(spid), @cnt = COUNT(*) FROM master..sysprocesses WHERE dbid = DB_ID(@dbname) AND spid != @@SPID
PRINT 'Starting to KILL '+RTRIM(@cnt)+' processes.'
WHILE @spid IS NOT NULL
BEGIN
PRINT 'About to KILL '+RTRIM(@spid) SET @sql = 'KILL '+RTRIM(@spid)
EXEC(@sql) SELECT @spid = MIN(spid), @cnt = COUNT(*) FROM master..sysprocesses WHERE dbid = DB_ID(@dbname) AND spid != @@SPID
PRINT RTRIM(@cnt)+' processes remain.'
END

که در آن dbname نام پایگاه داده شدما است - با این کار ارتباطات را با پایگاه دادهتان قطع می کنید - بعد هم عمل بازیابی را انجام دهید.

AminSobati
پنج شنبه 01 مرداد 1388, 11:04 صبح
برای قطع ارتباط سایر کاربران نیازی به KILL نیست:



use master
go

alter database mydb
set offline with rollback immediate

navid1n2000
پنج شنبه 01 مرداد 1388, 11:10 صبح
برای قطع ارتباط سایر کاربران نیازی به KILL نیست:



use master
go

alter database mydb
set offline with rollback immediate

ايناروكجا بنويسم
توي محيط ويژوال ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟؟؟؟؟؟
با زبان C# نميشه بقيه ارتباطارو ببندم ؟؟؟؟؟؟؟

AminSobati
پنج شنبه 01 مرداد 1388, 11:44 صبح
اینها دستوراتی هستند که باید به SQL Server ارسال بشن. بستن Connection باید توسط خود Engine انجام بشه و #C قادر به این کار نیست. همونطور که دستورات عادی مثل Select رو ارسال میکنین، اینها رو هم همینطور، ولی GO رو حذف کنید

hojjat_gh
جمعه 02 مرداد 1388, 00:08 صبح
با سلام
دوست عزیز این کد رو هم تست کن شاید مشکلت حل شد:


privatevoid BtnRestore_Click(object sender, EventArgs e)
{
try
{
SqlConnection mycn = newSqlConnection(@"data source=.\SQLEXPRESS;attachdbfilename=|datadirector y|\Db.mdf;" + "initial catalog=Db ;integrated security=true;connect timeout=30;user instance=true");
mycn.Open();
this.Cursor = Cursors.WaitCursor;
SqlCommand cmd = newSqlCommand();
cmd.CommandText = "ALTER DATABASE Db SET SINGLE_USER WITH ROLLBACK IMMEDIATE USE master;" + " RESTORE DATABASE Db FROM DISK ='" + TxtRestoreBackPath.Text + "'with Replace";
cmd.Connection = mycn;
cmd.ExecuteNonQuery();
this.Cursor = Cursors.Default;
mycn.Close();
mycn.Open();
cmd.CommandText =
"ALTER DATABASE Db SET MULTI_USER";
cmd.Connection = mycn;
cmd.ExecuteNonQuery();
mycn.Close();
MessageBox.Show("نسخه پشتیبان با موفقیت بازیابی شد ", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
Application.ExitThread();
}
catch { }



}

farnooshhp
دوشنبه 05 مرداد 1388, 12:00 عصر
دوستان منم همین مشکلو دارم دقیقا اما یه چیزی برام مبهمه! وقتی از دیتابیس بکاپ می گیریم آیا اطلاعات دیتابیسمون باید پاک بشه تا اطلاعات جدید که از این به بعد وارد میشه جایگزین بشه یا قبلی ها هم میمونه؟؟!!

و دیگه اینکه وقتی ریستور می کنیم اطلاعات فعلی پاک میشه؟ و اطلاعاتی که ریستور کردیم جایگزین میشه؟

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

AminSobati
دوشنبه 05 مرداد 1388, 17:12 عصر
دوست عزیزم،
Backup گرفتن چیزی از دیتابیس شما پاک نمیکنه. ولی وقتی Restore میکنید مثل این هست که دیتابیس رو از اول ساختین و به تاریخ اون Backup برگردوندین.

farnooshhp
سه شنبه 06 مرداد 1388, 08:56 صبح
ببخشید منظورتونو درست متوجه نشدم فقط میخام بدونم موقع ریستور اطلاعات فعلی پاک میشه یا نه؟

بهنام بهمنی
سه شنبه 06 مرداد 1388, 11:12 صبح
بله - بعد از restore اطلاعات به وضعیتی که در زمان پشتیبان گیری داشته اید بر می گردد.
علاوه بر اطلاعات , ساختار هم به وضعیت قبای بر می گردد.

farnooshhp
سه شنبه 06 مرداد 1388, 22:30 عصر
بله - بعد از restore اطلاعات به وضعیتی که در زمان پشتیبان گیری داشته اید بر می گردد.
علاوه بر اطلاعات , ساختار هم به وضعیت قبای بر می گردد.


ممنون از جوابتون پس برای همین موقع ریستور باید به یک دیتابیس دیگه سوئیچ کنیم؟
دیگه اینکه منظورتون از برگشتن ساختار به حالت قبلی چیه؟ یعنی تیبل ها و استور پروسیجرها هم مثل قبل میشن؟

shocraneh
شنبه 10 مرداد 1388, 08:16 صبح
Imports System.Data.SqlClient
Public Class backup

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim od As New SaveFileDialog
od.ShowDialog()
TextBox1.Text = od.FileName
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

cmd.Connection = cn
cmd.CommandText = "BACKUP DATABASE [project] TO DISK = N'" + TextBox1.Text.Trim + "' WITH NOFORMAT, NOINIT, NAME = N'project-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10"
cmd.ExecuteNonQuery()
' SqlCommand.CommandText = "BACKUP DATABASE " & dbName & " TO DISK = '" & Trim(Filepath) & "' WITH FORMAT,NAME = 'Full Backup of " & dbName & " ' "
MsgBox("تهیه پشتیبان از بانک با موفقیت انجام گرفت")
End Sub
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
Dim od As New OpenFileDialog
od.ShowDialog()
TextBox2.Text = od.FileName
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
cmd.Connection = cn
cmd.CommandText = "Use Master;ALTER DATABASE project SET SINGLE_USER with ROLLBACK IMMEDIATE;RESTORE DATABASE project FROM DISK= '" + TextBox2.Text.Trim + "' with REPLACE;ALTER DATABASE project SET MULTI_USER"
cmd.ExecuteNonQuery()
MsgBox(" بانک با موفقیت انجام restore شد")
End Sub


البته رو vb اما بدون ایراد

farnooshhp
شنبه 10 مرداد 1388, 09:15 صبح
ممنون بسیار مفید بود.
من یک پشتیبان گرفتم به نام a و یک جدول به نام test ایجاد کردم.
حالا دوباره پشتیبان گرفتم به نام b
با توجه به اینکه میگید ساختار هم با بازیابی برمیگرده به حالت قبل پس وقتی من پشتیبان a رو بازیابی میکنم نباید جدول test وجود داشته باشه درسته؟ :-؟؟
اما این اتفاق نیفتاد

بهنام بهمنی
شنبه 10 مرداد 1388, 09:52 صبح
در هنگام برگردادندن پشتیبان یک گزینه است, که می گوید در صورت تغییر ساختار آیا ساختار اصلاح شود , که باید آنرا انتخاب کنید

غلامرضا شریفی
شنبه 10 مرداد 1388, 11:44 صبح
Imports System.Data.SqlClient
PublicClass backup

PrivateSub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim od AsNew SaveFileDialog
od.ShowDialog()
TextBox1.Text = od.FileName
EndSub
PrivateSub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

cmd.Connection = cn
cmd.CommandText = "BACKUP DATABASE [project] TO DISK = N'" + TextBox1.Text.Trim + "' WITH NOFORMAT, NOINIT, NAME = N'project-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10"
cmd.ExecuteNonQuery()
' SqlCommand.CommandText = "BACKUP DATABASE " & dbName & " TO DISK = '" & Trim(Filepath) & "' WITH FORMAT,NAME = 'Full Backup of " & dbName & " ' "
MsgBox("تهیه پشتیبان از بانک با موفقیت انجام گرفت")
EndSub
PrivateSub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
Dim od AsNew OpenFileDialog
od.ShowDialog()
TextBox2.Text = od.FileName
EndSub
PrivateSub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
cmd.Connection = cn
cmd.CommandText = "Use Master;ALTER DATABASE project SET SINGLE_USER with ROLLBACK IMMEDIATE;RESTORE DATABASE project FROM DISK= '" + TextBox2.Text.Trim + "' with REPLACE;ALTER DATABASE project SET MULTI_USER"
cmd.ExecuteNonQuery()
MsgBox(" بانک با موفقیت انجام restore شد")
EndSub

وقتي داخل فرم قرار ميگيرد منظور از cn چيست شما در تصوير اي پي شبكه را وارد نموده ايد واقعا ميشود از روي شبكه backup گرفت