السلام عليكم و رحمة الله تعالى و بركاته,,,
اقتباستحدير : استعمال البرنامج و الكود قد يؤديان إلى خسارة بياناتكم إذا لم يستعملا كما يجب. المرجو انشاء قاعدة بيانات للتجربة و عدم تشغيل الكود على قاعدة بيانات مهمة قبل الفهم الجيد للكود.
في هذا الموضوع سأتشارك معكم كود عانيت الأمرين ليشتغل على كل الأجهزة. في كل مرة أنقحه و أتبث الإصدارة الجديدة يتصل بي الزبون بعد أيام ليقول لي أن هناك أخطاء عند إنشاء نسخة احتياطية لقاعدة البيانات. المهم, هاهو الكود جاهز للاشتغال و سهل إلصاقه و تنقيحه للعمل في مشروعات الأعضاء الكرام. الكود الذي سنقوم بدراسته سيسهل عمليات خلق نسخ احتياطية لقواعد البيانات من نوع SQL Server و استعادتها وقت الحاجة و كل هذه العمليات ستكون بطريقة برمجية.
للذخول في الموضوع مباشرة, لنبدأ بإنشاء مشروع VB.NET جديد من نوع WindowsApplication. بعد ذلك نقوم بتهيئة واجهة المستخدم كما هو مبين على الصورة.
بعد ذلك, لنقم باختيار 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() للبدء في عملية استعادة و استبدال قاعدة البيانات الحالية بتلك الموجودة على الملف الدي يحوي النسخة الإحتياطية.
الملف المرفق بهذا الموضوع به مشروع هذه الدراسة و الكود المبين أعلاه.
تحياتي...




