الانتقال إلى المحتوى

Flashback Technology


الباشا

Recommended Posts


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

وقبل البدء فى شرح الFlashback Technology لابد من الحديث عن الUndo Tablespace وذلك لأن اغلب انواع الFlashback Technology تعتمد على الUndo Tablespace .

فالUndo Tablespace يستخدم من قبل الOracle Server لتخزين الUndo Information ، لكن هل فكرت يوماً فى عملية الROLLBACK ؟ وهل سألت نفسك كيف يمكنك التراجع عن عمليات التعديل التى قمت بها فى بعض الحقول؟ ، رغم أنه تم تغير القيم القديمة الى القيم الجديدة .

السناريو بإختصار أنه عند إجراء عملية تعديلات على البيانات فى قاعدة البيانات فإن الOracle Server يقوم يتخزين القيم القديمة فى الUndo Tablespace قبل ان يتم تغييرها بالقيم الجديدة ، هذا السناريو يتيح لنا فرصة التراجع عن العمليات متى احتجنا إلى ذلك بشرط أن تكون القيم القديمة ما زالت موجودة فى الUndo Tablespace إذ لا يتصور أن تظل هذه القيم موجودة إلى مالانهاية فهو فى اخر الامر Tablespace له سعة محدودة وكذلك له فترة احتفاظ بالمعلومات محدودة يقوم بتهيئتها مدير قاعدة البيانات حسب ما يراه مناسباً .

فى الاصدارات السابقة كان يتم تخزين القيم التى تم تعديلها فى قاعدة البيانات فى Rollback Segment ولكن بعد الإصدار Oracle9i فصاعداً قدمت شركة اوركل خيار جديد هو Undo Segment مع إبقاء الخيار الاول متاحاً ، ولكن تنصح شركة اوركل بقوة استخدام الUndo Segment.

فالUndo Tablespace تتم إدارته عن طريق Managed Tablespace Locally وايضاً Automatic Extent allocation ، فلحظة بدء العملية يتم تخصيص وإنشاء Undo Segment الياً لتخزين القيم التى تتغير فى قاعدة البيانات بواسطة هذه العملية ، بحيث يتم تخصيص Undo Segment واحدة لكل عمليات ولكن يمكن أن تخدم هذه الSegment عدد من العمليات، فعند امتلاء الExtent يتم التحول للتى بعدها فى نفس الSegment بحيث يكون على الاقل هناك اثنين من الExtents فى كل Segement أما الحد الاقصى فيعتمد على DB Block Size ، أما إذا تم ملء جميع الExtents فى الUndo Segment فإنه يتم إعادة الكتابة فى الExtent إبتداءً من الأول ، أو يتم طلب تخصيص Extent جديدة.

قد يكون فى قاعدة البيانات الواحدة اكثر من Undo Tablespace لكن لا يمكن ان يعمل فى اللحظة الواحدة اكثر من Undo Tablespace ويتم تحديد عمل الUndo Tablespace فى قاعدة البيانات بواسطة المتغير Undo_Tablespace.

902469520.jpg

نشاء Undo Tablespace جديد

674188287.jpg

الان قاعدة البيانات تحتوى على اثنين من الUndo Tablespace ولكن يعمل واحد فقط هو UNDOTBS1 كما موضح اعلاه .

ولكن يمكن تغيير الUndo Tablespace الذى يعمل فى قاعدة البيانات من UNDOTBS1 الى ORCLUNDO.

655487754.jpg

قاعدة البيانات اوركل Oracle Database10g تتيح خيار ادرة الياً للUndo Tablespace وهو Automatic Undo Management ويتم تهيئته بواسطة المتغير UNDO_MANAGEMENT بحيث يأخذ القيمة AUTO ، أما خيار الإدارة اليدوى Manual Undo Magamenet فهو خيار مكلف ويحتاج لعمل اكثر من مدير قاعدة البيانات .
أما خيار الإدارة Automatic Undo Management فهو يقلل العبء من مدير قاعدة البيانات بحيث تكون إدراته فقط على مستوى الTablespace.

