2017/02/25

شرح ال Database Snapshot بالعربي

مقدمة

ال Database snapshot من الخصائص الهامة لقواعد بيانات ال SQL Server والغير مشهورة حيث لا يعلمها الكثيرون ويخلط الكثير بينها وبين ال Backup.
في هذا المقال سوف اوضح ماهي ال Snapshot وما هي اهميتها وكيفية الاستفادة منها وايضا كيفية تنفيذها باستخدام ال Scripts.


ما هي ال Snapshot

لفهم طبيعتها تخيل معي السيناريو التالي
لديك قاعدة بيانات بحجم 200 GB (وهذا يعتبر حجم متوسط لقواعد بيانات) وسوف يقوم احد المطورين بتشغيل اسكربت يقوم بتعديل مجموعة كبيرة من البيانات وتريد ان تؤمن قاعدة بياناتك بحيث يمكن الرجوع عما تم تنفيذه , فماذا ستفعل؟

اعتقد انك تفكر في اخذ Backup من قاعدة البيانات وعمل Restore له باسم اخر بحيث تستطيع كتابة Query للتراجع عن اي خطأ ينتج عن ذلك الScript!
ولكن ما الوقت الذي ستأخذه عملية ال Backup و ال Restore لقاعدة بيانات بمساحة 200 GB , ستأخذ وقت كبير جدا.
و ايضا تحتاج الى مساحة 200 GB على ال Disk متاحة.

اذا فما الحل السريع الفعال؟
الاجابة هي ال Snapshot :)

فال Snapshot هي عبارة عن نسخة للقراءة فقط من قاعدة البيانات تستطيع من خلالها قراءة كل البيانات التي كانت داخل قاعدة البيانات لحظة انشاء ال Snapshot.

طريقة عملها

ال Snapshot فعليا ليست نسخة جديدة من قاعدة البيانات ولكنها تعتمد على قاعدة البيانات الاساسية وتتبع اسلوب يسمى Copy on write (النسخ عند الكتابة).
فعند عمل Snapshot يقوم ال SQL Server بعمل ملف فارغ لل Snapshot يكون حجمه هو نفس حجم قاعدة البيانات وحجمه على ال Disk حوالي 2MB لانه فارغ من البيانات,
وعند التعديل في قاعدة البيانات الاساسية يتم نسخ البيانات الاصلية قبل التعديل (Pages) من قاعدة البيانات الاساسية الى ملف ال Snapshot,
وعند الاستعلام عن يقوم ال SQL Server بجلب البيانات من ال Snapshot ان كانت موجودة اما اذا لم يجدها فمعنى ذلك انها لم يتم تعديلها منذ وقت انشاء ال Snapshot ويتم جلبها من قاعدة البيانات الاساسية.
انظر الشكل التالي للتوضيح
فالاستعلام في الشكل السابق قام بجلب ال Page رقم 1:100 من ال Snapshot حيث تم تعديلها من قبل بينما قام بجلب ال Page رقم 1:101 من قاعدة البيانات الاساسية حيث لم يتم تعديلها.

بعض خصائص ال Snapshot

 نظرا لطبيعة ال Snapshot فانها يتم انشائها بسرعه كبيرة في ثواني معدودة حيث انها في بداية انشائها لا تحتوي على اي بيانات.
وايضا ال Snapshot لا تغني عن الBackup حيث انها لا قيمة لها اذا كانت قاعدة البيانات الاساسية معطلة حيث ان اي Snapshot لكي تعمل لابد ان تكون قاعدة البيانات الماخوذة منها عاملة ايضا واذا حدث بقاعدة البيانات الاساسية عطل ما وتريد استرجاعها لا يمكن ذلك الا من ال Backup وليس ال Snapshot.
يمكن عمل Restore لقاعدة البيانات من ال Snapshot للرجوع الى قيمة البيانات وقت انشاء ال Snapshot ولكن لابد ان تكون قاعدة البيانات سليمة وليس بها اي مشاكل.
ال Snapshot تؤدى الى زيادة اعباء الكتابة على ال (Disk (IO نظرا لان اي بيانت يتم تعديله يتم نسخ قيمته قبل التعديل الى ال Snapshot.


امثلة لاستخدام ال Snapshot

اغراض عمل تقارير عن بيانات قديمة

فتقوم بعمل Snapshot على رأس السنة مثلا للاحتفاظ بالبيانات في بداية السنة وتجعل بعض التقارير تقرأ من هذه البيانات.

اغراض للوقاية من تنفيذ اسكربتات الخاطئة

فكما في المثال في بداية المقال يمكنك عمل Snapshot قبل تنفيذ اي اسكربت يقوم بتعديل كمية كبيرة من البيانات حتى تستطيع ان تتراجع عن نتائجة في حالة حدوث خطأ ما.

اغراض قراءة البيانات من قاعدة بيانات ال Mirror

فعند عمل Mirroring , قاعدة بيانات ال Mirror لا يمكن القراءة منها ولكن ممكن عمل Snapshot للقراءة منها.

طريقة انشاء ال Snapshot

انظر الScript التالي
CREATE DATABASE Snapshot_Name ON
( NAME = DatabaseLogicalFileName , FILENAME ='SnapshotFilePath.ss' )
AS SNAPSHOT OF DatabaseName;
GO
Snapshot_Name اسم ال Snapshot
DatabaseLogicalFileName ال Logicalname الخاص بملف ال MDF الخاص بقاعدة البيانات
SnapshotFilePath.ss مسار ملف ال Snapshot ويكون بامتداد ss.
DatabaseName اسم قاعدة البيانات التي تريد اخذ Snapshot لها.

بعد ذلك ستجدها ظهرت في ال Management studio انظر الشكل التالي
وبذلك يمكن فتح Connection عليها كانها قاعدة بيانات وعمل اي استعلامات للقراءة منها.

ولعمل Restore لقاعدة البيانات من ال Snapshot

انظر الاسكربت التالي
RESTORE DATABASE DatabaseName from 
DATABASE_SNAPSHOT = 'Snapshot_Name ';


ملخص

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

مراجع

https://technet.microsoft.com/en-us/library/ms187054(v=sql.105).aspx





هناك تعليق واحد:

ABDOU ALI يقول...

بارك الله فيك أخي. الله يجازيك خير

مقدمة عن الDevOps

في هذا المقال سوف اتحدث عن مقدمة بسيطة عن ال DevOps ولماذا لابد ان تهتم فرق تطوير البرمجيات به وما هي النتائج المترتبة عن استخدام اساليبه ...