الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

النسخ الاحتياطي والاسترجاع باستخدام sqlserver

مغلق
بدأه عبدالجليل العقوري في 11 يوليو 2006 · 14 رد · 1,881 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

الأخوة الكرام السلام عليكم ورحمة الله وبركاته

حيراني جدا النسخ الاحتياطي والاسترجاع أم النسخ فاعتقد انه نجح معي ولكن الاسترجاع يظهر لي رسالة خطا لم افهم ما سببها وقد قرأت في احد المرات في هذا المنتدى انه احتاج قاعدة بيانات فارغة وبنفس الاسم وحقيقتا ما احتاجه هو الشرح الكامل لأني فشلت صفت قاعدة بيانات فارغة ولكن لم اعرف أين يكون موقعها في الكود وأين يكون موقع القاعدة التي استخدمها .

ملاحظات :

اسم قاعدة البيانات التي استخدمها هي STORE

اللغة VB2003

قاعدة البياناتSQL SERVER 2000

[attachmentid=32186]

  Dim SQL_Connection As New SqlConnection("data source=" + Environment.MachineName + "; initial catalog=STORE;Integrated Security=SSPI;;Connect Timeout=5")

			Dim cmd As SqlCommand = SQL_Connection.CreateCommand()
			cmd.CommandType = CommandType.Text
			cmd.CommandText = "BACKUP DATABASE STORE TO DISK = 'D:\Backup\a.bak' WITH INIT"[attachmentid=32186]
			SQL_Connection.Open()

			Try
				Me.Cursor = Cursors.WaitCursor
				cmd.ExecuteNonQuery()
				MessageBox.Show(Me, "تم عمل نسخة إحتياطية من قاعدة البيانات", "حفظ", MessageBoxButtons.OK, MessageBoxIcon.Information)
				Me.Cursor = Cursors.Default
			Catch ex As Exception
				MessageBox.Show(ex.Message)
				MessageBox.Show(Me, "خطأ فى أخذ النسخة الإحتياطية من قاعدة البيانات", "خطأ", MessageBoxButtons.OK, MessageBoxIcon.Error)
				Me.Cursor = Cursors.Default

			Finally
				cmd.Dispose()
				cmd = Nothing
				SQL_Connection.Close()
				SQL_Connection = Nothing
			End Try			


الاسترجاع
Dim SQL_Connection As New SqlConnection("data source=" + Environment.MachineName + "; initial catalog=STORE;Integrated Security=true;Connect Timeout=5")
		Try
			SQL_Connection.Open()
			Dim cmd As New SqlCommand


			cmd.Connection = SQL_Connection
			cmd.CommandType = CommandType.Text
			cmd.CommandText = "RESTORE DATABASE STORE FROM DISK = 'D:\Backup\a.bak'  WITH RECOVERY"
			cmd.ExecuteNonQuery()
		   Me.Cursor = Cursors.WaitCursor
			cmd.ExecuteNonQuery()
			Me.Cursor = Cursors.Default
			MessageBox.Show(Me, "تم إسترجاع النسخة الإحتياطية من قاعدة البيانات", "إسترجاع", MessageBoxButtons.OK, MessageBoxIcon.Information)
			Me.Cursor = Cursors.Default
		Catch ex As Exception
			MessageBox.Show(ex.Message)
			MessageBox.Show(Me, "خطأ فى إسترجاع النسخة الإحتياطية من قاعدة البيانات", "خطأ", MessageBoxButtons.OK, MessageBoxIcon.Error)
			Me.Cursor = Cursors.Default
		Finally
			SQL_Connection.Close()
		End Try

رسالة الخطاء التي تخرج لي عند تنفيذ الاسترجاع

____________.bmp

تم تعديل هذه المشاركة بواسطة عبدالجليل العقوري في 11 يوليو 2006 في 15:20

"نحن لا نستسلم... ننتصر أو نموت.... وهذه ليست النهاية... بل سيكون عليكم أن تحاربوا الجيل القادم والاجيال التي تليه... اما أنا... فإن عمري سيكون أطول من عمر شانقي."

عمر المختار

اللهم انعم على بلادي بالأمن والأمان

#2

انا حصلت لي نفس المشكلة، وكذلك ظهرت لي نفس الرسالة.

لكن هذه الرسالة تظهر بسبب ان السيرفر الملحق به قاعدة البيانات لا يزال يشتغل وهو بالتالي يعمل Lock لقاعدة البيانات.

انا عن نفسي حليتها حل اخر، وهو بنسخ الملف كل مرة اي Full BackUp

كما يمكن عمل واجهة جميلة للمستخدم يختار المجلد الذي سيتم عليه الBackUp ، وفي ال Restoreيقوم باختيار المجلد السابق الذي عمل عليه ال BackUp

مع مراعة ايقاف السيرفر قبل اي عمليه نسخ احتياطي او استجاع، وتشغيله بعد ذلك.

لكنني مقتنع ان هذا الحل غير عملي خصوصا اذا كبرت قاعدة البيانات. بالرغم من اني بحث في المنتديات العربية والانجليزية لم اجد حل.