مدير قاعدة البيانات ينتظره تهيئة المساحة المناسبة للUndo Tablespace وذلك حسب المعلومات التى سيتم تخزينها ، كذلك لابد من تهيئة فترة الإحتفاظ Undo Retention للبيانات فى الUndo Segment وذلك بواسطة المتغير UNDO_RETENTION الذى يأخذ قيمة هى فترة الاحتفاظ بالثوانى .
الاصل فى هذا المتغير هو أن يأخذ القيمة 0 وهى تعنى Automatic اى يعنى محاولة الاحتفاظ بالمعومات حتى تنتهى ، على أن يتم الإحتفاظ بالمعلومات على الاقل 15 دقيقة ، لكن يمكن تحديد قيمة اخرى هى فترة الاحتفاظ بالثوانى واقصى قيمة هى 232.

409538998.jpg

وعموماً Undo information اى المعلومات الموجودة فى الUndo Segments تنقسم الى ثلاث حالات :-
1- Uncommitted Undo Information: وهى المعلومات التى لم يتم تثبيتها إلى الان وذلك لأن العمليات مازالت مستمرة ، هذا النوع من المعلومات لا يمكن حذفها واعادة الكتابة فيها .
2- Committed Undo Information: وهى لا نحتاجها لعمليات مستمرة ، ولكن لأن فترة الإحفاظ لم تنتهى بعد "Unexpired"، هذا النوع من العمليات نحتفظ به قدر الإمكان ما لم يؤدى ذلك لفشل بعض العمليات نتيجة عدم وجود مساحة فى الUndo Tablespace فى هذه الحالة يتم اعادة الكتابة فى هذه المعلومات ، ولكن قد يقوم مدير قاعدة البيانات بتهيئة الUndo Tablespace بحيث نضمن عدم مسح واعادة الكتابة فيها وذلك باستخدام الخيار Guaranteeing Undo Retention.

965891942.jpg

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

3- Expired Undo Information: وهى لا نحتاجها لعمليات مستمرة ، وكذلك فترة الاحتفاظ بها انتهت فيمكن اعادة الكتابة فيها متى ما احتجنا لمساحة فى الUndo tablespace.

من المشاكل التى تحدث كثيراً والتى يجب لمدير قاعدة البيانات مراعاتها :-
1- مشكلة المساحة Undo Tablespace Space Error: ويجب على مدير قاعدة البيانات مراقبة مساحة الUndo Tablespace فالعمليات التى لا تجد مساحة فى الUndo Tablespace تعطى رسالة الخطأ.
ORA-01650: unable to extend rollback segment


2- “Snapshot too old” Error: وهذا الخطأ يظهر عند تنفيذ استعلام يحتاج لمعلومات Undo Information قد تم مسحها واعادة الكتابة فيها ، لذا يجب على مدير قاعدة البيانات مراعاة فترة الإحتفاظ المناسبة UNDO_RETENTION وكذلك المساحة المناسبة مع مراعاة Guaranteeing Undo Retention.

يمكن الإستعلام عن الUNDO بواسطة:
DBA_UNDO_EXTENT
V$UNDOSTAT





للموضوع بقية.


سنتحدث فى باقى الموضوع عن الاتى :-

1- Flashback Query
From Oracle91 & Do use Undo

2- Flashback Table
From Oracle10g & Do use Undo

3- Flashback Version Query
From Oracle10g & Do use Undo

4- Flashback Transaction
From Oracle10g & Do use Undo

5- Flashback Drop
From Oracle10g & Do Not use Undo

6- Flashback Database
From Oracle10g & Do Not use Undo


رابط هذا التعليق
شارك


اولا اشكر كثيراً الاخ -=|mOOdY|=-

