الأربعاء، 8 أبريل 2009

Case Study for Flashback

Case Study 1

يعمل أحمد في شركة بوظيفة (DBA) ويدير قاعدة بيانات بحجم 200GB , أستلم أحمد تقرير من أحد المطورين بأنه قام بالخطأ بحذف 10,000 سجل من الجدول المسمى Sales , ولا بد أن تستعاد هذه المعطيات , هنا أحمد بحاجة لاستعادة المعطيات بسرعة من دون فقدان أي معطيات , خذ بعين الاعتبار أن undo information متوفرة

أي من الطرق التالية هي الأفضل لاستعادة المعطيات المحذوفة والتي تحقق متطلبات الاستعادة ؟

1- استعادة قاعدة المعطيات كاملة Restore the entire database .

2- import utility (Use the Import utility).

3- Oracle Flashback Query .

4- Oracle Flashback Drop .

الطريقة الأفضل هي رقم 3 حيث أن flashback query تستخدم undo segments , والتي تزود snapshot للمعطيات في وقت معين ويمكنك من إعادة إدخال البيانات , إذا أحمد يمكن أن ينفذ الكود التالي :

INSERT INTO SALES

(SELECT * FROM

SALES AS OF TIMESTAMP

TO_TIMESTAMP(’’,

’DD-MON-YY HH24:MI:SS’) MINUS

SELECT * FROM SALES);


الطريقة رقم 1 غير صحيحة وذلك بسبب أن استعادة قاعدة البيانات كاملة تستغرق وقت أطول مقارنة مع الطريقة رقم 3 .

الطريقة رقم 2 غير صحيحة بسبب أن هناك معطيات والتي تم إدخالها بعد آخر export سوف تفقد .

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

Case Study 2

في الساعة 07:00 صباحا لاحظت أن هناك عملية تعديل خاطئة نفذت الساعة 2:00 مساءا (أي اليوم الأول) وعملية التعديل هذه عدلت العمود last_name لكل الموظفين إلى قيمة فارغة في الجدول EMP , وهناك العديد من المناقلات (transactions) تمت بعد هذه العملية على هذا الجدول وجداول آخري , أنت تريد أن تعيد المعطيات الأصلية للعمود last_name بحيث يكون الجدول يحوي البيانات قبل تنفيذ تعليمة التحديث الخاطئة ويجب أن تضمن التالي :

1- عدم التأثير على جدول آخر .

2- العملية يجب أن تأخذ أقل زمن ممكن من الوقت .

أي من الطرق التالية يجب أن تختار ؟

1- Oracle Flashback Drop

2- . Oracle Flashback Transaction Query along with Oracle Flashback Drop

3- Oracle Flashback Table

4- Oracle Flashback Database

الطريقة الأفضل هي رقم 3 .

الطريقة رقم 1 غير صحيحة وذلك لأن flashback drop تستخدم لاستعادة التأثيرات التي حدثت بسبب تعليمة drop .

الطريقة رقم 2 غير صحيحة وذلك لأن Oracle Flashback Transaction Query عبارة عن أداة لاستعراض التغيرات التي حدثت على قاعدة البيانات على مستوى transaction , مع أنها تمكنك من أن تنجز التحليل والتدقيق للـ transaction .

حيث أن هذه الأداة سواء كانت لوحدها أو مع Oracle Flashback Drop لا تستطيع استعادة المعطيات.

الطريقة رقم 4 غير صحيحة وذلك لان Oracle Flashback Database سوف تستعيد كامل قاعدة البيانات إلى زمن معين , وبذلك سيتم التراجع عن كل transaction التي تمت على الجداول الأخرى .




خلاصة رائعة:

Oracle Flashback Query enables the user to query data at some point in time to reconstruct lost data that may have been deleted or changed by accident.

Oracle Flashback Transaction Query provides a mechanism for viewing changes made to the database at the transaction level.

Oracle Flashback Table enables users to quickly recover a table or a set of tables (including all dependent objects and referential integrity) to a previous specified point.

Oracle Flashback Database provides a way to quickly rewind an Oracle Database instance, with a single SQL command, to a previous time to correct any problems caused by logical data corruption or user error.

ماذا تعرف عن flashback queries

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

لكي تدعم هذا النوع من الاستعلامات او ما يسمى flashback query لا بد من أن تكون قاعدة البيانات لديك تستخدم ما يسمى system-managed undo وهي ميزة قدمت في الإصدار oracle 9i للإدارة الآلية لما يسمى rollback segment .

Time-based flashback example:

لديك مثلا الجدول emp ويحتوي على 45 سجل


Select * from emp;

وبفرض أنك قمت بتنفيذ هذه التعليمة وهي حذف البيانات مع التثبيت


Delete from emp;

Commit;

إذا قمت بإصدار هذا الاستعلام فان النتيجة ستكون مساوية للصفر


select count(*) from emp;

الآن سوف نستخدم flashback query لاستعادة هذه البيانات جرب التعليمة التالية :


select count(*) from emp

as of timestamp (sysdate -5/1440);

ستجد أن النتيجة = 45

كيف نستعيد هذه البيانات ؟

تستطيع إستعادة البيانات إلى جدول جديد , وكما تعلم أنه لدينا في اليوم 1440 دقيقة وبالتالي فأن (sysdate-5/1440) سوف تشير الى الخمسة الدقائق التي مضت , فإذا كانت عملية الحذف تمت قبل أقل من خمس دقائق فإنك تستطيع إستعادتها بالكود التالي :


create table emp_w

as select * from emp

as of timestamp (sysdate -5/1440);

select * from emp_w;


ستجد انه تم إستعادة بياناتك الى الجدول الجديد , لنفترض أنه قد مضى على تنفيذ تعليمة الحذف أكثر من 20 دقيقة تستطيع استخدام الكود التالي بتغيير عدد الدقائق :


create table emp_w

as select * from emp

as of timestamp (sysdate -30/1440);


وبهذا تكون قد استعدت بياناتك

ملاحظة : إذا كان إصدار أوراكل لديك 9.0.1 فأن الكود السابق لن يعمل معك , وأنت بحاجة لاستخدام الاجرائيات الموجودة في الحزمة DBMS_FLASHBACK .

عزيزي القارئ : لقد وضعت بين يديك أداة رائعة من أدوات أوراكل والموضوع طويل وله شرح وتفصيل وقد شرحت لك فقط الفكرة وهناك الكثير والكثير عن هذا الموضوع وتستطيع البحث عن الموضوع على شبكة الأنترنت والاستفادة من هذه الأداة .

Powered By Blogger