اذا كان هنالك حل افيدونا ياشباب افادكم الله.

#3

اخي العزيز عبدالباسط شكر جزيلا لتفاعلك

انا نفسي وجدت هذه المشكلة في عدة مواقع اجنبية من دون حل لها فانا اتمنى منك ان ترسل لنا الطريقة التي

تستخدمها فانا اعتقد انها ستكون حلا مؤقتنا لي .

اقتباس
لكن هذه الرسالة تظهر بسبب ان السيرفر الملحق به قاعدة البيانات لا يزال يشتغل وهو بالتالي يعمل Lock لقاعدة البيانات

وفي راي اذا كان هنالك كود يمكنه ايقاف السيرفر هل ستنجح الفكرة اتمنى من الاخوة الكرام افدتنا

"نحن لا نستسلم... ننتصر أو نموت.... وهذه ليست النهاية... بل سيكون عليكم أن تحاربوا الجيل القادم والاجيال التي تليه... اما أنا... فإن عمري سيكون أطول من عمر شانقي."

عمر المختار

اللهم انعم على بلادي بالأمن والأمان

#4

السلام عليكم

يوجد مشاركه سابقه في منتدي السي شارب

مفيش فرق كبير

كود ال backup و restore مكتوب بداخل الكلاسات المرفقه

وحلول بعض المشاكل

/index.ph...9&hl=backup

#5

أنا أستخدم طريقة مختلفة في عمل الـ Restore لأن مشكلة الـ Connections المفتوحة أرهقتني ...

فأقوم بعمل Restart للبرنامج و في بداية البرنامج أقوم باستخدم القاعدة Master في عمل الـ Restore

بعد حفظ طلب الاسترجاع و مسار القاعدة في الريجستري ..

أرجو أن تكون الفكرة واضحة وبسيطة

#6

الاخ احمد طاهر مشكلة ال BackUp الذي يعمله SQL Server ينتج ملف بالامتداد Bak فكيف يمكن ان استرجع منه البيانات اذا لا سمح الله تم مسح ملف قاعدة البيانات لاي سبب من الاسباب.

الاخ mostbar نحتاج منك الى توضيح اكثر.

الاخ عبد الجليل مرفق مشروع يوضح الذي طلبته.

بافتراض ان قاعدة البيانات هي MyDataBase

ال DBMS المستخدم هو SQL Server2000

المجلد الذي يحتوي على قاعدة البيانات هو

C:\Program Files\MyProgram\Data

المشروع المرفق

WindowsApplication1.rar

#7

اخي عبد الباسط شكرا جزيلا لك وجاري التحميل

الاخ mostbar الرجاء ارفاق مثال ان امكن ذلك

"نحن لا نستسلم... ننتصر أو نموت.... وهذه ليست النهاية... بل سيكون عليكم أن تحاربوا الجيل القادم والاجيال التي تليه... اما أنا... فإن عمري سيكون أطول من عمر شانقي."

عمر المختار

اللهم انعم على بلادي بالأمن والأمان

#8

up

"نحن لا نستسلم... ننتصر أو نموت.... وهذه ليست النهاية... بل سيكون عليكم أن تحاربوا الجيل القادم والاجيال التي تليه... اما أنا... فإن عمري سيكون أطول من عمر شانقي."

عمر المختار

اللهم انعم على بلادي بالأمن والأمان

#9

ببساطة هذا هو الكود الذي أستخدمه :

أولا : عملية النسخ الإحتياطي :

 Sub DataBackup(ByVal Path As String)
		If con.State = ConnectionState.Open Then con.Close()
		Try
			If con.State <> ConnectionState.Open Then
				con.Open()
				cmd.Connection = con
				cmd.CommandText = "USE master BackUp DATABASE MyDB TO DISK= '" + Path + "'"
				cmd.ExecuteNonQuery()
				MessageBox.Show("تم عمل نسخ احتياطى لقاعدة البيانات", "نجاح العملية ", MessageBoxButtons.OK, MessageBoxIcon.Information)
				con.Close()
			End If
		Catch ex As Exception
			MessageBox.Show("حدث خطأ اثناء عملية النسخ احتياطى لقاعدة البيانات", MyCompanyName, MessageBoxButtons.OK, MessageBoxIcon.Error)
		End Try
	End Sub

ثانيا : عملية الإسترجاع :

يجب التنويه على أنك لا تستطيع استخدام نفس الكونكشن الخاص بقاعدة بياناتك MyDB لأنك هكذا تعدل على ملفاتها

لذا يجب عمل اتصال مستقل لقاعدة Master ألمرفقة مع SQL Server