1- Flashback Query:
هذا النوع متاح منذ الإصدار Oracle9i بحيث نستطيع من خلاله عمل إستعلام فى قاعدة البيانات ليس للبيانات الموجودة حالياً وإنما لبيانات موجودة فى لحظة زمنية فى الماضى ، ويعتمد هذا النوع اساساً على الUndo Tablespace ، فبمجرد عمل الاستعلام يتم البحث عن المعلومات فى ال Undo Segments ، هذه المعلومات التى ستعرض للمستخدم تظل مؤقتة ومتاحة فقط للSession الحالية ، بالطبع فقد تفشل عملية الFlashback Query إذا لم نجد البيانات المطلوبة فى الUndo Tablespace مثلاً بسبب طول المدة وإعادة كتابة بيانات جديدة فى البيانات المطلوبة لذا على مدير قاعدة البيانات تحديد فترة احتفاظ Retention مناسبة.

ولنتصور الان السناريو التالى حتى نستوعب عملية الFlashback Query بصورة اوضح:
لدينا الان جدول يسمى Employee يحتوى على على مجموعة من الحقول.

132277498.jpg

الجدول EMPLOYEE يحتوى الان على 8 حقول.

لنفترض أن المستخدم قام بحذف بعض الحقول .

957553518.jpg

الان لو قمنا بإستعراض الجدول.

525456473.jpg

بقى لدينا فقط 5 حقول .

ماذا لو قمنا الان بعمل استعلام على الجدول ولكن فى فترة زمنية فى الماضى ولنفترض انها قبل 20 دقائق .
بالطبع سيبحث عن هذه المعلومات فى الUndo segements ويقوم بعرضها ، أما إذا لم يجدها فستظهر رسالة خطأ.
اى هذه المعلومات غير متوفرة حالياً فى الUndo Tablespace.

776294244.jpg

هذه هى نتيجة الإستعلام ، عرض 8 حقول ، لكن ما هو متاح حالياً هو 5 حقول فقط.

هكذا قمنا بعرض معلومات فى الماضى ، لكن ماذا لو أردنا أن نأتى بهذه المعلومات فى الحاضر أى تظل هذه المعلومات موجودة فى الجدول ، يمكن أن ننشئ جدول جديد من المعلومات المستعرض ومن ثم نقوم بحذف الجدول Employee وإعادة تسمية الجدول الجديد الى Employee1.

433249315.jpg

الان نقوم بحذف الجدول Employee

901801433.jpg


ثم نقوم بإعادة تسمية للجدول EMPLOYEE1 إلى EMPLOYEE.

767822296.jpg

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

فى الخطوات السابقة قمنا بعمل استعلام فى Session معينة عن بيانات فى لحظة معينة فى الماضى ، ولكن من الممكن كذلك أن نضع كل هذه الٍSession فى لحظة معينة من الماضى ، بحيث تكون نتيجة جميع الإستعلامات لقاعدة البيانات من خلال هذه الٍSession فى نقطة معينة من الماضى يتم تحديدها اثناء عمل الFlashback ، ولكن باقى الٍSessions التى تعمل على قاعدة البيانات ترى قاعدة البيانات فى الوقت الحقيقى الان ؛ ما عدا هذه الSession التى ترى قاعدة البيانات فى لحظة معينة من الماضى ، يتم ذلك من خلال الحزمة DBMS_FLASHBACK.


للرجوع بالSession الحالية للماضى يوماً كاملاً نقوم بتنفيذ الإجراء ENABLE_AT_TIME الموجود فى الحزمة DBMS_FLASHBACK

138100369.jpg


هكذا خلال هذه الSession جميع الإستعلامات ترى قاعدة البيانات كما لو كنا بالامس.

لابد من الإشارة إلى أنه من خلال هذا النمط لا يمكن إجراء عمليات الDML ماعدا SELECT.

744747762.jpg

يمكن إلغاء هذا النمط بواسطة الاجراء DISABLE الموجود فى الحزمة DBMS_FLASHBACK

869823578.jpg



هكذا قمنا بإلغاء النمط Flashback.

رابط هذا التعليق
شارك


