بتاريخ: 29 مايو 200916 سنة comment_158478 السلام عليكم ورحمة الله وبركاته... كيف حالكم أخواني واخواتي بهذا المنتدى الرائع المتميز دائما بطرح المواضيع الشيقة والمميزة والفيدة ؟؟؟سؤال : اذا قمت بحذف بيانات من sql plus سواء بقصد او بغير قصد وبعد ذلك قمت بعمل commit هل تستطيع استرجاع بياناتك ؟؟تعالوا لنعرف هل بامكانك استرجاع بياناتك أم لا...!!!flashback queries وهو نوع من الاستعلامات كجزء من نموذج تماسك البيانات ,وهو الجواب للسؤال انه بامكانك استرجاع بياناتك المحذوفه حتى لو عملت commit.....لكي تدعم هذا النوع من الاستعلامات او ما يسمى flashback query لا بد من أن تكون قاعدة البيانات لديك تستخدم ما يسمى system-managed undo وهي ميزة قدمت في الإصدار oracle 9i للإدارة الآلية لما يسمى rollback segment .Time-based flashback example:لديك مثلا الجدول emp ويحتوي على 45 سجل كود بلغة HTML: Select * from emp; وبفرض أنك قمت بتنفيذ هذه التعليمة وهي حذف البيانات مع التثبيت( commit ) 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 .كما أن هناك ما يسمى flashback table في الإصدار oracle 10g والذي يمكنك من استعادة جدول ما بعد حذفه وهذا الموضوع شيق للغاية تستطيع الاطلاع علية من موقع أوراكل(oracle documentation) بالاضافة إلى flashback databaseSQL Good Exampleالمثال الأول :طلب منك تقرير حول عدد الجداول (table) وعدد الفهارس (index) وعدد المناظر (view) لكل مستخدم في قاعدة البيانات لديك بحيث يكون بالصيغة التالية : Owner table_count index_count view_count HR 20 11 2 SYStem 10 12 10 أولا من أين سنحصل على هذه البيانات , لدينا في ال data dictionary كل البيانات المتعلقة بكل ال objects ونستطيع الحصول على البيانات من DBA_OBJECTS view Conn sys/password as sysdba Select * from DBA_OBJECTS; سيعطيك الاستعلام كل البيانات عن الأغراض الموجودة في كل المستخدمين مع التفاصيل عن كل غرض لكي نولد التقرير السابق دعونا نجرب الطريقة الأولي : SELECT OWNER,OBJECT_TYPE,COUNT(*) FROM DBA_OBJECTS WHERE OBJECT_TYPE IN ('TABLE','INDEX','VIEW') GROUP BY OWNER,OBJECT_TYPE سنحصل على النتائج التالية : OWNER OBJECT_TYPE COUNT(*) HR VIEW 2 HR INDEX 20 HR TABLE 13 OE VIEW 10 OE INDEX 26 OE TABLE 10 TABLE النتائج التي حصلت عليها صحيحة ولكن ليس كما طلب منك أنت بحاجة لبعض التفكير وتوظيف توابع SQL لحل هذه المعضلة إليك طريقة لحل هذه المعضلة : SELECT OWNER,SUM(DECODE(OBJECT_TYPE,'TABLE',1,0)) COUNT_TABLE, SUM(DECODE(OBJECT_TYPE,'INDEX',1,0)) INDEX_COUNT , SUM(DECODE(OBJECT_TYPE,'VIEW',1,0)) INDEX_COUNT FROM DBA_OBJECTS GROUP BY OWNER; ستحصل على النتائج التالية : OWNER COUNT_TABLE INDEX_COUNT VIEW_COUNT HR 13 20 2 OE 10 26 10 هناك طرق أخرى للحصول على النتيجة السابقة ؟؟ المثال الثاني :إذا أردت أن تعرف حجم كل tablespace (بالميغا بايت) في قاعدة البيانات التي تعمل عليها للحصول على حجم كل tablespace لا بد أن تجمع حجم كل الـ segments الموجود في كل tablespace وتستطيع الحصول على كل الـ segments من DBA_SEGMENTS view Select * from DBA_SEGMENTS; للحصول على ما طلب منك نفذ الاستعلام التالي : SELECT tablespace_name,sum(BYTES/1024/1024) Size_MB FROM dba_segments group by tablespace_name; كما تلاحظ انه تم التقسيم على 1024 مرتين وذلك للحصول على القيمة بالميغا بايت .ملاحظة..بعض المفاهيم من هذا الموضوع منقولة للامانة العلمية...أتمنى الاستفادة للجميع...بالتوفيق تم تعديل 29 مايو 200916 سنة بواسطة PALI.ORACLE تقديم بلاغ
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.