עד גרסת 10g, מחיקת טבלה באמצעות פקודת ה DROP היתה מסירה אותה לצמיתות מה Database, היה צורך ב Backups  (וליתר דיוק – Point In Time Recovery) כדי לשחזר אותה.
החל מגרסת
10g, באופן דיפולטיבי טבלה לא באמת נמחקת, אלא עוברת למיקום אחר, ה Recycle Bin.
סל המחזור של ה
Database
הוא למעשה יחידה לוגית המאגדת בתוכה את כל הטבלאות אשר נמחקו והאובייקטים התלויים בהן (כגון אינדקסים, טריגרים, אילוצים וכד').
טכנולוגיה זו מאפשרת גישה נוחה לאותם אובייקטים אשר נמחקו ומציעה יכולת שחזור מהירה, פשוטה ויעילה.

Using Flashback Drop

נייצר טבלה ונמחק אותה


HR > CREATE TABLE del_test AS SELECT * FROM hr.employees ;

Table created.

HR >
HR > CREATE INDEX del_test_ix ON del_test(employee_id) ;

Index created.

HR > SELECT COUNT(*) FROM del_test ;

  COUNT(*)
----------
       107

HR >
HR > DROP TABLE del_test ;

Table dropped.

HR >
HR > SELECT COUNT(*) FROM del_test ;
SELECT COUNT(*) FROM del_test
                     *
ERROR at line 1:
ORA-00942: table or view does not exist

באמצעות פקודת ה SHOW RECYCLEBIN ותשאול טבלת המערכת USER_RECYCLEBIN ניתן לראות את האובייקטים שנמחקו, שימו לב כי עדיין ניתן לתשאל את הטבלה שנמחקה באמצעות שמה ב Recyclebin

HR > SHOW RECYCLEBIN

ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
DEL_TEST         BIN$Z2MW31kbRteIB6wocLYiDg==$0 TABLE        2012-12-20:12:35:13

HR >

HR > SELECT object_name , original_name , type
  2  FROM user_recyclebin ;

OBJECT_NAME                    ORIGINAL_NAME                    TYPE
------------------------------ -------------------------------- -------------------------
BIN$jVpbUzRhQ2ep4auBjg1fog==$1 BIN$K6hjIvLZSimzw3HlPuNXsw==$0   INDEX
BIN$Z2MW31kbRteIB6wocLYiDg==$0 DEL_TEST                         TABLE

HR >
HR > SELECT COUNT(*) FROM "BIN$Z2MW31kbRteIB6wocLYiDg==$0";

  COUNT(*)
----------
       107

HR > SELECT employee_id , last_name , salary
  2  FROM "BIN$Z2MW31kbRteIB6wocLYiDg==$0"
  3  WHERE rownum <= 5 ;

EMPLOYEE_ID LAST_NAME                     SALARY
----------- ------------------------- ----------
        198 OConnell                        2600
        199 Grant                           2600
        200 Whalen                          4400
        201 Hartstein                      13000
        202 Fay                             6000

כעת באמצעות פקודת ה FLASHBACK TABLE .. TO BEFORE DROP ניתן לשחזר את הטבלה והאובייקטים התלויים בה

HR > FLASHBACK TABLE "BIN$Z2MW31kbRteIB6wocLYiDg==$0" TO BEFORE DROP
  2  ;

Flashback complete.

HR >
HR > SELECT COUNT(*) FROM del_test ;

  COUNT(*)
----------
       107

HR > SELECT object_name , original_name , type
  2  FROM user_recyclebin ;

no rows selected

HR >

מחיקת טבלה לצמיתות – פקודת ה Purge

באמצעות פקודת ה Purgeניתן למחוק טבלה באופן בו היא לא תעבור לסל המחזור כאשר תמחק.

HR > CREATE TABLE del_test AS SELECT * FROM employees ;

Table created.

HR > DROP TABLE del_test PURGE ;

Table dropped.

HR > SHOW RECYCLEBIN
HR >
HR > SELECT object_name , original_name , type
  2  FROM user_recyclebin ;

no rows selected

 

כמו כן ניתן להשתמש בפקודת ה Purge כדי לנקות את תכולת סל המחזור ברמות שונות :

PURGE TABLE del_test;
PURGE INDEX del_test_idx;
PURGE TABLESPACE users ;
PURGE TABLESPACE users USER hr;
PURGE USER_RECYCLEBIN;
PURGE DBA_RECYCLEBIN;
PURGE RECYCLEBIN;

קיבולת ה Recycle Bin

ניתן לאמר כי לכל Tablespace יש את ה Recycle Bin שלו אשר שומר את האובייקטים שנמחקו.
ל
Recycle Bin אין שטח מוגדר מראש, אלא קיבולת ה Recycle Bin נקבעת בכל Tablespace לפי מושג הנקרא Space Pressure.

ה Space Pressure קובע כי אובייקטים ישמרו ב Recycle Bin עד הנקודה בה ה Tablespace יאלץ לגדול כדי להחזיק את כמות האובייקטים ב Recycle Bin – בנקודה זו האובייקטים ימחקו (Purge) מסל המחזור על בסיס First In – First Out

כמו כן, האובייקטים של היוזר ישמרו ב Recycle Bin עד הנקודה בה ה Quota שלו תנוצל לחלוטין ואז שוב – האובייקטים ימחקו מסל המחזור על בסיס First In – First Out.
יכול להיות מצב בו קיים עוד שטח פנוי ב
Tablespace אך היוזר הגיע ל Quota
המקסימלית שלו ולכן האובייקים בסל המחזר ימחקו.

נייצר Tablespace בגודל 20 מגה, ונגדיר שני יוזרים היכולים ליצור עליו אובייקטים
יוזר
Test1 עם Quota של 10 מגה
יוזר
Test2 עם
Unlimited Quota

 

SYS > CREATE TABLESPACE recyclebin_test
  2  DATAFILE 'C:recyclebin_test.dbf' SIZE 20M
  3  AUTOEXTEND ON NEXT 5M ;

Tablespace created.

SYS >
SYS > CREATE USER test1 IDENTIFIED BY test1
  2  QUOTA 10M ON recyclebin_test ;

User created.

SYS >
SYS > CREATE USER test2 IDENTIFIED BY test2
  2  QUOTA UNLIMITED ON recyclebin_test ;

User created.

SYS >
SYS > GRANT create session, create table TO test1, test2 ;

Grant succeeded.

SYS >

נתחבר פעם ראשונה עם יוזר Test1 וננסה למלא את סל המחזור באובייקטים הגדולים מ 10 מגה – ניתן לראות כי ברגע שקיבולת ה Recycle Bin עבור אותו יוזר עוברת את ה 10 מגה (ה Quota המקסימלית שלו) אובייקטים מתחילים לצאת החוצה


SYS > CONN test1/test1
Connected.
TEST1 >
TEST1 > CREATE TABLE TAB_A (a VARCHAR2(3000))
  2  TABLESPACE recyclebin_test ;

Table created.

TEST1 >
TEST1 > BEGIN
  2  FOR i IN 1..1250 LOOP
  3              INSERT INTO TAB_A VALUES (LPAD('*',3000,'*'));
  4  END LOOP;
  5  END;
  6  /

PL/SQL procedure successfully completed.

TEST1 >
TEST1 > SELECT segment_name , bytes/1024/1024
  2  FROM user_segments
  3  WHERE segment_name = 'TAB_A' ;

SEGMENT_NAME                   BYTES/1024/1024
------------------------------ ---------------
TAB_A                                        6

TEST1 >
TEST1 > DROP TABLE tab_a ;

Table dropped.

TEST1 >
TEST1 > SHOW RECYCLEBIN
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TAB_A            BIN$Q/2x5ShTRLGJ2AJzW56CAQ==$0 TABLE        2012-12-20:12:47:14
TEST1 >
TEST1 > CREATE TABLE TAB_B (a VARCHAR2(3000))
  2  TABLESPACE recyclebin_test ;

Table created.

TEST1 >
TEST1 > BEGIN
  2  FOR i IN 1..1250 LOOP
  3              INSERT INTO TAB_B VALUES (LPAD('*',3000,'*'));
  4  END LOOP;
  5  END;
  6  /

PL/SQL procedure successfully completed.

TEST1 >
TEST1 > DROP TABLE tab_b ;

Table dropped.

TEST1 >
TEST1 > SHOW RECYCLEBIN
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TAB_B            BIN$gWcP4xG5R6GoOc4pS3FTbQ==$0 TABLE        2012-12-20:12:47:18
TEST1 >

נתחבר פעם נוספת עם יוזר Test2 וננסה למלא את סל המחזר באובייקטים הגדולים מ 20 מגה – ניתן לראות כי ברגע שקיבולת ה Recycle Bin עבור אותו Tablespace עוברת את ה 20 מגה (הנקודה בה ה Tablespace צריך לגדול כדי לשמור את תכולת סל המחזור) אובייקטים מתחילים לצאת החוצה.


TEST1 > -----------------------------------------------
TEST1 > CONN test2/test2
Connected.
TEST2 >
TEST2 > CREATE TABLE TAB_A (a VARCHAR2(3000))
  2  TABLESPACE recyclebin_test ;

Table created.

TEST2 >
TEST2 > BEGIN
  2  FOR i IN 1..1250 LOOP
  3              INSERT INTO TAB_A VALUES (LPAD('*',3000,'*'));
  4  END LOOP;
  5  END;
  6  /

PL/SQL procedure successfully completed.

TEST2 >
TEST2 > DROP TABLE tab_a ;

Table dropped.

TEST2 >
TEST2 > SHOW RECYCLEBIN
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TAB_A            BIN$SJO8S1QhQxOrgU76p5mS4g==$0 TABLE        2012-12-20:12:48:13
TEST2 >
TEST2 > CREATE TABLE TAB_B (a VARCHAR2(3000))
  2  TABLESPACE recyclebin_test ;

Table created.

TEST2 >
TEST2 > BEGIN
  2  FOR i IN 1..1250 LOOP
  3              INSERT INTO TAB_B VALUES (LPAD('*',3000,'*'));
  4  END LOOP;
  5  END;
  6  /

PL/SQL procedure successfully completed.

TEST2 >
TEST2 > DROP TABLE tab_b ;

Table dropped.

TEST2 >
TEST2 > SHOW RECYCLEBIN
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TAB_A            BIN$SJO8S1QhQxOrgU76p5mS4g==$0 TABLE        2012-12-20:12:48:13
TAB_B            BIN$OJBaKmdHRFmVFMdiFR8j7A==$0 TABLE        2012-12-20:12:48:15
TEST2 >
TEST2 > CREATE TABLE TAB_C (a VARCHAR2(3000))
  2  TABLESPACE recyclebin_test ;

Table created.

TEST2 >
TEST2 > BEGIN
  2  FOR i IN 1..1250 LOOP
  3              INSERT INTO TAB_C VALUES (LPAD('*',3000,'*'));
  4  END LOOP;
  5  END;
  6  /

PL/SQL procedure successfully completed.

TEST2 >
TEST2 > DROP TABLE tab_c ;

Table dropped.

TEST2 >
TEST2 > SHOW RECYCLEBIN
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TAB_A            BIN$SJO8S1QhQxOrgU76p5mS4g==$0 TABLE        2012-12-20:12:48:13
TAB_B            BIN$OJBaKmdHRFmVFMdiFR8j7A==$0 TABLE        2012-12-20:12:48:15
TAB_C            BIN$o8mZol7ZSwCHlKqFu7mh+Q==$0 TABLE        2012-12-20:12:48:17
TEST2 >
TEST2 >
TEST2 > CREATE TABLE TAB_D (a VARCHAR2(3000))
  2  TABLESPACE recyclebin_test ;

Table created.

TEST2 >
TEST2 > BEGIN
  2  FOR i IN 1..1250 LOOP
  3              INSERT INTO TAB_D VALUES (LPAD('*',3000,'*'));
  4  END LOOP;
  5  END;
  6  /

PL/SQL procedure successfully completed.

TEST2 >
TEST2 > DROP TABLE tab_d ;

Table dropped.

TEST2 >
TEST2 > SHOW RECYCLEBIN
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TAB_B            BIN$OJBaKmdHRFmVFMdiFR8j7A==$0 TABLE        2012-12-20:12:48:15
TAB_C            BIN$o8mZol7ZSwCHlKqFu7mh+Q==$0 TABLE        2012-12-20:12:48:17
TAB_D            BIN$p1o6/IUKQtmSyM4AFv8zXw==$0 TABLE        2012-12-20:12:48:19
TEST2 >

נכתב ע"י רם קדם