1- Flashback Table:
ويسمى ايضاً Flashback Table Query واستحدث هذا النوع فى الإصدار Oracle10g ويعتمد اساساً على الUndo Tablespace ، وهو الرجوع بالجدول الى فترة زمنية فى الماضى ويعتمد اساساً الى الذهاب الى الUndo Segments وارجاع الجدول الى لحظة معينة فى الماضى مستفيدا من المعلومات الموجودة Undo Segments ، فقد تكون جرت على الجدول عدد من التعديلات سنجدها فى الUndo Tablespace ، بالطبع قد تفشل عملية ال Flashback Table إذا لم نجد المعلومات المطلوبة فى الUndo Tablespace نتيجة لإنتهاء فترة الإحتفاظ بالمعلومات المطلوبة مثلاً.

واليك الان السناريو التالى :
لنفترض ان لدينا جولين الاول يسمى DEPT وهو جدول الإدارات والثانى يسمى EMP وهو جدول الموظفين.

فلنستعرض كلا الجدولين.

287640179.jpg

625553940.jpg

لنضف إدارة جديد فى جدول الإدارات DEPT.

783024494.jpg

ونقوم بإضافة موظف جديد فى جدول الموظفين EMP بحيث ينتمى الموظف الجديد للإدارة الجديدة.

307815764.jpg

لنقوم بعرض الزمن الان

332226528.jpg

نحتاجة لعمل الFlashback Table.

الان نقوم بحذف الحقلين الذًًين اضفناهما للجدولين.

176709133.jpg

الان لنقوم بعمل Flashback Table للجدول EMP إلى ما قبل حذف الحقل EMP_NO=3 ،

339544412.jpg

فشلت عملية الإسترجاع Flashback Table وذلك لأننا نحتاج لعمل Enable Row Movement ، وهو عبار عن Flag يتم وضعه فى الData Dictionary ليوضح للاوركل عمليات التعديل.

961158097.jpg

قمنا بعمل Enable Row Movement للجدول EMP ، فلنحاول الان عمل Flashback Table للجدول EMP مره اخرى.

807034650.jpg

رسالة خطأ اخرى ، هل عرفت لماذا ؟ لأنه قد تم إنتهاك القيد Foreign Key Constraint إذ لا يمكن إعادة الموظف رقم 3 الى الجدول EMP وهو ينتمى الى الإدارة تم حذفها ‘ فهو يبتمى للإدارة رقم 3 قد تم حذفها ، فما الحل إذاً؟

الحل ان نقوم بعمل Flashback Table لكلا الجدولين EMP & DEPT.
لكن لا تنسى أن تقوم بعمل Enable Row Movement.

402769547.jpg

لقد تمت عملية الFlashback Tables بنجاح وليس ضرورياً أن نقوم بترتيب الجدول فى عبارة الFlashback وذلك لأن القيود Constraint يتم التأكد منها بعد نهاية العملية Transaction.

ملاحظة : لو فشلت محاولة استرجاع جدول Flashback Table فى اى عملية فإن العملية تتوقف ومن ثم يتم التراجع ROLLBACK عن العملية كلها ، اى لو نجحت عملية استرجاع الجدول DEPT فى العملية السابقة ولكن فشلت عملية استرجاع الجدول EMP فإن العملية برمتها ستفشل ويتم التراجع عن العملية كلها.

كما لا حظت عملية الFlashback Table لسيت مضمونة النجاح ، فقد تفشل فى احد الاسبابا التالية :-
1- إذا تم انتهاك احد القيود Constraint Violated.
2- إذا لم يتم عمل Enable Row Movement للجدول المطلوب استرجاعه.
3- إذا لم تتوفر المعلومات المطلوبة فى الUndo Tablespace ، ORA-08180:
no snapshot found based on specified time”
4- لا يمكن عمل Flashback Table لجدول فى Sys Schema


رابط هذا التعليق
شارك

3- Flashback Versions Query:
قد تحتاج احياناً كمدير لقاعدة بيانات لمراقبة بعض التعديلات على الحقول فتحتاج لمعرفة القيم التى اخذها حقل معين لفترات تاريخية معينة ، فمثلا قد تتحول مرتبات الموظفين كل فترة فيتم تعديل ملف الSalary كل فترة زمنية ، ولكن لنفترض أننى احتاج لمعرفة الHistory او القيم السابقة للمرتب لموظف معين منذ أن تم تعينة ، فكل ما هو متاح لى فى الجدول الان هو اخر قيمة للمرتب الحالى.
وقد استحدث هذا النوع فى الإصدار Oracle10g ويعتمد اساساً على الUndo Tablespace. بحيث ياتى بالمعلومات التى يريدها من الUndo Segments بعد أن نحدد له الفترة الزمنية المحددة أو عن طريق System Change Number (SCN).

371189211.jpg

احظ معى قيمة المرتب ابتداءً كانت 1000 وكانت نتيجة عمل Insert كما هو موضح بالحرف I ، بعد ذلك تم تعديلها الى القيمة 1500 نتيجة عمل Update كما هو موضح بالحرف U، وايضاً تم تعديله مرة اخرى الى القيمة 2000 بواسطة الامر Update كما هو موضح بالحرف U.

لقد قمنا فى المثال السابق بعرض المعلومات مستخدمين الSCN ، كما يمكن إستخدام الTimestamp .
.

رابط هذا التعليق
شارك


ملاحظــــــــة: لا يتم عرض القيم التى لم يتم تثبيتها Commited.

إذاً عملية الFlashback Versions إذا لم تجد الععلومات المطلوبة فى الUndo Tablespace فأنها ستفشل ، كما لا يمكن عمل Flashback Versions للجداول الخارجية External Tables وكذلك الجداول المؤقتة Temporary Tables وأيضاً المناظير Views.

رابط هذا التعليق
شارك

4- Flashback Transaction:
فى كل من Flashback Table and Flashback versions يتم استخدام الUndo Data للكائنات ، أما الFlashback Transaction فإنه يقوم بإسترجاع جميع الUndo Data For transaction اى على مستوى العمليات مهما كانت العمليات مرتبطة بعدد من الكائنات ،للإستعلام عن الFlashback Transaction نستخدم الView التالى :
FLASHBACK_TRANSACTION_QUERY.

970896702.jpg

ولأن البيانات الموجودة فى هذا الView حساسة جداً لذلك فإن هذا الView محمى بواسطة الصلاحية SELECT ANY TRANSACTION PRIVILEGE.

ولأن استعلام جميع العمليات على قاعدة البيانات يأتى بعدد كبير جداً من المعلومات ، فمن الأفضل التركيز فى الإستعلام بواسطة الشروط ، فلو أنى مثلاً أريد استعراض العمليات التى تمت على جدول معين فمن الافضل تحديد الشرط WHERE TABLE_NAME=’TABLE_NAME’

ولنفترض الان أنى اريد عمل استعلام عن العمليات التى حدثت على الجدول DEPT.

293477649.jpg

لقد تمت عملية UPDATE على الجدول DEPT.

ولكن يمكن استخدام الFLASHBACK VERSIONS اولاً لتحديد XID (Transaction Identifier)

990377978.jpg

لاحظ معى XID=05001D0057030000 ، سوف نستخدمها فى الFlashback Transaction Query

224820153.jpg

هكذا استخدمنا FLASHBACK_VERSIONS AND FLASHBACK_TRANSACTION.

وعموماً فإن الFLASHBACK_TRANSACTION يستخدم لعرض العمليات التى حدثت فى قاعدة البيانات ويستخدم هذا النوع ايضاً الUndo Information ، ويسمى ايضاً FLASHBACK_TRANSACTION_QUERY.

رابط هذا التعليق
شارك

  • بعد 7 سنة...

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   تمت استعادة المحتوى السابق الخاص بك.   مسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

جاري التحميل
×
×
  • أضف...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية