محمد رضى

دراسة حول كيفية إنشاء نسخة احتياطية لقاعدة بيانات Sql Server و استعادتها برمجيا

18 ردود في هذا الموضوع

السلام عليكم و رحمة الله تعالى و بركاته,,,

تحدير : استعمال البرنامج و الكود قد يؤديان إلى خسارة بياناتكم إذا لم يستعملا كما يجب. المرجو انشاء قاعدة بيانات للتجربة و عدم تشغيل الكود على قاعدة بيانات مهمة قبل الفهم الجيد للكود.

في هذا الموضوع سأتشارك معكم كود عانيت الأمرين ليشتغل على كل الأجهزة. في كل مرة أنقحه و أتبث الإصدارة الجديدة يتصل بي الزبون بعد أيام ليقول لي أن هناك أخطاء عند إنشاء نسخة احتياطية لقاعدة البيانات. المهم, هاهو الكود جاهز للاشتغال و سهل إلصاقه و تنقيحه للعمل في مشروعات الأعضاء الكرام. الكود الذي سنقوم بدراسته سيسهل عمليات خلق نسخ احتياطية لقواعد البيانات من نوع SQL Server و استعادتها وقت الحاجة و كل هذه العمليات ستكون بطريقة برمجية.

للذخول في الموضوع مباشرة, لنبدأ بإنشاء مشروع VB.NET جديد من نوع WindowsApplication. بعد ذلك نقوم بتهيئة واجهة المستخدم كما هو مبين على الصورة.

post-207152-1250099389_thumb.jpg

بعد ذلك, لنقم باختيار Add a reference... عبر Project من القائمة الرئيسية. من على اللائحة التي ستضهر نقوم بزيادة كل من Microsoft.SqlServer.SMo و Microsoft.SqlServer.ConnectionInfo

بعد ذلك نقوم بفتح نافذة الكود لـ Form1 ثم نزيد السطرين التاليين :

Imports Microsoft.SqlServer.Management.Common
Imports Microsoft.SqlServer.Management.Smo

داخل الكلاس Form1 سنزيد تابث جملة الإتصال ب SQL Server نفسه و ليس الإتصال بقاعدة بيانات :

Private Const srvrConnectionString As String = "Data Source=.\SQLEXPRESS;Integrated Security=SSPI;Connect Timeout=30"

الآن لنقم بزيادة الدالة المشتركة في الحدث Load و التي سنقوم من خلالها بملئ اللائحة ComboBox1 بأسماء كل قواعد البيانات التي يسيرها SQL Server.

	Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' إنشاء كائن الإتصال
Dim sqlConnection As New SqlClient.SqlConnection(srvrConnectionString)
Dim srvrConnection As New ServerConnection(sqlConnection)
' ربط الإتصال بالملقم
Dim srvr As New Server(srvrConnection)
ComboBox1.Items.Clear()
' تحميل لائحة قواعد البيانات
For Each db As Database In srvr.Databases
ComboBox1.Items.Add(db.Name)
Next
End Sub

في هذا الكود قمنا بربط الإتصال بـ SQL Server عبر الكائن Server كي نتمكن من الوصول إلى لائحة قواعد البيانات عبر المجموعة srvr.Databases التي سنسجلها باللائحة ComboBox1 لنضعها رهن اشارة المستعمل.

الآن و بعد تحميل اللائحة سننتظر من المستخدم اختيار قاعدة بيانات ثم الضغط على زر إنشاء النسخة الإحتياطية أو زر استعادة قاعدة البيانات من نسخة احتياطية. لنبدأ بالكود الذي سيمكننا من انشاء نسخ احتياطية لقواعد بيانات SQL Server بكل سهولة :

	Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim bError As Boolean
Dim dlgSaveFile As New SaveFileDialog()

bError = False
dlgSaveFile.Filter = "SQL Server database backup files|*.bak"
If dlgSaveFile.ShowDialog(Me) = Windows.Forms.DialogResult.OK Then
Label2.Text = "جار إنشاء النسخة الإحتياطية لقاعدة البيانات..."
Me.Update()
' إنشاء كائن الإتصال
Dim sqlConnection As New SqlClient.SqlConnection(srvrConnectionString)
Dim srvrConnection As New ServerConnection(sqlConnection)
' ربط الإتصال بالملقم
Dim srvr As New Server(srvrConnection)
' إنشاء الكائن الذي سنستعمله لإنشاء النسخة الإحتياطية
Dim bkp As New Backup()
' تحديد العملية في إنشاء نسخة احتياطية لكامل قاعدة البيانات
bkp.Action = BackupActionType.Database
' تحديد اسم قاعدة البيانات
bkp.Database = ComboBox1.Text
' تعليق على النسخة الإحتياطية
bkp.BackupSetDescription = "Database " + ComboBox1.Text + " backup " + DateTime.Today.ToShortDateString()
' إسم النسخة الإحتياطية
bkp.BackupSetName = ComboBox1.Text + "_backup"
' إنشاء نسخة كاملة لقاعدة البيانات وليس فقط للبيانات التي تم تغييرها
bkp.Incremental = False
' حساب مجموع البيانات للتأكد من صحة النسخة الإحتياطية
bkp.Checksum = True
' اقتطاع سجل قاعدة البيانات بعد إنشاء النسخة الإحتياطية
bkp.LogTruncation = BackupTruncateLogType.Truncate
' تحديد نوع الجهاز الذي سيتم عليه إنشاء النسخة الإحتياطية في ملف
Dim bdi As New BackupDeviceItem(dlgSaveFile.FileName, DeviceType.File)
bkp.Devices.Add(bdi)
Try
' بدأ عملية إنشاء النسخة الإحتياطية لقاعدة البيانات
bkp.SqlBackup(srvr)
Catch ex As Exception
MessageBox.Show("فشلت عملية إنشاء النسخة الإحتياطية لقاعدة البيانات." + vbCrLf + "Exception message :" + vbCrLf + vbTab + ex.Message, "خطأ", MessageBoxButtons.OK, MessageBoxIcon.Error)
bError = True
End Try
Label2.Text = ""
If Not bError Then MessageBox.Show("تمت عملية إنشاء النسخة الإحتياطية بنجاح.", "معلومات", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
End Sub

حيث سنبدأ بربط الإتصال بـ SQL Server ثم ننشئ الكائن Backup الذي يقوم بكل العملية و لكن قبل ذلك يجب أن نحدد اسم قاعدة البيانات المراد حفظها ثم طريقة الحفظ التي ستكون في هذا الكود عبارة عن حفظ كامل قاعدة البيانات و ليس جزء منها فقط. بعد ذلك نحتاج إلى إخبار SQL Server عن مكان إنشاء الملف الذي سيحوي النسخة الإحتياطية و ذلك بإنشاء و تهيئة الكائن BackupDeviceItem. إذا لم نقم بهذه العملية فالملف سيتم حفظه في المجلد الإفتراضي للنسخ الإحتياطية C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backupو نتم العملية بالمناداة على الدالة Backup.SqlBackup() لإنهاء العملية.

ملاحظة هامة : لتشغيل الكود أعلاه في أحسن الظروف, المرجو إنشاء مجلد جديد و إعطاء كافة الأذونات للمستخدم Users عبر نافذة خصائص المجلد على Tab Security.

و في الأخير لنستعرض الكود المخصص لاستعادة أو بالأحرى استبدال قاعدة البيانات الحالية بتلك الموجودة داخل الملف الذي يحوي النسخة الإحتياطية. هذا الكود محمي ضد محاولة التحايل و اختيار ملف مزيف لاستعادة قاعدة البيانات, حيث نطلب من SQL Server التأكد من صحة ملف النسخة الإحتياطية قبل البدء في عملية الإستعادة. هذه العملية تطيل بعض التواني من العملية بأكملها و لكن إذا علمنا أنه في حالة حدوث خطأ أثناء عملية الإستعادة سنخسر قاعدة البيانات الحالية أو بالأحرى سنخربها فهذه التواني ستبدو دات قيمة كبيرة.

الكود :

	Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim bError As Boolean
Dim dlgOpenFile As New OpenFileDialog()

bError = False
dlgOpenFile.Filter = "SQL Server database backup files|*.bak"
If dlgOpenFile.ShowDialog(Me) = Windows.Forms.DialogResult.OK Then
Label2.Text = "جار استعادة قاعدة البيانات من النسخة الإحتياطية..."
Me.Update()
' إنشاء كائن الإتصال
Dim sqlConnection As New SqlClient.SqlConnection(srvrConnectionString)
Dim srvrConnection As New ServerConnection(sqlConnection)
' ربط الإتصال بالملقم
Dim srvr As New Server(srvrConnection)
' إنشاء الكائن الذي سنستعمله لاستعادة قاعدة البيانات من النسخة الإقتصادية
Dim rstr As New Restore()
' استبدال قاعدة البيانات بأكملها
rstr.Action = RestoreActionType.Database
' التأكد من صحة البيانات من خلال التأكد من حساب مجموع البيانات
rstr.Checksum = True
' استكمال العملية حتى بعد حصول أخطاء في عملية الإستعادة
rstr.ContinueAfterError = True
' اسم قاعدة البيانات التي سيتم استبدالها
rstr.Database = ComboBox1.Text
' تحديد الجهاز الذي تتواجد به النسخة الإحتياطية
rstr.Devices.Add(New BackupDeviceItem(dlgOpenFile.FileName, DeviceType.File))
' قاعدة البيانات الحالية سيتم استبدالها بتلك الموجودة على النسخة الإحتياطية
rstr.ReplaceDatabase = True
' تأكيد استبدال قاعدة البيانات بأكملها و ليس جزء منها فقط
rstr.Partial = False
Try
' عملية التأكد من النسخة الإحتياطية قبل بدإ عملية الإستبدال
If rstr.SqlVerify(srvr) Then
' إيقاف كل ماهو مرتبط بقاعدة البيانات
srvr.KillAllProcesses(ComboBox1.Text)
' عزل قاعدة البيانات عن الملقم
srvr.DetachDatabase(ComboBox1.Text, True)
' بدأ عملية استعادة قاعدة البيانات
rstr.SqlRestore(srvr)
End If
Catch ex As Exception
MessageBox.Show("فشلت عملية استعادة قاعدة البيانات من النسخة الإحتياطية." + vbCrLf + "Exception message :" + vbCrLf + vbTab + ex.Message, "خطأ", MessageBoxButtons.OK, MessageBoxIcon.Error)
bError = True
End Try
Label2.Text = ""
If Not bError Then MessageBox.Show("تمت عملية استعادة قاعدة البيانات من النسخة الإحتياطية بنجاح.", "معلومات", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
End Sub

كالعمليتين السابقتين سنحتاج لربط الإتصال بـ SQL Server ثم ننشئ الكائن Restore الذي سيمكننا من استعادة قاعدة البيانات الموجودة على ملف يحوي النسخة الإحتياطية. خصائص الكائن Restore كمثيلتها Backup حيث سنحدد اسم قاعدة البيانات و تحديد نوعية الإستعادة ألا و هي استبدال قاعدة البيانات الحالية بتلك الموجودة على ملف النسخة الإحتياطية. و أخير سنحدد أنه يجب التأكد من صحة البيانات و استكمال الإستعادة حتى في حالة حدوث أخطاء.

بعد ذلك سنحدد نوع الجهاز الذي توجد عليه النسخة الإحتياطية عبر الكائن BackupDeviceItem في حالة رغبتنا في حفظ النسخة الإحتياطية على أي جهاز يقبل تسيير الملفات كذاكرة usb أو غيرها.

لحماية قاعدة البيانات الحالية سنقوم بالتأكد من أن الملف الذي اختاره المستخدم يحتوي على نسخة احتياطية حقيقية قبل البدء في عملية الإستعادة و ذلك عبر المناداة على الدالة Restore.SqlVerify(). بعدها يجب أن نقطع كل اتصال بقاعدة البيانات الحالية قبل البدإ في عملية الإستعادة و ذلك عبر المناداة على الدالة Server.KillAllProcesses("اسم قاعدة البيانات"). ثم نقوم بفك ارتباط قاعدة البيانات بـ SQL Server. و في الأخير ننادي على الدالة Restore.SqlRestore() للبدء في عملية استعادة و استبدال قاعدة البيانات الحالية بتلك الموجودة على الملف الدي يحوي النسخة الإحتياطية.

الملف المرفق بهذا الموضوع به مشروع هذه الدراسة و الكود المبين أعلاه.

تحياتي...

WindowsApplication2.rar

تم تعديل بواسطه محمد رضى
2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

جزاك الله خيرا وننتظر المزيد بإذن الله :rolleyes:

ملحوظة : أنت تستخدم الرموز الخاصة بلغات السى مثل

\n

\t

يبدو أنك اختلط عليك الأمر فأنت تكتب كود فيبى :D

تم تعديل بواسطه GHOST2010
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أرى أن شدة الملاحظة لديك -باسم الله ما شاء الله- أقوى من الكومبايلر :D

سأقوم بعملية تحرير لإصلاح الأخطاء.

شكرا أخي GHOST2010

تحياتي...

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

جوزيت أخي العزيز خير الجزاء انا كان نفسي شرح الموضوع هذا من زمان

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شكرا جزيلا

ولكن؟؟؟

لماذا لايتم حفظ النسخة الاحتياطية واعطاء خطأ عندما احدد سطح المكتب في وندوس 7؟؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أظنك قرأت هذا السطر :

ملاحظة هامة : لتشغيل الكود أعلاه في أحسن الظروف, المرجو إنشاء مجلد جديد و إعطاء كافة الأذونات للمستخدم Users عبر نافذة خصائص المجلد على Tab Security.

هذا يعود لحساب ويندوز الذي يشتغل عليه SQL Server Service الذي هو Network Service الذي لا يمتلك كل الأذونات للوصول إلى أي مجلد على المجلدات المسيرة من طرف نظام ويندوز. و للمزيد من المعلومات :

http://msdn.microsoft.com/en-us/library/ms...28VS.85%29.aspx

http://windowsitpro.com/article/articleid/...e-accounts.html

تحياتي...

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

جزاك الله خير

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

جزاك الله خير اخي العزيز

ولكن سؤالي لو كانت قاعدة البيانات على برنامج SQL Server 2000 والبرنامج على الشبكة وقاعدة البيانات على السيرفر ...

كيف تكون طريقة برمجة عمل نسخة احتياطية من قاعدة البيانات ؟؟

وكل عام وانتم بخير

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

اخوانى الموضوع جميل جدا وفعلا احنا استفادنا منه ولكن انا عندى سؤال بالله عليكم

انا لما اعمل Backup

بينجح معى وكل شيىء تمام

ولكن عندما اعمل rerstor بتفشل معى انا لا اعرف السبب فهل من المساعدة وجزاكم الله خيرا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شكرا جزيلا

احب ان اضيف انه يمكننا ان نعمل هذه الطريقة عن طريق BIDS وفتح مشروع جديد Integration Services Project

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شكرااااااااااااا الله يعطيك العافيه ان شاء الله

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

اخي الفاضل مشاركتك اروع من الروعه لكن ممكن سؤال هل يمكن تعديل الكود بحيث استخدمه داخل برنامج ويقوم بأخذ قاعده البرنامج فقط وعمل نسخه لها واستدعائها فيما بعد ارجو توضيح ذلك ان امكن علماً اني حاولت كثيراً لكن لم انجح وقد استخدمت كودد اخر لكن ايضا لم ينجح لذا ارجو مساعدتك ان امكن لاني ممبتدئه في البرمجه مع جزيل الشكر

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

شكراً على الموضوع المميز كتب الكود و لكن عند تنفيذ الكود يعرض رسالة خطأ بفشل عملية النسخ الاحتياطي

جربت اضع ملف على محرك القراص ال c و غيرت الادونات و لكن بدون فائدة

الرجاء المساعدة في اقرب وقت

وشكراً

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

هذا الكود ممتاز جداً و يا ريت تكمل جميلك لتعلمنى بالتحديد ما سأقوم بتغيره و لماذا لأتحكم فى قاعدة البيانات التى أريدها

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

جزاكـ الله خيرا وباركـ الله لك فى مالك واهلك وولدكـ

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

أخي الكريم اعرف ان المشاركة قديمة جداً ولكن واجهتني فيها مشكلة لم اجد لها حلاً مع العلم اني قمت بجميع ماقلت من الخطوات وانا استخدم فيجول بيسك 2008 وsql 2008 وانا محتاج هذا الكود فدلني على طريقة لعملية ضغط البيانات ففي هذه الفترة انا استخدم ضغط البيانات من خلال SQL

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

ممتاز عاشت يداك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شكرا اخي على الموضوع

لكن اواجه مشكله في البرنامج

JD3Aqo.png

علما ان السيرفر على حاسبه ثانيه

والربط صحيح ويجلب لي اسماء الجداول لكن عندما اريد الحفظ والضغط على حفظ تظهر لي هذه الرساله

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .