עד גרסת 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 >
נכתב ע"י רם קדם