PDA

View Full Version : راهنمایی از دوستان و اساتید در باره بازگرداندن اطلاعات دیتابیس



aminghaderi
شنبه 13 اسفند 1390, 23:43 عصر
با سلام و احترام ، خدمت دوستان و اساتید گرامی.
من در webAPP می خوام یه قسمت برای بازگردانی فایل پشتیبان (BackupFile.bak) داشته باشم و برای این کار با کلی تحقیق توانستم کد زیر رو بنویسم :



CommandText = "RESTORE DATABASE [Sab_DB]" +
" FROM DISK = 'E:\\AS.bak'" +
" WITH " +
" MOVE 'Jame_DB' TO 'E:\\ Sab\\App_Data\\Sab_DB.mdf' ," +
" MOVE 'Jame_DB_Log' TO 'E:\\Sab\\App_Data\\SabDB_Log.LDF' ," +
" REPLACE";


حالا خطایی که توسط SQLSxpress تولید و ارائه می شود ، چنین است :




Message="The file 'E:\\Sab\\App_Data\\Sab_DB.mdf' cannot be overwritten. It is being used by database '1AD64BE9D3FDE30412CF9AADB8E8E5BB_ES WEB PROJECTS\\01 - SABDB.MDF'.\r\nFile 'Jame_DB' cannot be restored to 'E:\\Sab\\App_Data\\SabDB.mdf'. Use WITH MOVE to identify a valid location for the file.\r\nThe file 'E:\\Sab\\App_Data\\SabDB_Log.LDF' cannot be overwritten. It is being used by database '1AD64BE9D3FDE30412CF9AADB8E8E5BB_ES WEB PROJECTS\\01 - SAB\\APP_DATA\\SABDB.MDF'.\r\nFile 'Jame_DB_log' cannot be restored to 'E:\\Sab\\App_Data\\Sab_DB_Log.LDF'. Use WITH MOVE to identify a valid location for the file.\r\nProblems were identified while planning for the RESTORE statement. Previous messages provide details.\r\nRESTORE DATABASE is terminating abnormally."



لطفا راهنمایی فرمایید :
1- چطوری (با چه کدی) باید توسط T-SQL پایگاه رو overwritten کنم؟
2- چطوری می تونم It is being used by database را حل کنم؟؟

با تشکر فراوان

aminghaderi
یک شنبه 21 اسفند 1390, 22:36 عصر
اساتید جوابی ندارند؟؟
چطور ممکنه SQLManegment امکان ریستور فایل بکاب یک دیتابیس رو بروی یک دیتابیس دیگر داشته باشه ، حالا در دستورات نشه این کار رو کرد؟؟؟؟
قطعه کد بالا این کار رو می خواهد انجام دهد که با پیام cannot be overwritten مواجه می شود؟!
من که اعتقاد دارم غیر ممکنه کار شدنی نباشه چون نمون آن رو قبلا دیدم ولی وقت برای تحقیق و پژوهش ندارم.

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

حمیدرضاصادقیان
دوشنبه 22 اسفند 1390, 18:19 عصر
سلام.
دوست عزیز شما نمیتونید روی دیتابیسی که در حال کار هست بازیابی انجام بدید.
قبلش میتونید با استفاده از دستور Use Master ارتباط با اون دیتابیس رو قطع کنید و اینکارو بکنید یا اینکه با استفاده از دستور Kill اتصالهای اون پایگاه داده رو از بین ببرید بعد اینکارو انجام بدید یا اینکه کلا Restore رو روی یک دیتابیس با نام جدید انجام بدید.

sanay_esh
دوشنبه 22 اسفند 1390, 18:37 عصر
با سلام میتونی از این استفاده کنی
Str = "use master select Dbid as Dbid from Sysdatabases where name='DBNAME'"
Da.SelectCommand = New SqlCommand(Str, CnnMaster)

Da.Fill(Ds, "Tmp")
DbId = Ds.Tables("Tmp").Rows(0).Item(0)

Try
Ds.Tables("Tmp1").Clear()
Catch ex As Exception

End Try
Str = "use Master select spid as pid from Sysprocesses where dbid='" + DbId.ToString + "'"
Da.SelectCommand = New SqlCommand(Str, CnnMaster)

Da.Fill(Ds, "Tmp1")

If Ds.Tables("Tmp1").Rows.Count > 0 Then
For I = 0 To Ds.Tables("Tmp1").Rows.Count - 1
Pid = Ds.Tables("Tmp1").Rows(I).Item(0)
cmnd.CommandText = "Kill " + Pid.ToString
cmnd.CommandType = CommandType.Text
cmnd.Connection = CnnMaster
Try
cmnd.ExecuteNonQuery()
Catch ex As Exception

End Try
Next
End If

بعدش هم برو این دستور رو اجرا کن همین به همین راحتی !!
Str = "RESTORE DATABASE [DBNAME] FROM DISK = N'" + strPath2 + "' WITH FILE = 1, NOUNLOAD , STATS = 10, RECOVERY "

aminghaderi
دوشنبه 22 اسفند 1390, 22:17 عصر
با سلام میتونی از این استفاده کنی
ممنون از کد هایی که قرار دادید ، می شه کمی توضیح بدید این قطعه دقیقا چکار می کنه؟؟