Selamlar,
Bu yazıyı yazmama ilham kaynağı olan Kamil kardeşime buradan teşekkür ederim :)
Flashback drop, bir çeşit flashback özelliğidir ve bildiğiniz üzere flashback özelliği 10g versiyonu ile aramıza katıldı. Ne zaman ve nasıl kullanılması gerektiğini anlatmaya çalışacağım. Öncelikle bir takım koşulları yerine getirmemiz gerekiyor. Bu koşullar "RECYCLEBIN" kullanımı ile ilgili olan koşullar.
RECYCLEBIN
Recyclebin parametresi FLASHBACK DROP özelliğinin devrede olup olmadığını kontrol eden parametredir. ON veya OFF değerlerini alabilir. Varsayılan değeri ON olarak kurulum sırasında tanımlanır. Eğer OFF yani kapalı değerini verdiyseniz düşürdüğünüz tabloları çöp kutusunda (recyclebin) bulamazsınız. Hemen bir örnek;
SQL> conn ogan/password
Connected.
SQL> create table deneme_tahtasi
2 as
3 select * from all_objects;
Table created.
SQL> select count(*) from deneme_tahtasi;
COUNT(*)
----------
6201
SQL> drop table deneme_tahtasi;
Table dropped.
SQL> select * from recyclebin;
no rows selected
SQL> show parameter recyclebin;
NAME TYPE VALUE
-------------------------------------------------------------
recyclebin string off
RECYCLEBIN bir çeşit data dictionary tablosudur ve düşürülmüş (drop edilmiş) tabloların bilgisini içerir. Tablolar, indeksler bu çöp kutusunda durdukları sürece hala yer kaplamaya devam ederler taa ki "purge" edilene kadar yani tamamen veritabanından silininceye kadar. Her kullanıcının kendi çöp kutusu bulunmaktadır ve yukarıdaki örnekte ogan kullanıcısının nasıl çöp kutusunu incelediği görülmektedir. Eğer kullanıcıyı düşürürseniz, o kullanıcıya ait olan bütün daha önce düşürülmüş olan objeler de çöp kutusundan silinir ve kullanıcının var olan tabloları veya indeksleri çöp kutusuna gönderilmez.
Oracle veritabanı 11g ve Oracle veritabanı 10g arasındaki fark, 10g'de RECYCLEBIN'i aktive edebilmek için veritabanını yeniden başlatmaya gerek kalmıyordu ancak 11g'de SPFILE'a yazım yapılıyor ve veritabanı yeniden başlatılıyor.
Bir obje veritabanından düşürüldüğü zaman çöp kutusunda sistem tarafından oluşturulan bir özel isimlendirme ile tutulur. Bunun nedeni olası isim çakışmalarını engellemek içindir. İsimlendirme biçimi aşağıdaki gibidir;
BIN$unique_id$version
RECYCLEBIN özelliğini veritabanı genelinde veya o anki bağlantıya özel değiştirebiliyoruz.
SQL> conn / as sysdba
Connected.
SQL> alter session set recyclebin = on;
Session altered.
SQL> show parameter recyclebin;
NAME TYPE VALUE
-------------------------------------------------------
recyclebin string ON
SQL> alter system set recyclebin = on scope=both;
System altered.
SQL> show parameter recyclebin;
NAME TYPE VALUE
----------------------
recyclebin string ON
Çok çok önemli bir nokta, SYS'nin gerçekleştirdiği drop komutları kesindir ve çöp kutusuna gönderilmez! Veritabanını yeniden başlatmadan da recyclebin kullanımı devreye alınmaz(11g).
SQL> create table deneme_tahtasi
2 as
3 select * from dba_users;
Table created.
SQL> select count(*) from deneme_tahtasi;
COUNT(*)
----------
126
SQL> drop table deneme_tahtasi;
Table dropped.
SQL> select * from recyclebin;
no rows selected
--> Şimdi ise Ogan kullanıcısı ile deneyelim;
SQL> create table deneme_tahtasi
2 as
3 select * from all_objects;
Table created.
SQL> select count(*) from deneme_tahtasi;
COUNT(*)
----------
469702
SQL> drop table deneme_tahtasi;
Table dropped.
SQL> select * from recyclebin where ORIGINAL_NAME = 'DENEME_TAHTASI';
OBJECT_NAME ORIGINAL_NAME OPERATION TYPE
----------------------------------------------------------------------------------
TS_NAME CREATETIME DROPTIME DROPSCN
----------------------------------------------------------------------------------
BIN$mHfFVCmFdQngRAAfKW6e2g==$0 DENEME_TAHTASI DROP TABLE
CODESD 2010-12-28:14:39:36 2010-12-28:14:41:26 3.9736E+10
Sistemin tanımladığı obje ismi ile düşürdüğümüz tablonun ilişkisini yukarıda görebilirsiniz. Bu tabloyu eski haline geri alabilmek için yapılması gereken;
SQL> flashback table deneme_tahtasi to before drop;
Flashback complete.
SQL> select count(*) from deneme_tahtasi;
COUNT(*)
----------
469702
--> Veya tamamen yok edebilmek için 2 yol;
SQL> drop table deneme_tahtasi;
Table dropped.
SQL> purge table deneme_tahtasi;
Table purged.
SQL> select * from recyclebin where ORIGINAL_NAME = 'DENEME_TAHTASI';
no rows selected
--> VEYA
SQL> drop table deneme_tahtasi purge;
Table dropped.
SQL> select * from recyclebin where ORIGINAL_NAME = 'DENEME_TAHTASI';
no rows selected
İyi çalışmalar.
Ogan
Hiç yorum yok:
Yorum Gönder