Flashback Query in Oracle Database
نشر بواسطة : Obay Salah , November 19, 2024
هذا النوع متاح منذ إصدار Oracle9i، بحيث يمكننا استخدامه لاستعلام قاعدة البيانات ليس عن البيانات الموجودة حاليًا، ولكن عن البيانات الموجودة في نقطة زمنية معينة في الماضي. يعتمد هذا النوع في المقام الأول على Undo Tablespace، لذلك بمجرد تشغيل الاستعلام، يتم البحث عن المعلومات في Undo Segments، هذه المعلومات التي سيتم عرضها للمستخدم تظل مؤقتة ومتوفرة فقط ﻟلSession الحالية، بالطبع قد تفشل عملية Flashback Query إذا لم يتم العثور على البيانات المطلوبة في Undo Tablespace على سبيل المثال بسبب المدة الطويلة وإعادة كتابة بيانات جديدة
في البيانات المطلوبة، لذلك يجب على مسؤول قاعدة البيانات تحديد فترة احتفاظ Retention مناسبة.
لنتخيل الآن السيناريو التالي لفهم عملية Flashback Query بشكل أكثر وضوحًا:
لدينا الآن جدول يسمى Employee يحتوي على مجموعة من الحقول.
SELECT * FROM EMPLOYEE;
يحتوي جدول EMPLOYEE على 8 حقول.
لنفترض أن المستخدم قام بحذف بعض الحقول.
DELETE EMPLOYEE WHERE EMP_NO IN (1,5,7);
الآن إذا تصفحنا الجدول سنجد 5 حقول فقط.
ماذا لو قمنا الآن بعمل استعلام على الجدول ولكن في فترة زمنية في الماضي ولنفترض أنه كان قبل 20 دقيقة.
بالطبع سيبحث عن هذه المعلومات في ﺍلUndo segments ويعرضها، ولكن إذا لم يجدها ستظهر رسالة خطأ.
SELECT * FROM EMPLOYEE AS OF TIMESTAMP TO_TIMESTAMP ('23-06-08:03-33-38','DD-MM- YY:HH٤٢-MI-SS');
ستعرض نتيجة الاستعلام 8 حقول، ولكن حاليًا يتوفر 5 حقول فقط. لذا فقد عرضنا معلومات في الماضي، ولكن ماذا لو أردنا إحضار هذه المعلومات في الوقت الحاضر، أي أن هذه المعلومات تظل في الجدول، يمكننا إنشاء جدول جديد من المعلومات المعروضة ثم حذف جدول Employee وإعادة تسمية الجدول الجديد إلى Employee1.
CREATE TABLE EMPLOYEE1 AS (SELECT * FROM EMPLOYEE AS OF TIMESTAMP TO_TIMESTAMP ('23-06-08:03-33-38','DD-MM- YY:HH٤٢-MI-SS'));
الآن نقوم بحذف جدول Employee .
DROP TABLE EMPLOYEE;
ثم نقوم بإعادة تسمية الجدول EMPLOYEE1 إلى EMPLOYEE.
RENAME EMPLOYEE1 TO EMPLOYEE;
الآن جدول EMPLOYEE يحتوي على المعلومات التي كانت لديه قبل 20 دقيقة.
في الخطوات السابقة قمنا بعمل استعلام في Session معينة عن بيانات في لحظة معينة في الماضي، ولكن من الممكن أيضًا وضع كل هذه Sessions في لحظة معينة في الماضي،
بحيث تكون نتيجة جميع الاستعلامات لقاعدة البيانات من خلال هذه Session في نقطة معينة في الماضي يتم تحديدها أثناء Flashback،
أما باقي Sessions التي تعمل على قاعدة البيانات فإن البيانات يتم رؤيتها في قاعدة البيانات في الوقت الحقيقي الآن؛ باستثناء هذه ﺍلSession التي ترى قاعدة البيانات في لحظة معينة في الماضي،
يتم ذلك من خلال حزمة DBMS_FLASHBACK.
لإرجاع ﺎلSession الحالية إلى الماضي يوم كامل نقوم بتنفيذ الإجراء PROCEDURE ENABLE_AT_TIME الموجود في حزمة DBMS_FLASHBACK PACKAGE.
DECLARE QUERY_TIME TIMESTAMP; BEGIN QUERY_TIME := TO_TIMESTAMP(SYSDATE -1); SYS.DBMS_FLASHBACK.ENABLE_AT_TIME ( QUERY_TIME); COMMIT; END; /
وبالتالي، خلال هذه ﺍلSession ، ترى جميع الاستعلامات قاعدة البيانات كما لو كنا بالأمس.
يجب ملاحظة أنه من خلال هذا النمط، لا يمكن إجراء عمليات DML باستثناء SELECT
يمكن إلغاء هذا النمط من خلال إجراء DISABLE الموجود في حزمة DBMS_FLASHBACK.
BEGIN SYS.DBMS-FLASHBACK.DISABLE; COMMIT; END; /
بهذه الطريقة قمنا بإزالة وضع Flashback.
Comments
لايوجد تعليق حتى الان