الانتقال إلى المحتوى
View in the app

A better way to browse. Learn more.

مجموعة مستخدمي أوراكل العربية

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Flashback Queries .....

Featured Replies

بتاريخ:

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



كيف حالكم أخواني واخواتي بهذا المنتدى الرائع المتميز دائما بطرح المواضيع الشيقة والمميزة والفيدة ؟؟؟

سؤال : اذا قمت بحذف بيانات من 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 database

SQL 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 مرتين وذلك للحصول على القيمة بالميغا بايت .
ملاحظة..بعض المفاهيم من هذا الموضوع منقولة للامانة العلمية...
أتمنى الاستفادة للجميع...
بالتوفيق

تم تعديل بواسطة PALI.ORACLE

بتاريخ:

ممتاز -دايما اطرح مواضيع مثل هيك
يعطيك العافيه

  • بعد 5 أسابيع...
بتاريخ:

thanks

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

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

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

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

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

Account

Navigation

البحث

إعداد إشعارات المتصفح الفورية

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.