29 Aralık 2010 Çarşamba

Tablo Seviyesinde Yapılan Flashback Operasyonları – 2 (Flashback Drop)


Flashback konusunda sadece flashback drop ve flashback database konularımız kaldı. Bu konuya başlamışken bu bölümdeki tüm konulara burada değinmek istiyorum. En azından birileri merak ederse tüm konulara tek link üzerinden ulaşabilme şansı olmuş olur. Falshback drop konusu ile ilgili olarak da Ogan kardeşim de kendi sayfasında yer verdi. İlham kaynağı olarak da beni referans göstermiş, bu konuda birilerine referans olabildiysem ne mutlu bana :)  bu vesileyle burdan oganada teşekkür etmek isterim, çünkü blog oluşturma fikrinin oluşmasında oda bana ilham kaynağı olmuştu :)


Aynı konuyu farklı bir yorumla Ogan’ da ele almış, bence çokda güzel olmuş oraya da göz atmanızı öneririm ;
http://oganozdogan.blogspot.com/2010/12/flashback-table-drop-recyclebin.html

Flashback Drop ; 

Flashback drop, drop table işlemini geri alan komuttur. Flashback drop işlemi aklınıza gelebilecek tüm recovery işlemlerinden çok daha hızlıdır ve kesinti gerektirmez data kaybına yol açmaz. 

Tablo drop ettiğiniz zaman, database hemen drop edilen tablonun size' ı kadar alanı dize geri kazandırmaz. Bunun yerine tablo üzerinde düzenleme yaparak tabloyu içerdiği tüm bileşenleri birlikte (index, constraint vs.) çöp kutusuna taşır. Recyclebine taşınan obkjeclere ait isimler system tarafından unigue olarak generate edilirler. Flashback operasyonu da tabloyu recyclebinden kurtarma çıkartma operasyonudur. Drop edilen tabloyu geri alırken orjinal ismiyle veya belirleyeceğiniz başka bir isimle veya recyclebindeki ismiyle alabilirsiniz. 

Sysdba yetkili bir kullanıcı ile çalışıyorsanız unutmamamız gereken şey, bu yetkiye sahip kullanıcının drop ettiği nesneler recyclebin koruması altında değildir. 

Flasback Drop için Ön Gereksinimler; 

Aşağıdaki liste Flashback Drop ve recyclebin ile ilgili işlemleri için gerekli olan kullanıcı ayrıcalıklarını özetler ; 

* Drop; 
Drop yetkisine sahip herhangi bir kullanıcı bir nesneyi recyclebin' e gönderebilir. Bunun drop etmesi yeterli olacaktır. 

* FLASHBACK TABLE ... TO BEFORE DROP
Bu sorgunun hakları Drop yetkilerine bağlıdır. Bu, object drop edebilen herhangi bir user, flashback drop ile bu object'i recyclebin den geri alabilir. 

* Purge 
Recyclebin den objecti purge etme yetkiside Drop yetkisine bağlıdır. Drop Table veya Drop any table yetkisine sahip herhangi bir kullanıcı recyclebindeki objecti purge edebilir. 

* SELECT for objects in the Recycle Bin
Recyclebin içerisindeki tabloyu select etmek ve Flashback ile tabloyu geri döndürmek için kullanıcıların Select ve Flashback haklarına sahip olmaları gerekmektedir 

Her drop edilen object recyclebin' e gitmez, dolayısıyla bir nesnenin recyclebin den geri alınabililmesi için aşağıdaki kriterleri sağlaması gerekmektedir ;

1 - Recyclebin sadece system objeleri dışındaki, local managed tablepsace' lerindeki objecler için geçerlidir. Eğer table system objesi değilse, locak managed tablespace' indeyse fakat ilgili tabloya ait bir veya daha fazla object dictionary managed tablespace' e ise bu objeler recyclebin de korunur. 

2 - Üzerinde Fine-Grained Auditing (FGA) ve Virtual Private Database (VPD) kuralları tanımlanmış olan tablolar, recyclebin koruması altında değillerdir. 

3 - Partition yapılmış index-organize tablolar recyclebin koruması altında değildir. 

4 - User veya oracle database' i tarafından alanı yeniden kullanabilmek için tablo purged edilmemiş olmalıdır. 

Buraya kadarki olan kısımı örneklendirecek olursak ; 

10g den farklı olarak 11g de recyclebin parametresi initial parametresine bağlanmıştır. Parametrenin şu anki değerini görmek için ; 

SQL> show parameter recyclebin ;
NAME               TYPE               VALUE
-------------       -----------        --------
recyclebin           string                 ON

Bu değer ON olması recyclebin özelliğinin açık olduğu anlamına gelir, bu değer OFF olarak dönerse recyclebin kapalı demektir ve açılması gerekecektir. Onun içinde ; 

Alter system set recyclebin = ON scope = SPFILE ; 

Dememiz, sonrasında bu parametre statik bir parametre olduğundan dolayı database’ in stop – start edilmesi gerekecektir. Bizim örneğimizde açık olduğundan dolayı devam edebiliriz. 

Recyclebin içerisindeki objeleri select etmek için ; 

SELECT object_name AS recycle_name, original_name, type  FROM recyclebin; 

Sorgusundan faydalanabiliriz. 

RECYCLE_NAME                                         ORIGINAL_NAME       TYPE
BIN$YM3moW14Rqub/ZjqACiKNw==$0    FLASHBACK_TEST     TABLE
BIN$3wr5BbnwQYK+AKilebLkBg==$0       FLASHBACK_TEST     TABLE
BIN$NpK/KUt/Sk2pOZk6VrpurA==$0        FLASHBACK_TEST      TABLE

Recyclebin içerisinde yer alan bir tablonun datalarını select etmek için; 

SELECT count(*) FROM "BIN$YM3moW14Rqub/ZjqACiKNw==$0"
COUNT(*)
--------
1522
1 row selected.

Recyclebindeki tabloyu geri almak için ; 

FLASHBACK TABLE "BIN$YM3moW14Rqub/ZjqACiKNw==$0" TO BEFORE DROP;
"bin$ym3mow14rqub/zjqaciknw==$0" successfully completed.

Aynı işlemi tablonun orijinal ismi ile de gerçekleştirebiliriz. 

FLASHBACK TABLE FLASHBACK_TEST TO BEFORE DROP;
Flashback_test successfully completed.

Flashback drop komutu ile aşağıdaki gibi bir hata alırsanız bunun nedeni geri almaya çalıştığınız tablonun orjinal ismi başka bir tablo olduğundan dolayıdır, dolayısıyla tabloyu geri alırken farklı bir isimle geri almaya çalışmalıyız ; 

FLASHBACK TABLE "BIN$NpK/KUt/Sk2pOZk6VrpurA==$0" TO BEFORE DROP
Error at line 1
ORA-38312: esas ad, mevcut bir nesne tarafindan kullaniliyor

FLASHBACK TABLE "BIN$NpK/KUt/Sk2pOZk6VrpurA==$0" TO BEFORE DROP RENAME TO FLASHBACK_TEST_2 ; 
"bin$npk/kut/sk2pozk6vrpura==$0" successfully completed.

select count(*) from FLASHBACK_TEST_2
COUNT(*)
----------
1522
1 row selected.

Son durumda tablomuzu sorunsuz olarak FLASHBACK_TEST_2 ismiyle geri almış olduk. 

Burada bir ufak bir yarıntı daha, drop etmiş olduğunuz tablo üzerinde index var ise doğal olarak index de drop olmuş oluyor. Bu durumda recyclebin’ i select ettiğimizde indexide burada görüyor olmamız gerekiyor. 

select owner, object_name, original_name, type from dba_recyclebin 

OWNER    OBJECT_NAME                                          ORIGINAL_NAME      TYPE
KAMIL      BIN$NoffUfJZS7OfErV1yYUBzg==$0        IDX_DENEME              INDEX
KAMIL      BIN$xlo4tuPpRVmYb+jJ+2o70A==$0        FLASHBACK_TEST     TABLE

Bu tabloyu geri aldığınızda index’ in ismi recyclebindeki ismi ile kalıyor, bunu bilmekde fayda var. 

FLASHBACK TABLE "BIN$xlo4tuPpRVmYb+jJ+2o70A==$0" TO BEFORE DROP;
"bin$xlo4tupprvmyb+jj+2o70a==$0" successfully completed.

select owner, index_name, table_owner from dba_indexes where owner = 'KAMIL'
and table_name = 'FLASHBACK_TEST'; 

OWNER    INDEX_NAME                                       TABLE_OWNER
KAMIL     BIN$NoffUfJZS7OfErV1yYUBzg==$0    KAMIL

Çok hoş bir isim olmadığından dolayı sonradan bunu değiştirmek isterseniz ;

ALTER INDEX " BIN$NoffUfJZS7OfErV1yYUBzg==$0" RENAME TO idx_flashback_index_1 ; 
index altered.

Flashback Drop konusu özetle bu kadar aslında, son olarak flashback’ le ilgili bikaç işe yarar script verebilirim, konuyu tamamlayacı nitelikde olduğundan yardımcı olabilir diye  düşünüyorum;

-- tablespace’si flashback dışında bırakma / alma
 
Alter tablespace ts_name Flashback ON
Alter tablespace ts_name Flashback OFF

--flashback recovery areade neyin ne kadar yer tut. bilgisi
select file_type, 
percent_space_used as used,
percent_space_reclaimable as reclaimable,
number_of_files as numbers
from v$flash_recovery_area_usage

--flashback recovery areanın backuplanması 
Rman> backup recovery files

--Database de flashback modun açık olup olmadığı 
select dbid,name,log_mode, flashback_on,
open_mode,db_unique_name 
from v$database

--flashback areanın doluluk oranı 
select name, 
to_char(space_limit,'999,999,999,999') as space_limit,
to_char(space_limit - space_used + 
space_reclaimable,'999,999,999,999') as space_available,
round((space_used - space_reclaimable)/space_limit * 100,1) as pct_full, number_of_files
from v$recovery_file_dest

Bir sonraki yazıma bu konunun son kısmı olan Flashback Drop ile devam etmeyi planlıyorum. Görüşmek üzere …


Kamil TÜRKYILMAZ

Hiç yorum yok: