PDA

View Full Version : حل مشکل پشتیبان گیری و بازیابی برای همیشه



mohammad-gh
شنبه 14 اردیبهشت 1387, 13:47 عصر
با سلام ، ابتدا باید عرض کنم که این تاپیک بعد از جستجوی کامل سایت ایجاد شده

من در برنامه ام می خواهم بدون اینکه تنظیماتی روی Sql 2000 انجام شود از بانکم پشتیبان گیری کنم.
راههای زیادی در سایت پیشنهاد شده که عملی ترین آنها نیاز به این داره که یک نفر کاربلد و آشنا به sql تنظیماتی را در آن ایجاد کند .تازه اگر قرار است برنامه از طریق install و بدون دسترسی به entrprice Maneger انجام شود نمی دانم چه طوری عملی است.

به هر حال من این نوع پشتیبان گیری را در برنامه حسابداری هلو دیدم که شامل امکانات زیر است :
1- وقتی دکمه پشتیبان گیری زده میشه از کاربر سوال می کنه کجا ذخیره کنم و کاربر با مشخص کردن جا شروع به پشتیبان گیری می شود.
2- این فایلها به صورت زیپ یا کددار هستند.
3- موقع بازگرداندن هم با انتخاب همان فایل کا تمام میشود.
---------------------------------------------------
برنامه من در VS2005 و بانکم با sql2000 است.
امیدوارم در پایان این بحث کلمه حل شده را مقابل تاپیک ببینیم.

rezaei manesh
یک شنبه 15 اردیبهشت 1387, 09:20 صبح
سلام دوست عزیز
برای پشتیبان گیری می تونی یه پروسیجر بنویسی و مسیر رو بهش پاس بدی و از کامپوننت ها هم برای فشرده سازی استفاده کنی و..
اما برای بازیابی اطلاعات میتونی فایل پشتیبان را از حالت زیب خارج کنی(با همان کامپوننتی که استفاده کردی) و بعد مسیر فایل رو به یه پروسیجر دیگه که برای بازیابی هست بفرستی
اما مشکلبیشتر زمانی هست که می خوای بازیابی کنی و بهت پیغام می ده که یک کاربر داره از بانک استفاده می کنه و.. که اونم باید use master رو اول sp بنویسی و بعد همه کاربرای بانکی رو که می خوای برگردانی رو از بین ببری و بعد پشتیبان بگیری که من موقع بازیابی کمی مشکل دارم (همین بانک داره استفاده می شه و..)
برای دیدن پروسیجر ها هم کلمه backup رو در قسمت sql همین سایت جستجو کن
موفق باشی

mohammad-gh
یک شنبه 15 اردیبهشت 1387, 10:48 صبح
ابتدا از توجه شما متشکرم
اما:
من در بخش sql کدی که بشود از داخل vs2005 برای پشتیبان گیری استفاده کرد و بدون نیاز به دستکاری در sql باشد پیدا نکردم.
اگر ممکن است بیشتر توضیح بدید

Sub Zero
یک شنبه 15 اردیبهشت 1387, 14:18 عصر
سلام دوست عزیز کارهایی که بهشون اشاره کردی (برنامه حسابداری هلو) کد نویسی بسیار ساده ای داره . در واقع یکی از ویژگیهای جدید .Net این اجازه رو به برنامه نویس میده که بدون استفاده از توابع Sql و تنها با اضافه کردن چند رفرنس و اجرای فانکشهای از پیش تعریف شده اونها ، اعمال مورد نظر رو انجام بده .
مراحل انجام کار رو برات توضیح میدم .
ابتدا رفرنس های زیر رو به برنامتون اضافه کنید :
Microsoft.SqlServer.Smo
Microsoft.SqlServer.ConnectionInfo
بعد nameSpace های زیر رو به صورت زیر به کلاستون Import کنید :

Imports System.Data.SqlClient
Imports Microsoft.SqlServer.Management.Smo
Imports Microsoft.SqlServer.Management.Common
کد زیر رو برای گرفتن پشتیبان از دیتابیس استفاده کنید.

Public Shared Sub BackupDatabase(ByVal ConnectionStr As String, ByVal DevicePath As String)
Dim DataName As String="DataBaseName.bak"
Using cnn As New SqlConnection(ConnectionStr)
cnn.Open()
Dim Srvcon As New ServerConnection(cnn)
Dim Srv As New Server(Srvcon)
' Create backup device item for the backup
Dim bdi As New BackupDeviceItem(DevicePath & DataName, DeviceType.File)
' Create the backup informaton
Dim Backup As New Backup
Backup.Devices.Add(bdi)

With Backup
'Type Of Backup
.Action = BackupActionType.Database
.BackupSetDescription = "Backup DataBase"
.BackupSetName = "DB"
.Database = cnn.Database.ToString()
.LogTruncation = BackupTruncateLogType.Truncate
'Backup.ExpirationDate = New DateTime(2007, 5, 1)
' Run the backup
.SqlBackup(Srv)
End With
End Using
End Sub
پارامترهای این رویه شامل کانکشن استرینگ که رشته مربوط به اتصال به دیتابیس رو مشخص میکنه و Device Path که مسیر ذخیره بانک اطلاعاتی رو مشخص میکنه هست . شما میتونید با استفاده از یک SaveFileDialog این مسیر رو از کاربر دریافت کنید .
متغییر DataName نام فایل پشتیبان رو مشخص میکنه که پسوند اون bak است.
تا اینجا مربوط به پشتیبان گیری بود. برای انجام عمل restore از رویه زیر استفاده کنید.:

Public Shared Sub RestoreBackup(ByVal ConnectionStr As String, ByVal DevicePath As String)
Using cnn As New SqlConnection(ConnectionStr)
cnn.Open()
Dim DBName As String = cnn.Database
cnn.ChangeDatabase("master")
Dim Srvcon As New ServerConnection(cnn)
Dim Srv As New Server(Srvcon)
' Create backup device item for the backup
Dim bdi As New BackupDeviceItem(DevicePath, DeviceType.File)
' Create the restore object
Dim Restore As New Restore()
'cnn.Close()
With Restore
.Devices.Add(bdi)
.NoRecovery = False
.ReplaceDatabase = True
.Database = DataBaseName.bak
' Restore the database
Srv.KillAllProcesses(DBName) 'Important Code For Remove All Processes
.SqlRestore(Srv)
End With
End Using
End Sub

پارامترها مانند قبلند با این تفاوت که Device Path در اینجا شامل مسیر ونام بانک اطلاعاتی است که میتوان با استفاده از OpenFileDialog آن را از کاربر دریافت نمود . متد ChangeDatabase نیز باعث میشه مشکلی که جناب rezaei manesh بهش اشاره کردن پیش نیاد . برای اطمینان بیشتر متد KillAllProcesses رو هم استفاده کنید .
لازم به ذکر است که این روش رو خودم بارها پیاده سازی کردم وکاملا هم جواب داده . اگه جایی مشکل پیدا کردی مطرح کن .

rezaei manesh
یک شنبه 15 اردیبهشت 1387, 17:47 عصر
سلام جناب sub zero
دست تان درد نکنه من از این روش استفاده نمی کردم من از پروسیجر هایی که تو دات نت می سازم استفاده می کنم و.. اما روش شما رو هم دست می کنم فکر کنم بهتر و کم دردسر تر باشه
حالا اگه می شه راهنمایی کنید که اگه بخوایم این پشتیبان گیری رو از سمت کلاینت انجام بدیم
چه مواردی رو باید رعایت کنیم
1.دادن مسیر شبکه ای
2. دادن سطوح دسترسی مورد نیاز
3.و...

Sub Zero
دوشنبه 16 اردیبهشت 1387, 10:55 صبح
اگه بخوایم این پشتیبان گیری رو از سمت کلاینت انجام بدیم
چه مواردی رو باید رعایت کنیم
تنها چیز عجیبی که در این مورد باهاش مواجه شدم این بود که اگر مسیر ماشین پشتیبان گیری (BackupDeviceItem) یه کم طولانی میشد پیغام Failed Backup یا Failed Restore میداد . البته این مشکل فقط در کامپیوتر شرکت که به شبکه وصل بود پیش می یومد . توی کامپیوتر خونه همچین مشکلی نبود . شما هم تست کنید و نتیجه رو به من اطلاع بدید .

mohammad-gh
دوشنبه 16 اردیبهشت 1387, 12:23 عصر
می خواهم قبل ار هر چیز از sub zero عزیز تشکر کنم ، کد شما بسیار کارآمد و زیبا بود.

اما حیفم می آید حالا که بحث به این خوبی پیش رفته این رو نپرسم.

به نظر شما بهترین روش zip کردن یا کد دار کردن فایل Backup در vs20005 چیه؟
البته من شنیده ام که vb.net یه ابزار برای این کار داره که فقط هم با خود این ابزار فایل از حالت فشرده در می اید، که البته این خود یک مزیت هم است.

linux
دوشنبه 16 اردیبهشت 1387, 13:11 عصر
می خواهم قبل ار هر چیز از sub zero عزیز تشکر کنم ، کد شما بسیار کارآمد و زیبا بود.

اما حیفم می آید حالا که بحث به این خوبی پیش رفته این رو نپرسم.

به نظر شما بهترین روش zip کردن یا کد دار کردن فایل Backup در vs20005 چیه؟
البته من شنیده ام که vb.net یه ابزار برای این کار داره که فقط هم با خود این ابزار فایل از حالت فشرده در می اید، که البته این خود یک مزیت هم است.
کلاس های موجود در این فضا به شما کمک خواهند کرد،فایل ها فشرده شده ، این کلاس ها از استاندارهای تعریف شده در RFC 1951 http://www.faqs.org/rfcs/rfc1951.html
استفاده می کنند و تقریبا نرم افزارهای فشرده سازی با این فایلها کار می کنند ادامه توضیحات MSDN

The System.IO.Compression namespace contains classes that provide basic compression and decompression services for streams.
Classes
Class Description
DeflateStream Provides methods and properties for compressing and decompressing streams using the Deflate algorithm.
GZipStream Provides methods and properties used to compress and decompress streams.
Enumerations
Enumeration Description
CompressionMode Specifies whether to compress or decompress the underlying stream.

Sub Zero
دوشنبه 16 اردیبهشت 1387, 14:06 عصر
به نظر شما بهترین روش zip کردن یا کد دار کردن فایل Backup در vs20005 چیه؟
بهترین روش از نظر هر کسی یه چیزیه .روشی که من ازش استفاده میکنم به این شکله :
اگه برنامه WinRar رو نصب کرده باشید در محل نصب برنامه فایلی با نام Rar.exe وجود داره این فایل دارای قابلیتهای زیادیه . من این فایل رو در کنار برنامم کپی میکنم و با استفاده از سویچهای این فایل عمل فشرده سازی رو انجام میدم . مثال :

Using Prs As New Process
Dim SynName As String = Path.GetFileNameWithoutExtension(DataName)
With Prs
.StartInfo.WorkingDirectory = "Synch"
.StartInfo.Arguments = String.Format("a SynDB_{0}.syn -df", DataName)
.StartInfo.FileName = "Rar.exe"
.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
End With
Prs.Start()
End Using
این کد باعث میشه فایل Rar.exe که در پوشه Synch در کنار فایل EXE برنامم قرار داره اجرا بشه .
دستور a برای ایجاد آرشیو استفاده میشه
سوئیچ df باعث میشه بعد از ایجاد ارشیو (عمل فشرده سازی) فایل اصلی پاک بشه
این فایل برای Encrypt کردن فایلهای دیگه قابلیتهای زیادی داره مثلا با Switch -HP میتونید دیتا رو انکریپت کنید یا با Switch -P برای دیتا رمز بزارید .
جهت اطلاعات بیشتر به راهنمای برنامه قسمت command Line Mode مراجعه کنید .

mohammad-gh
چهارشنبه 18 اردیبهشت 1387, 11:01 صبح
من از کد و کلاس زیر برای فشرده سازی و رمز دار کردن فایل backup استفاده کردم امیدوارم مفید واقع شود.


'-----------------compress file and code -----------
Dim filename As String
filename = sfd.FileName + ".bak"
Try
_ZipUtility.CompressFile(filename, sfd.FileName)