أولا عند ضغط زر الإسترجاع : يتم حفظ مسار القاعدة المعطى في ملف Text خارجي .. - أنا أقوم بإعادة تشغيل البرنامج حتى يكون البرنامج معزول عن الداتا بيس أثناء تغييرها

  Sub DataRestore(ByVal Path As String)
		Try
			Dim sW As IO.StreamWriter = IO.File.CreateText(Application.StartupPath & "\Restore.txt")
			sW.WriteLine(Path)
			sW.Close()
			MessageBox.Show("سيتم إعادة تشغيل البرنامج لإكمال عملية استرجاع قاعدة البيانات", MyCompanyName, 
   System.Diagnostics.Process.Start(Application.StartupPath & "\My Application.exe") : End
MessageBoxButtons.OK, MessageBoxIcon.Information)
		Catch ex As Exception
			MsgBox(ex.Message, MsgBoxStyle.Critical)
		End Try
	End Sub

وهذا في أول سطر من الـ Load لأول فورم يظهر في البرنامج :

Private Sub FrmLogin_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

		RestoreDB()

	End Sub

وهذا هو الـ Sub المستخدم :

	Private Sub RestoreDB()
		If IO.File.Exists(Application.StartupPath & "\Restore.txt") = True Then

			Try
				Dim sr As IO.StreamReader = IO.File.OpenText(Application.StartupPath & "\Restore.txt")
				Dim Path As String = sr.ReadLine
				sr.Close()
				Dim SQL_Connection As New SqlConnection("user id=sa;data source=""SERVER\SQLSERVER""" & ";persist security info=True;initial catalog=master;password=pass")
				Dim cmd As SqlCommand = SQL_Connection.CreateCommand()
				cmd.CommandType = CommandType.Text
				cmd.CommandText = "RESTORE DATABASE MyDB FROM DISK= '" & Path & "'"
				SQL_Connection.Open()

				Me.Cursor = Cursors.WaitCursor
				cmd.ExecuteNonQuery()

				Me.Cursor = Cursors.Default
				IO.File.Delete(Application.StartupPath & "\Restore.txt")
				MessageBox.Show(Me, "تم إسترجاع النسخة الإحتياطية من قاعدة البيانات", "إسترجاع", MessageBoxButtons.OK, MessageBoxIcon.Information)
				Me.Cursor = Cursors.Default
				SQL_Connection.Close()
			Catch ex As Exception
				MessageBox.Show(ex.Message)
				MessageBox.Show(Me, "خطأ فى إسترجاع النسخة الإحتياطية من قاعدة البيانات", "خطأ", MessageBoxButtons.OK, MessageBoxIcon.Error)
				Me.Cursor = Cursors.Default

			Finally

			End Try
		Else
			Exit Sub
		End If
	End Sub

بالـأكيد يجب أن تغير بيانات الConnection لما يناسبك

في النهاية أرجو أن أكون قد أفدت و أي سؤال أنا حاضر

#10

أخ mostbar مشكور كانت عملية الاسترجاع ما عم تزبط معي وأخيرا زبطت بطريقتك ولكن ألا يوجد طريق ثانية لعدم إعادة تشغيل البرنامج عند عملية الاسترجاع لأن عملية الاسترجاع ستتنفذ في كل مرة اقوم بها بعمل Load لهذا الفورم الذي وضعت به عملية الاسترجاع...وجزاك الله خيرا

لا إله إلا الله العظيم الحليم,لا إله إلا الله رب العرش العظيم,لا إله إلا الله رب السموات ورب الأرض ورب العرش الكريم.

#11

اخي الكريم ....

عملية الإسترجاع - إذا لاحظت - لا تنفذ إلا عند طلب الإسترجاع في آخر مرة تم فيه9ا فتح البرنامج ...

حيث عند ضغط استرجاع أقوم بعمل ملف نص txt يحتوي مسار الإسترجاع .. و عند بداية البرنامج .. أتأكد إن كان موجودا فهناك استرجاع سيتم .. و إن لم يكن موجدا فلا استرجاع ..

وهذه وظيفة أول سطر لي الـ RestoreDB()

#12
اقتباس
عند ضغط استرجاع أقوم بعمل ملف نص txt يحتوي مسار الإسترجاع .. و عند بداية البرنامج .. أتأكد إن كان موجودا فهناك استرجاع سيتم .. و إن لم يكن موجدا فلا استرجاع

اخي الملف عند إنشائه اول مرة سيبقى موجودا وسيقوم البرنامج بعملية الاسترجاع في كل مرة سيبدا الفورم بعملية الLOAD

لا إله إلا الله العظيم الحليم,لا إله إلا الله رب العرش العظيم,لا إله إلا الله رب السموات ورب الأرض ورب العرش الكريم.

#13

لاحظ أخي الكريم .. في نهاية الكود أقوم بمسح الملف ;)

  IO.File.Delete(Application.StartupPath & "\Restore.txt")

إخواني الكرام ... الرجاء تجريب الكود أولا وبعدها إن لم يعمل نتناقش هنا لكن جربوا اولا

وجزاكم الله خيرا ...

تم تعديل هذه المشاركة بواسطة mostbar في 16 يوليو 2006 في 14:22

#14

شكرا أخ mostbar مشي الحال ...

لا إله إلا الله العظيم الحليم,لا إله إلا الله رب العرش العظيم,لا إله إلا الله رب السموات ورب الأرض ورب العرش الكريم.

#15

أخيرا الحمد لله :D

هذا الموضوع مغلق.

مواضيع مشابهة