28 Aralık 2010 Salı

FLASHBACK TABLE ... DROP - Recyclebin

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 
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:

Takip et: @oganozdogan