Catch ex As Exception
MessageBox.Show("There was an error compressing the file" & vbCrLf & ex.Message, "Compression Sample", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try

که در آن sfd نام فایل بک آپ است که از savefiledialog خوانده می شود.
البته در ادامه با این کد فایل اصلی را نیز حذف می کنیم.


File.Delete(filename)

این هم برای خارج گردن از حالت فشرده


Dim filename As String
filename = ofd.FileName + ".bak"
Try
_ZipUtility.DecompressFile(ofd.FileName, filename)
Catch ex As Exception
MessageBox.Show("There was an error compressing the file" & vbCrLf & ex.Message, "Compression Sample", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
که اینبار ofd نام فایل است که از openfiledialog خوانده می شود.
فایل کلاس را هم ضمیمه کردم

elmira_63
شنبه 11 خرداد 1387, 09:40 صبح
این رفرنس هایی که گفته بودید به برنامه اضافه کنم رو توی قسمت add refrence رفتم ولی نداشتم ؟؟؟؟؟
sql هم درست نصب کردم !!!!!
این رفرنس هارو از کجا باید بیارم؟؟

touraj
شنبه 11 خرداد 1387, 10:53 صبح
این رفرنس هایی که گفته بودید به برنامه اضافه کنم رو توی قسمت add refrence رفتم ولی نداشتم ؟؟؟؟؟
sql هم درست نصب کردم !!!!!
این رفرنس هارو از کجا باید بیارم؟؟

برو به این فولدر:
C:\Program Files\Microsoft SQL Server\90\SDK\Assemblies folder

dll های زیر رو به برنامه اضافه کن:

Microsoft.SqlServer.ConnectionInfo.dll
Microsoft.SqlServer.Smo.dll
Microsoft.SqlServer.SqlEnum.dll
Microsoft.SqlServer.SmoEnum.dll

elmira_63
شنبه 11 خرداد 1387, 13:47 عصر
ممنون از راهنماییتون ولی توی این آدرسی که گفتید من فولدر assembelies folder رو ندارم ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
یعنی sql رو درست نصب نکردم ؟؟؟

Dariuosh
شنبه 11 خرداد 1387, 14:06 عصر
ممنون از راهنماییتون ولی توی این آدرسی که گفتید من فولدر assembelies folder رو ندارم ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
یعنی sql رو درست نصب نکردم ؟؟؟

C:\Program Files\Microsoft SQL Server\90\SDK\Assemblies

folder آخرش نيست

elmira_63
شنبه 11 خرداد 1387, 14:33 عصر
خب همون assembelies هم نیست توی فلدر sdk یه فلدر به نام include و یه فلدر به نام lib

touraj
یک شنبه 12 خرداد 1387, 08:37 صبح
خب همون assembelies هم نیست توی فلدر sdk یه فلدر به نام include و یه فلدر به نام lib

از کدوم ورژن SQL استفاده می کنی؟

hamed-p
یک شنبه 12 خرداد 1387, 08:56 صبح
تنها چیز عجیبی که در این مورد باهاش مواجه شدم این بود که اگر مسیر ماشین پشتیبان گیری (BackupDeviceItem) یه کم طولانی میشد پیغام Failed Backup یا Failed Restore میداد . البته این مشکل فقط در کامپیوتر شرکت که به شبکه وصل بود پیش می یومد . توی کامپیوتر خونه همچین مشکلی نبود . شما هم تست کنید و نتیجه رو به من اطلاع بدید .
درسته...
این پیغامشه:

Restore failed for Server '...'.

reza6384
دوشنبه 13 خرداد 1387, 10:21 صبح
سلام. ببخشید من نتونستم Microsoft.SqlServer.Management.Common رو Add کنم ، توی لیست NET. و Common پنجره Add Reference هم نبود . چیکار کنم؟؟

reza6384
دوشنبه 20 خرداد 1387, 14:48 عصر
سلام جناب SubZero
من پروسه Backup و Restore شما رو توی VS2005 اجرا کردم و مشکلم حل شد، اما یه نرم افزار هم روی VS2003 دارم که می خوام این کد ها رو به اون هم اضافه کنم ، اما موقع Add Reference فایل های DLL ای که گفتین ، این Error رو نمایش میده و میگه نمی شه Add کنم. چرا؟

reza6384
چهارشنبه 22 خرداد 1387, 10:07 صبح
کسی نیست این سوال من رو جواب بده؟

Sub Zero
شنبه 25 خرداد 1387, 10:19 صبح
نمی تونم جواب قطعی بدم اما احتمال میدم به این خاطر باشه که رفرنسهایی که میخواید اضافه کنید تنها با .Net Framwork 2 به بالا سازگاری داره . مثل این میمونه که شما بخواید یه برنامه که با 2005 نوشتید رو با 2003 باز کنید .
پیشنهاد : متن کامل خطا رو در گوگل سرچ کنید.

parsavb
یک شنبه 26 خرداد 1387, 08:25 صبح
ببخشید فضولی من گل کرده ، چرا از این dll استفاده نمی کنید هم راحت تره و هم اینکه با نسخه های مختلف مشکلی نداره
Microsoft SQLDMO Object Library 8.5
یه نمونه از کار با اون رو تو اینجا گذاشتم
http://barnamenevis.org/forum/showthread.php?t=110043

rezaei manesh
یک شنبه 16 تیر 1387, 09:24 صبح
بهترین روش از نظر هر کسی یه چیزیه .روشی که من ازش استفاده میکنم به این شکله :
اگه برنامه WinRar رو نصب کرده باشید در محل نصب برنامه فایلی با نام Rar.exe وجود داره این فایل دارای قابلیتهای زیادیه . من این فایل رو در کنار برنامم کپی میکنم و با استفاده از سویچهای این فایل عمل فشرده سازی رو انجام میدم . مثال :

Using Prs As New Process
Dim SynName As String = Path.GetFileNameWithoutExtension(DataName)
With Prs
.StartInfo.WorkingDirectory = "Synch"
.StartInfo.Arguments = String.Format("a SynDB_{0}.syn -df", DataName)
.StartInfo.FileName = "Rar.exe"
.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
End With
Prs.Start()
End Using
این کد باعث میشه فایل Rar.exe که در پوشه Synch در کنار فایل EXE برنامم قرار داره اجرا بشه .
دستور a برای ایجاد آرشیو استفاده میشه
سوئیچ df باعث میشه بعد از ایجاد ارشیو (عمل فشرده سازی) فایل اصلی پاک بشه
این فایل برای Encrypt کردن فایلهای دیگه قابلیتهای زیادی داره مثلا با Switch -HP میتونید دیتا رو انکریپت کنید یا با Switch -P برای دیتا رمز بزارید .
جهت اطلاعات بیشتر به راهنمای برنامه قسمت command Line Mode مراجعه کنید .

سلام
آقا این کد شما درست کار نمی کنه خطا هم نمی ده؟!
چند تا مشکل :
آدرس مبدا و منبا رو قید نکردی نام فایل رو در یک متغیر ریختی اما ازش استفاده نکردی؟!
در کل کد بالا کامل نیست؟
help رو هم خوندم اما دقیقا سر در نیاوردم
ببینید من فشرده سازی را با متد های دات نت انجام داددم از 1.6m اورد به 224k و همونو با winrar در ویندوز انجام دادم اومد 127k بخاطر همین می خوام با winrar فشرده کنم و...

Sub Zero
یک شنبه 16 تیر 1387, 10:06 صبح
Shared Sub Compress()
Using Prs As New Process
Dim SynName As String = Path.GetFileNameWithoutExtension(DataName)
With Prs
.StartInfo.WorkingDirectory = "Synch"
.StartInfo.Arguments = String.Format("a SynDB_{0}.syn {1} -df", SynName, DataName)
.StartInfo.FileName = "Compress.exe"
.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
End With
Prs.Start()
End Using
End Sub

اینم کد درستش .
منظور از SynDB_{0}.syn نام فایلی که در مقصد ایجاد میشه که من به دلخواه خودم پسوند اونو Syn گذاشتم تا توسط ویندوز شناخته نشه DataName هم نام و مسیر فایل مبدا هست .

rezaei manesh
یک شنبه 16 تیر 1387, 10:25 صبح
ممنون
این فکر کنم که مشکل رو حل کنه

rezaei manesh
دوشنبه 17 تیر 1387, 09:23 صبح
با سلام
من از کد شما استفاده کردم و کمی با تغییر اون همونی شد که من می خواستم و کلا حالا برای فشرده کردن هر کاری بخوام با این کد ها می کنم که خیلی عالی هستش
اما حالا می مونه خارج کردن فایل ها از حالت فشرده توسط کد یعنی می خوام وقتی طرف فایلی رو انتخاب می کنه اگه فشرده باشه خودم از اون حالت خارج کنم و بعد بازیابی رو انجام بدم
نتونسم سوئیچ هایی رو که مربوط به unzip هست رو پیدا کنم؟
ممنون می شم که راهنمایی کنید

Sub Zero
یک شنبه 30 تیر 1387, 13:54 عصر
با عرض معذرت به خاطر تاخیر چند روزه .
از کد زیر برای UnZip استفاده کردم .:

Using Prs As New Process
Dim SynName As String = Path.GetFileName(PathZip)
With Prs
.StartInfo.WorkingDirectory = Path.GetDirectoryName(PathZip)
.StartInfo.Arguments = String.Format("X {0} *.bak Dest", SynName)
.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
.StartInfo.FileName = String.Format("{0}\Synch\Compress.exe", My.Application.Info.DirectoryPath)
End With
Prs.Start()
End Using
فکر کنم همه چی مشخص باشه فقط PathDB كه مسير فايل فشرده رو مشخص میکنه . و اینکه bak.* مشخص ميكنه فقط فایلهای با این پسوند ازفایل استخراج بشن

rezaei manesh
یک شنبه 30 تیر 1387, 14:05 عصر
سلام
آقا دستت درد نکنه
فقیط یه سوال Compress.exe چیه که قبلا هم نوشته بودی که من winrar.exeنوشتم چرا از این استفاده می کنی شما؟

Sub Zero
یک شنبه 30 تیر 1387, 15:08 عصر
فقیط یه سوال Compress.exe چیه که قبلا هم نوشته بودی که من winrar.exeنوشتم چرا از این استفاده می کنی شما؟
فايليه كه در محل نصب برنامه Winrar با نام Rar.exe وجود داره و فقط به صورت CommandLine میشه باهاش کار کرد.

محسن بابائی
دوشنبه 07 مرداد 1387, 10:55 صبح
درسته...
این پیغامشه:

Restore failed for Server '...'.

من هم این مشکل را دارم (توی کامپیوتر خونه) . راه حل ؟

rezaei manesh
دوشنبه 07 مرداد 1387, 11:01 صبح
سلام
آقا مصطفی من هنوز نتونستم unzipکنم
کد شما خطا داد و جای Compress من rar.exe نوشتم اما دیگه خطا نداد اما هیچ کاری هم انجام نمی شه؟
چرا فکر می کنید مشکل از کجاست
شما این کد رو تست کردید؟
اگه می شه کد بالا رو با ادرس دهی مستقیم بنویسید تا من ببینم مشکل از پارامترهای ورودی من نباشه
ممنون

Sub Zero
دوشنبه 07 مرداد 1387, 14:40 عصر
من که گفتم از این کد بارها استفاده کردم .راهنماش هم اینو نوشته :
---------------------
Command X - extract files from an archive with full paths


--------------------------------------------------------------------------------


Extract files and folder with full paths. The folder structure, saved in the archive, is completely restored. This is the command line equivalent of the archive management command Extract.

In a similar manner as command e this command can extract files both to the current folder and to a specified folder.

For example, command:

WinRAR x Fonts *.ttf

will extract *.ttf files from the archive Fonts to the current folder, but the command:

WinRAR x Fonts *.ttf NewFonts\

will extract *.ttf files from the archive Fonts to the folder NewFonts

You need to use the trailing backslash as in the example above for denoting the destination folder

محسن بابائی
سه شنبه 08 مرداد 1387, 19:12 عصر
سلام
تمام مشکلات Restore سر این یه خطه کده :


SqlConnection.ClearAllPools()


اینم نمونه کد


Dim strSourcePath As String = Txt_SourcePath.Text + "\myDbBackUp.bak"
Dim strData As String = txt_desPath.Text.Trim + "\myDb_Data.mdf"
Dim strLog As String = txt_desPath.Text.Trim + "\myDb_Data.ldf"
Dim strsql As String = "RESTORE DATABASE TaxiService FROM DISK = '" & strSourcePath & "' " & _
" With Move 'myDbData_Data' TO '" & strData & "', " & _
" Move'myDBData_log' TO '" & strLog & "'"

'Exit Sub
Dim servername As String = "."
Dim db_UserName As String = "sa"
Dim db_Userpass As String = "123456"

Dim StrConn As String = "Server=" & servername & ";Database=Master;User ID=" & db_UserName & " ; Password=" & db_Userpass & ";"
Dim cnn As New SqlConnection(StrConn)

Dim cmdDetach As New SqlCommand("EXEC sp_detach_db 'myDb', 'true'", cnn)
Dim cmdRestore As New SqlCommand(strsql, cnn)

Try
SqlConnection.ClearAllPools()

cnn.Open()

cmdDetach.ExecuteNonQuery()
cmdRestore.ExecuteNonQuery()


Catch ex As Exception


MsgBox(ex.Message)

Finally
If (Not cmdRestore Is Nothing) Then cmdRestore.Dispose()
If (Not cmdDetach Is Nothing) Then cmdDetach.Dispose()
If cnn.State <> ConnectionState.Closed Then cnn.Dispose()
End Try


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

موفق باشید

rezaei manesh
چهارشنبه 16 مرداد 1387, 12:35 عصر
درسته...
این پیغامشه:

Restore failed for Server '...'.

سلام دوستان یه چیز جالب ربطی به طولانی بودن مسیر نداره مشکل باید جایه دیگه باشه
من همین کد رو در یک برنامه با sql2000 تست کردم مشکلی نبود اما همون کد رو با اس کیو ال2005 تست کردم در بعضی از مسیر ها همین خطا رو می داد مثل مسیر دسکتاپ من (C:\Documents and Settings\Hamed\Desktop\) ویا مسیر ریشه یک درایو مثل(c:/) هم همین مشکل رو دارد اما در مسیر زیر کار می کند c:\bk
فکر کنم یک اشکالی در sql2005 باشه نسخه 2005 من استاندارد ادیشن هست

jas1387
شنبه 19 مرداد 1387, 18:30 عصر
سلام

من یک فرم دارم که بر روی آن یک datagridview قرار دارد که در رویداد فرم لود از دیتابیس مقدار می

گیرد

قسمت Backup گیری نیز در این فرم قرار دارد که وقتی می خواهم backup بگیرم پیغام می دهد که

دارد از دیتابیس استفاده می شود این هم کدش ( راستی وقتی کد درون فرم لود مربوط به مقدار گیری

datagridview را پاک می کنم جواب می دهد )








Dim server As New SQLDMO.SQLServer2


Dim database As SQLDMO.Database2

Dim backup As New SQLDMO.Backup2

Dim restor As New SQLDMO.Restore2
Private Sub restore_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles restore.Click

Dim openfiledialog1 As New OpenFileDialog


Dim path As String

server = New SQLDMO.SQLServer2

server.LoginSecure = True

openfiledialog1.Filter = "(*.bak)|*.bak"

openfiledialog1.Title = "تعیین فایل برای بازیابی"
If openfiledialog1.ShowDialog = Windows.Forms.DialogResult.OK Then


server.Connect(My.Computer.Name)

database = server.Databases.Item("phone")

restor.Database = database.Name

path = openfiledialog1.FileName

restor.Files = path

restor.ReplaceDatabase = True

restor.SQLRestore(server)

server.DisConnect()

restor = Nothing

server = Nothing

MsgBox("restor انجام شد")

End If
End Sub


لطفا به من کمک کنید متشکرم:لبخندساده:

shanfamous
پنج شنبه 31 مرداد 1387, 12:03 عصر
سلام
مشکلی که بعضی ها گفته بودن پیام Restore failed for Server '...'. میده علتش یه بخش اشتباه در کد restore که sub zero نوشته.
باید به جای .Database = DataBaseName.bak بنویسیم .Database = DBName

elmira_63
شنبه 02 شهریور 1387, 08:23 صبح
سلام
من تو برتامم هم backup می گیرم هم restore انجام میدم
حالا میخوام یه قسمتی بهش اضافه کنم با عنوان backup گیری اتوماتیک که بشه فاصله زمانی و ساعت backup گیری رو اپراتور مشخص کنه
البته میدونم که توی اسکیوال به راحتی میشه اینکارو انجام داد ولی من نمی تونم به کاربرم بگم باید حتما اسکیوال رو بلد باشی و میخوام توی برنامه این کارو انجام بدم اگه امکانش باشه
به نظر خودم گفتم شاید بشه اینکارو توی اسکیوال انجام داد بعد کدش رو از اسکیوال استخراج کرد و تو وی بی ازش استفاده کرد

mohammad-gh
یک شنبه 03 شهریور 1387, 14:02 عصر
با سلام
وقتی از برنامه و روی شبکه می خواهم پشتیبان بگیرم پیغام خطا رو میده.
بانک در روی یک کامپیوتر دیگر است و من از طریق شبکه این کار را می کنم.

Backup failed for Server
تمامی موارد بالا را هم چک کردم.
sql من 2000 است.

Sub Zero
دوشنبه 04 شهریور 1387, 10:33 صبح
سلام دوستان یه چیز جالب ربطی به طولانی بودن مسیر نداره مشکل باید جایه دیگه باشه
من همین کد رو در یک برنامه با sql2000 تست کردم مشکلی نبود اما همون کد رو با اس کیو ال2005 تست کردم در بعضی از مسیر ها همین خطا رو می داد مثل مسیر دسکتاپ من (C:\Documents and Settings\Hamed\Desktop\) ویا مسیر ریشه یک درایو مثل(c:/) هم همین مشکل رو دارد اما در مسیر زیر کار می کند c:\bk
فکر کنم یک اشکالی در sql2005 باشه نسخه 2005 من استاندارد ادیشن هست

جناب رضایی منش بالاخره فهمیدم منشا این مشکل کجاست . ببینید در حالت پیش فرض Logon Type سرور به صورت Network Services ست شده برای همین وقتی میخواد به درایو ویندوز دسترسی داشته باشه این خطا رو میده ( فقط درایو ویندوز) برای حل این مشکل باید Logon Type رو روی Local System ست کنید مشکل حل میشه .(از طریق برنامه SQL Server Configuration Manager )
اگر هم قصد دارید تحت شبکه پشتبان گیری و بازگردانی رو انجام بدید سعی کنید برنامه رو توی درایوی غیر از درایو ویندوز نصب کنید چرا که دسترسی به درایو ویندوز ، تحت شبکه یه سری محدودیتها داره
برای اینکه دقیقا متوجه شید چه چیزی باعث بروز مشکل میشه از کد زیر در قسمت Catch استفاده کنید.:

Catch ex As Exception
MsgBox( ex.InnerException.InnerException.Message, 48, "پیغام")
End Try

rezaei manesh
دوشنبه 04 شهریور 1387, 11:09 صبح
سلام
خیلی خوب می شه اگه حل بشه من امشب تست می کنم بهت می گم
ممنون از اینکه گیر و گور کار رو در می یاری حقیقتش من خیلی گشتم نشد

rezaei manesh
دوشنبه 04 شهریور 1387, 13:46 عصر
جناب رضایی منش بالاخره فهمیدم منشا این مشکل کجاست . ببینید در حالت پیش فرض Logon Type سرور به صورت Network Services ست شده برای همین وقتی میخواد به درایو ویندوز دسترسی داشته باشه این خطا رو میده ( فقط درایو ویندوز) برای حل این مشکل باید Logon Type رو روی Local System ست کنید مشکل حل میشه .(از طریق برنامه SQL Server Configuration Manager )
اگر هم قصد دارید تحت شبکه پشتبان گیری و بازگردانی رو انجام بدید سعی کنید برنامه رو توی درایوی غیر از درایو ویندوز نصب کنید چرا که دسترسی به درایو ویندوز ، تحت شبکه یه سری محدودیتها داره
برای اینکه دقیقا متوجه شید چه چیزی باعث بروز مشکل میشه از کد زیر در قسمت Catch استفاده کنید.:

Catch ex As Exception
MsgBox( ex.InnerException.InnerException.Message, 48, "پیغام")
End Try

سلام
آقا من چیزی با این عناوینی که نوشتی پیدا نکردم لطفا بیشتر راهنمایی کن

Sub Zero
سه شنبه 05 شهریور 1387, 07:46 صبح
اینم عکسش :
http://img29.picoodle.com/data/img29/3/8/25/f_Backm_1523bf0.png (http://www.picoodle.com/view.php?img=/3/8/25/f_Backm_1523bf0.png&srv=img29)

rezaei manesh
سه شنبه 05 شهریور 1387, 16:45 عصر
سلام
ممنون عوض کردن مشکل حل شد
اما من همچنان تو unzip مشکل دارم
اینم کم مقدار ورودی های تابع هم نوشتم ببین مشکل چیه خطا هم نمی ده اما کار هم نمی کنه


'FilePath :"E:\VS2005\HomePrj\BongahPrgV2\BongahSadat_RezvaniM ashhad\BongahPro870520\BongahPro\bin\Debug\BackUp\"
'FileName : "[1387_06_03].Zip"
Using Prs As New Process
Dim SynName As String = System.IO.Path.GetFileName(FileName)
With Prs
.StartInfo.WorkingDirectory = System.IO.Path.GetDirectoryName(FilePath)
.StartInfo.Arguments = String.Format("X Src -hp141 *.bak Dest", SynName)
' .StartInfo.Arguments = String.Format("a -ep -hp141 {1}{0}.Bak {1}{2} -df", SynName, FilePath, FileName)
.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
.StartInfo.FileName = String.Format("{0}\System\Rar.exe", My.Application.Info.DirectoryPath)
End With
Prs.Start()
End Using

Sub Zero
چهارشنبه 06 شهریور 1387, 07:38 صبح
فکر کنم مشکلت تو این خط باشه :

.StartInfo.Arguments = String.Format("X Src -hp141 *.bak Dest", SynName)

به شکل زیر تغییرش بده :

.StartInfo.Arguments = String.Format("X {0} -hp141 *.bak Dest", SynName)

mohammad-gh
چهارشنبه 06 شهریور 1387, 15:04 عصر
ببخشید آقای sub zero
من هنوز برای برنامه ام، برنامه نصب درست نکرده ام .
1- حال اگر بخواهم انرا بر روی یک کامپیوتر دیگر که در آن بانک sql نصب نیست و از روی شبکه و از طریق ip به بانک متصل می شود ببرم این dll ها را در کجا بریزم تا پشتیبان گیری کار کند.
2- من بانکم را در سرور بر روی درایو C(درایو ویندوز) نصب کرده ام آیا به همین خاطر خطای "faield for server "را می دهد یا باید کار دیگری انجام دهم.
3- بانک من sql 2000 است.
برنامه شما به صورت لوکال و در کامپیوتر خودم (vs2005 و sql2000 بر روی آن نصب است)کار می کرد.
منتظر راهنمایی شما و سایر اساتید هستم.

Sub Zero
پنج شنبه 07 شهریور 1387, 08:11 صبح
ببخشید آقای sub zero
من هنوز برای برنامه ام، برنامه نصب درست نکرده ام .
1- حال اگر بخواهم انرا بر روی یک کامپیوتر دیگر که در آن بانک sql نصب نیست و از روی شبکه و از طریق ip به بانک متصل می شود ببرم این dll ها را در کجا بریزم تا پشتیبان گیری کار کند.
2

این فایلها باید دقیقا کنار فایل اجرایی برنامتون باشند .

- من بانکم را در سرور بر روی درایو C(درایو ویندوز) نصب کرده ام آیا به همین خاطر خطای "faield for server "را می دهد یا باید کار دیگری انجام دهم.
3- بانک من sql 2000 است.
برنامه شما به صورت لوکال و در کامپیوتر خودم (vs2005 و sql2000 بر روی آن نصب است)کار می کرد.

بله در چند پست قبل هم اشاره کردم که به دلیل محدودیتهایی که برای دسترسی به درایو ویندوز ، در شبکه وجود داره این مشکل پیش میاد پس سعی کنید برنامه و دیتابیس ها رو در درایوی غیر از درایو ویندوز نصب کنید . البته شاید راهی هم برای حل این مشکل باشه مثلا نوع Authentication رو عوض کنیم اما من تا حالا امتحانش نکردم .

mohammad akbri
دوشنبه 27 آبان 1387, 12:49 عصر
با سلام مراحل بکاپ گیری از بانک اطلاعاتی sqlserver2000 در vb.net به من بگوید با تشکر:لبخند:

Sub Zero
دوشنبه 27 آبان 1387, 16:14 عصر
با سلام مراحل بکاپ گیری از بانک اطلاعاتی sqlserver2000 در vb.net به من بگوید با تشکر:لبخند:
به پست شماره 4 (http://barnamenevis.org/forum/showpost.php?p=509963&postcount=4) همین تاپیک مراجعه کنید

Mostafa_taheree
دوشنبه 23 دی 1387, 23:10 عصر
خیلی ممنون کاربر sub zero از بابت این کد backup

amir1385
سه شنبه 24 دی 1387, 17:19 عصر
با سلام
من همه مراحل بالا رو امتحان کردم ، فقط سرعت پشتیبان گیری (زمانیکه حجم بانک بالا میره ) داره پایین میاد . اما تو یه برنامه حسابداری دیدم در 2 ثانیه پشتیبان گیری می کرد هر چی هم حجم بانک بالا میرفت تاثیری در سرعت پشتیبان گیری نداشت . چطوری میشه سرعت رو بالا برد؟

araelectronic@ymail.com
شنبه 29 فروردین 1388, 01:18 صبح
با سلام

من براي بك آپ از كدهاي اينجا استفاده كردم ولي وقتي با سورس كار ميكنم مشكلي ندارم اما وقتي كه setup تهيه ميكنم backup failed to server ميده در صورت امكان دوستان راهنمايي بفرمايند.
با تشكر

araelectronic@ymail.com
شنبه 29 فروردین 1388, 09:26 صبح
از دوستان كسي راهنمايي نميكنه؟

saeid_gobadi
جمعه 23 مرداد 1388, 22:28 عصر
سلام دوستان

فرمایش همه شما متین، اما مشکلی که هست اینه که sqlserver فایل رو در اختیار می گیره و نمی ذاره که باهاش کار کرد.

یعنی میگه که فایل توسط برنامه یا شخص دیگری داره استفاده می شه، مخصوصا زمانی که با SqlExpress کار می کنیم.

اگر لطف کنید راه حلی برای این مورد آخر ارائه بدین بی نهایت ممنون می شم.

HAMRAHSOFT.IR
سه شنبه 24 شهریور 1388, 13:46 عصر
سلام دوست عزیز کارهایی که بهشون اشاره کردی (برنامه حسابداری هلو) کد نویسی بسیار ساده ای داره . در واقع یکی از ویژگیهای جدید .Net این اجازه رو به برنامه نویس میده که بدون استفاده از توابع Sql و تنها با اضافه کردن چند رفرنس و اجرای فانکشهای از پیش تعریف شده اونها ، اعمال مورد نظر رو انجام بده .
مراحل انجام کار رو برات توضیح میدم .
ابتدا رفرنس های زیر رو به برنامتون اضافه کنید :
Microsoft.SqlServer.Smo
Microsoft.SqlServer.ConnectionInfo
بعد nameSpace های زیر رو به صورت زیر به کلاستون Import کنید :

Imports System.Data.SqlClient
Imports Microsoft.SqlServer.Management.Smo
Imports Microsoft.SqlServer.Management.Commonکد زیر رو برای گرفتن پشتیبان از دیتابیس استفاده کنید.

Public Shared Sub BackupDatabase(ByVal ConnectionStr As String, ByVal DevicePath As String)
Dim DataName As String="DataBaseName.bak"
Using cnn As New SqlConnection(ConnectionStr)
cnn.Open()
Dim Srvcon As New ServerConnection(cnn)
Dim Srv As New Server(Srvcon)
' Create backup device item for the backup
Dim bdi As New BackupDeviceItem(DevicePath & DataName, DeviceType.File)
' Create the backup informaton
Dim Backup As New Backup
Backup.Devices.Add(bdi)

With Backup
'Type Of Backup
.Action = BackupActionType.Database
.BackupSetDescription = "Backup DataBase"
.BackupSetName = "DB"
.Database = cnn.Database.ToString()
.LogTruncation = BackupTruncateLogType.Truncate
'Backup.ExpirationDate = New DateTime(2007, 5, 1)
' Run the backup
.SqlBackup(Srv)
End With
End Using
End Subپارامترهای این رویه شامل کانکشن استرینگ که رشته مربوط به اتصال به دیتابیس رو مشخص میکنه و Device Path که مسیر ذخیره بانک اطلاعاتی رو مشخص میکنه هست . شما میتونید با استفاده از یک SaveFileDialog این مسیر رو از کاربر دریافت کنید .
متغییر DataName نام فایل پشتیبان رو مشخص میکنه که پسوند اون bak است.
تا اینجا مربوط به پشتیبان گیری بود. برای انجام عمل restore از رویه زیر استفاده کنید.:

Public Shared Sub RestoreBackup(ByVal ConnectionStr As String, ByVal DevicePath As String)
Using cnn As New SqlConnection(ConnectionStr)
cnn.Open()
Dim DBName As String = cnn.Database
cnn.ChangeDatabase("master")
Dim Srvcon As New ServerConnection(cnn)
Dim Srv As New Server(Srvcon)
' Create backup device item for the backup
Dim bdi As New BackupDeviceItem(DevicePath, DeviceType.File)
' Create the restore object
Dim Restore As New Restore()
'cnn.Close()
With Restore
.Devices.Add(bdi)
.NoRecovery = False
.ReplaceDatabase = True
.Database = DataBaseName.bak
' Restore the database
Srv.KillAllProcesses(DBName) 'Important Code For Remove All Processes
.SqlRestore(Srv)
End With
End Using
End Subپارامترها مانند قبلند با این تفاوت که Device Path در اینجا شامل مسیر ونام بانک اطلاعاتی است که میتوان با استفاده از OpenFileDialog آن را از کاربر دریافت نمود . متد ChangeDatabase نیز باعث میشه مشکلی که جناب rezaei manesh بهش اشاره کردن پیش نیاد . برای اطمینان بیشتر متد KillAllProcesses رو هم استفاده کنید .
لازم به ذکر است که این روش رو خودم بارها پیاده سازی کردم وکاملا هم جواب داده . اگه جایی مشکل پیدا کردی مطرح کن .

ميشه يك نمونه قرا بديد

mohammad bayervand
چهارشنبه 06 اردیبهشت 1391, 22:48 عصر
دست دوستان درد نكنه مطالب بسيار جالب و مفيده