بازیابی جداول از recycle bin و قابلیت Flashback Drop

زمانی که جدولی را با دستور drop حذف می کنیم، جدول مورد نظر، به recycle bin منتقل خواهد شد(البته منظور از انتقال، انتقال فیزیکی نیست و صرفا امری منطقی اتفاق خواهد افتاد) و تا زمانی که tablespaceای که جدول در آن قرار دارد، از فضای خالی فعلی اش استفاده کامل نکند، این جدول هم حذف نخواهد شد و امکان برگشت دارد.

برای برگرداندن جداول موجود در recycle bin ، می توان از قابلیت Flashback Drop استفاده کرد.

مثال: در این مثال خواهیم دید که جدول tbl1 بعد از حذف، به recycle bin منتقل خواهد شد همچنین در ادامه مثال، با کمک قابلیت Flashback Drop این جدول را بازیابی خواهیم کرد.

SQL> create table tbl1 (id number primary key, name varchar(20));

Table created

SQL> insert into tbl1 values(1,’USEF’);

1 row inserted

SQL> commit;

Commit complete

SQL> drop table tbl1;

Table dropped

با اجرای پرس و جوی زیر، خواهیم دید که جدول tbl1، قابل بازیابی می باشد:

select CAN_UNDROP from dba_recyclebin p where p.original_name=’TBL1′;

CAN_UNDROP

YES

برای بازیابی جدول tbl1، از دستور FLASHBACK TABLE … TO BEFORE DROP استفاده می کنیم.

ساختار کلی دستور:

FLASHBACK TABLE <object_name> TO BEFORE DROP {RENAME TO <new_table_name>};

برگرداندن جدول tbl1 از recycle bin:

SQL> flashback table tbl1 to before drop;

Done

ویژگی ها و محدودیت های recycle bin و قابلیت flashback drop

1.با تنظیم پارامتر recyclebin(در سطح session و یا system) به مقدار OFF، امکان استفاده از این قابلیت از بین خواهد رفت:

SQL> show parameter recyclebin

NAME        TYPE       VALUE

———– ——-    ——

recyclebin   string     on

SQL> ALTER SYSTEM SET recyclebin = OFF;

SQL> ALTER SYSTEM SET recyclebin = ON;

مقدار پیش فرض این پارامتر، برابر با on می باشد.

2.برای حذف کامل یک جدول و جلوگیری از انتقال آن به recycle bin، می توان از عبارت purge در دستور drop استفاده کرد:

DROP TABLE tbl1 PURGE;

3.برای مشاهده objectهایی که هنوز در recycle bin قرار دارند، می توان از ویوهای دیتادیکشنری نظیر dba_recyclebin و  user_recyclebin استفاده کرد همچنین نام جدول دیتادیکشنری مربوط به recycle bin برابر با $recyclebin می باشد.

4.نام اصلی objectای که به recycle bin منتقل می شود، در ویوهای دیتا دیکشنری قابل مشاهده می باشد البته علاوه بر نام original شی، نام uniqueای هم به ان تخصیص داده خواهد شد که با عبارت $BIN شروع می شود:

select object_name,original_name,type from dba_recyclebin;

5.با اجرای دستور flashback table .. to before drop برای یک جدول، جدول مورد نظر، با نام اصلی اش بازیابی می شود مگر آنکه جدولی همنام با آن، قبلا ایجاد شده باشد، در این صورت، باید نام جدیدی را برای جدول مورد نظر تعیین کرد:

SQL> flashback table tbl1 to before drop;

ORA-38312: original name is used by an existing object

SQL> flashback table tbl1 to before drop rename to tbl1_old;

Done

این مسئله برای ایندکسها و constraintها صادق نیست و با برگرداندن این نوع از objectها، نام اصلی شان از بین خواهد رفت و پس از بازیابی، اسامی آنها با عبارت $BIN شروع خواهد شد البته بعد از بازیابی ایندکس، امکان تغییر نام ان وجود دارد:

ALTER INDEX “BIN$hkQK/YU8DkPgUxgBqMDJuA==$0” RENAME TO ind_pk;

6.زمانی که چند جدول همنام در recycle bin قرار دارند، اجرای دستور flashback table .. to before drop، سبب بازیابی جدولی که به تازگی drop شده است خواهد شد.

7. اجرای دستور flashback table .. to before drop علاوه بر بازیابی جدول سبب ریکاوری ایندکسها(به جز ایندکس از نوع bitmap) و constraint ها(غیر از referential integrity) و تریگرهای آن جدول هم خواهد شد البته بعضی از objectها نظیر materialized view log قابل بازیابی نیستند.

8.در صورتی که فضای خالی ای در tablespace موجود نباشد، objectای که DROPTIME آن قدیمی تر باشد، purge خواهد شد.

select original_name,DROPTIME from dba_recyclebin;

همچنین در صورتی که خصیصه Auto extend دیتافایلهای این tablespace، برابر on باشد، باز هم اولویت با حذف objectهایی است که در recycle bin قرار دارند.

9.این قابلیت صرفا برای objectهای غیر سیستمی کاربرد دارد:

SQL> flashback table sys.sys_tbl1 to before drop;

ORA-38305: object not in RECYCLE BIN

10.اجرای پرس و جو از جدولی که در recycle bin قرار دارد امکان پذیر است:

select count(*) from “BIN$hkQK/YVADkPgUxgBqMDJuA==$0”;

1

البته امکان اجرای دستور DMLای و DDLای بر روی آن وجود ندارد:

drop table “BIN$hkQK/YVADkPgUxgBqMDJuA==$0”;

ORA-38301: can not perform DDL/DML over objects in Recycle Bin

11.حذف objectهایی که در recycle bin قرار دارند، در سطوح مختلفی قابل انجام است:

حذف جدول از recycle bin:

PURGE TABLE tbl1_old;

PURGE TABLE “BIN$hkTZT4+0FdXgUxgBqMD/qg==$0”;

حذف ایندکس از recycle bin:

PURGE INDEX ind1;

پاکسازی recycle bin در یک tablespace:

PURGE TABLESPACE users;

حذف کامل objectهایی که در recycle bin قرار دارند:

PURGE dba_recyclebin;

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.