Hurriyet

20 Haziran 2012 Çarşamba

Oracle Tablespace ve Yapisi


Tablespace Nedir?

      Bu yazimda Tablespace’in ne oldugunu, yapisini ve nasil olusturabilecegimizi ifade etmeye calisacagim. Tablespace; sadece bir veritabanina ait olup icerisinde objeler bulunduran mantiksal depolama yapisidir. Bir baska deyisle Oracle Veritabani uzerinde datalarin yani verilerin saklandigi yer fiziksel olarak Datafile mantiksal olarak ise Tablespace olarak ifade edilmektedir. Tablespace’ler sifir ya da sifirdan fazla segment’e sahip olabilirler.
      Bir uygulamaya ait tablo ve indeksleri bir Tablespace icerisinde tutabilir ve verinin yonetimini kolaylastirabiliriz. Butun bir veritabaninin yedeginden donmek yerine bir Tablespace’i kurtarabilir, offline yapabiliriz. Bir Tablespace’i read only yapabilir ve statik verinin surekli yedeklenmesini onleyebilir veya bir tablespace’i baska bir veritabanina tasiyabiliriz.
      Bir 11g veritabaninda olmazsa olmaz iki tane tablespace vardir. Bunlar system ve sysaux’tur. System Tablespace icerisinde data dictionary tutulmaktadir ve bir kullanici objesinin yaratilmasi icin kullanilmamalidir. Sysaux Tablespace’i ise System Tablespace'ine yardimci olmasi icin 10G ile gelen bir ozelliktir. Workspace manager, logical standby, Oracle streams ve Automatic workload repostory gibi datalari tutar. Bir veritabani yaratildigi zaman bu iki tablespace mutlaka yaratilir. Veritabani olusturulurken eger herhangi baska bir tablespace yaratilmadiysa system tablespace’i temporary (gecici) tablespace gibi davranacaktir. Genelde tavsiye edilen durum System ve Sysaux disinda varsayilan bir temporary tablespace yaratmak ve bir de undo tablespace’e sahip olmaktir. Cunku undo Tablespace’in yoklugunda System Tablespace’i undo tablespace gibi davranmaktadir ve kesinlikle bu durum tavsiye edilmemektedir. Cunku system tablespace’inin rollback segment’leri yerine, undo tablespace’inin undo segment’lerinin, veri tutarliligi acisindan kullanilmasi daha sagliklidir.


 Tablespace Yapisi

      Oracle’da depolama yonetimi fiziksel ve mantiksal olarak asagidaki sekildeki gibi katmanli bir yapidadir. 
      Tablespace’ler sadece bir veritabanina ait olan, bir ya da daha fazla datafile’dan olusan ve icerisinde oracle objeleri bulunduran mantiksal bir storage yapisidir demistik. Sekillerde gordugumuz uzere ve daha onceden yapmis oldugumuz tanimlarin uzerine Tablespace’lerin yapisi ile ilgili uzerinde durmamiz gereken diger iki baslik ise; Tablespace’lerin extent alani yonetimi ve Segment alani yonetimi bakimindan ikiye ayriliyor olmasidir:
Extent alani yonetimi bakimindan;
Locally Managed Tablespace:
• Bos extent’ler tablespace icinde yonetilir,
• Bos extent’lerin kayitlarini tutmak icin bir bitmap kullanilir,
• Her bit, bir block’a ya da blok grubuna isaret eder,
• Bit degerleri bos ya da dolu extent’leri belirtir,
• Tavsiye edilen tablespace tipidir.
Dictionary Managed Tablespace:
• Bos extent’ler Data Dictionary tarafindan yonetilir,
• Extend’ler allocate ya da unallocate edildiginde ilgili tablolar update edilir,
• Eski surumlere uyum amaciyla desteklenmektedir.

Segment alani yonetimi bakimindan;
      Butun lokal extent yonetimine sahip olan tablespace’ler icin iki farkli segment alan yonetimi secebilmekteyiz; otomatik veya manuel.
Manuel yonetim: Manuel segment alani yonetiminde bir serbest bloklar listesi tutulmaktadir ve bu listenin amaci hangi bloklarin insert islemi icin hazir oldugunu gostermektir. Bunu yaparken bir blok uzerinde kullandigi bilgilere ise PCTUSED ve PCTFREE parametreleri sahiptir. Herhangi bir “insert” veya “update” operasyonundan sonra veritabani kalan alani ilgili bloktaki PCTFREE parametresini kontrol ederek algilar. Eger kalan veri blogu alani PCTFREE parametresinin altinda ise bu blok yukarida bahsettigim listeden cikartilir ve bir insert operasyonu icin yeniden gosterilmez. Bu noktada ilgili blok uzerinde kalan PCTFREE parametresi kadar alan ileriki “update” operasyonlari icin saklanir. Herhangi bir “update” veya “delete” operasyonundan sonra veritabani kullanilan alani ilgili bloktaki PCTUSED parametresini kontrol ederek algilar. Eger kullanilan veri blogu alani PCTUSED parametresinin altinda ise bu blok yukarida bahsettigim listeye alinir ve sonraki insert operasyonu icin hazir bekletilir. 
      Kisacasi dongu bu sekilde ilerlemektedir ve PCTUSED ile PCTFREE parametrelerini degistirilebilmektedir fakat Oracle siddetle segment alan yonetimini otomatik ve extent yonetimini de lokal secmemizi tavsiye etmektedir. Bu sekilde en optimum duzeyde ve bir veritabani yoneticisinin gundelik hayatini kolaylastiracak seviyede yonetim saglanabilmektedir.
SQL> CREATE TABLESPACE kaya_tbs DATAFİLE '/db/kaya/mydf_01.dbf' SİZE 200M
EXTENT MANAGEMENT LOCAL AUTOALLOCATE SEGMENT SPACE MANAGEMENT MANUAL;
SQL>Tablespace created
 
 Automatic yonetim: Segment alan yonetiminin bir tablespace icin otomatik ayarlandigi durumda ise su meshur serbest bloklar listesi kullanilmayacak, PCTUSED ve PCTFREE parametreleri bu defa gozardi edilecektir ve onlarin yerine bitmap’ler kullanilacaktir. Bitmap’ler her bir blok icindeki boslugu hesaplayarak yeni bir kayit icin yeterli alan olup olmadigini tarif edeceklerdir. Otomatik segment alan yonetimi yalnizca lokal extent yonetimine sahip olan tablespace’ler tarafindan kullanilabilmektedir ve bir temporary veya system tablespace’i icin bu tanimlama yapilamaz. Segment alan yonetimini otomatik olarak tanimlamak icin;
SQL> CREATE TABLESPACE kaya_tbs DATAFİLE '/db/kaya/mydf_01.dbf' SİZE 200M
EXTENT MANAGEMENT LOCAL AUTOALLOCATE SEGMENT SPACE MANAGEMENT AUTO;
SQL>Tablespace created
      - Bir Tablespace’in boyutlandirmasi ile ilgili unutmamamiz gereken onemli bir nokta; Tablespace’in boyutunun olmamasidir yani tablespace’ler genisletilemez. Tablespace’lerin icerisindeki veri dosyalarinin boyutu(lari) vardir ve bunlarin boyutlarinin arttirilmasi ile tablespace buyur.
Tablespace Olusturmak
      Tablespace yapisini kullanmak, veritabaninin kontrol edilebilirligi ve bakim islemleri acisindan database adminlerinin islerini cok kolaylastirmaktadir. Ornegin her departman icin ayri tablespace (muhasebe_tbs,satis_tbs, hareket_tbs vb.) ve kullanici olusturarak veriler arasi ayrim saglanabilir. Veri guncelleme departmandan departmana farklilik gozeteceginden yedekleme bakim gibi islerin zamanlari farkli tarihlere ayarlanabilir dolayisiyla birinde olusabilecek bir hatadan oturu digerleri etkilemeyecek ve calismalari aksamayacaktir. Ayni sekilde kullanicilara hak verirken daha esnek ve daha kolay bir sekilde islemler gerceklestirilecektir. O zaman simdi nasil olusturabiliriz bu yapiyi onu inceleyelim; oncelikli olarak bir tablespace’i yaratirken almamiz gereken bazi kararlar bulunmaktadir. Bunlar:
    1) Tablespace’in bigfile tablespace mi yoksa smallfile tablespace mi olacagina karar vermek,
    2) Extent’lerin local olarak mi yoksa dictionary tarafindan mi yonetilecegi,
    3) Segment bosluklarinin otomatik mi yoksa elle mi kontrol edilecegidir.
   
     Bu kararlari verebilmek icin oncelikle yukarida gecen terimler hakkinda bilgimizin olmasi gerekmektedir. Simdi bunlari mumkun oldugu kadar kisa bir sekilde ele alalim ve inceleyelim:

Bigfile ve Smallfile nedir? Bir bigfile tablespace yalniz bir datafile veya tempfile dosyasindan olusabilmektedir. 10g ile gelen bir tablespace cesitidir ve boyut olarak 2 uzeri 32 veri blogundan olusabilir. 32KB blok boyutu kullanmakta olan bir bigfile tablespace 128 TB’a kadar datafile olusturabilir ayni sekilde 8KB blok boyutu kullanmakta olan bir bigfile tablespace 32 TB’a kadar datafile olusturabilir. Orneklerden de anlasilacagi uzere bu tipte tablespace’ler cok buyuk veritabanlari icin tasarlanmistir. Bir bigfile tablespace yaratmak icin yapilmasi gereken tek sey “BİGFİLE” ozel kelimesini eklemektir;
                SQL> CREATE BİGFİLE TABLESPACE deneme_tbs
       Smallfile tablespace olarak adlandirdigimiz tipte ise bir tablespace’e ait birden cok veri dosyasi olabilmektedir. Ornegin 8KB blok boyutu kullanmakta olan bir tablespace’e ait veri dosyalarinin azami boyutu 32GB olabilmektedir. Bir smallfile tablespace yaratabilmek icin BİGFİLE ozel kelimesi gozardi edilebilir veya isteye bagli olarak SMALLFİLE ekleyebilirsiniz;
               SQL> CREATE [SMALLFİLE] TABLESPACE deneme_tbs

Extent Yonetimini Secmek: Oracle veritabani bir tablespace icerisindeki bir obje icin yer tahsisi etmek istedigi zaman, bir yigin halinde duran veritabani bloklarindan olusan extent’lerden tahsis etmektedir. Oracle bu extent bilgilerini; serbest olan extent’ler, extent boyutlari, tahsis edilen toplam extent miktari gibi bilgileri, ya data dictionary’de ya da tablespace’in kendisi tarafindan yonetmektedir ve bakimini yapmaktadir.
      Bir tablespace’e ait extent bilgilerini dictionary’de tutmakla olusan tablespace’e “dictionary managed tablespace” denmektedir. Extent’ler uzerinde yapilacak herhangi bir degisiklikte (tahsis veya birakma – allocation or freed) ilgili data dictionary tablolari guncellenerek bu guncelleme icin undo uretilmektedir.
      “Local extent” yonetimi ile veri dosyalarinin basliklari icerisinde bulunan bir guncelleme (bitmap pattern) ile bu islem yapilmaktadir. Bu durumda Oracle, UET$ ve FET$ tablolari uzerinde dolanmak ve gereksiz recursive SQL’ler olusturmak yerine bu basliktaki bitmap bilgilerini guncelleyecektir. Ornekle devam edecek olursak;
 SQL> CREATE TABLESPACE kaya_tbs DATAFİLE '/db/kaya/mydf_01.dbf' SİZE 20G EXTENT MANAGEMENT DİCTİONARY;
 SQL> Tablespace created
      Local extent yonetimine sahip bir tablespace’e ait olan veri dosyalarinin extent’lerinde yapilacak bir guncellemede, bu veri dosyalarinin basliklari icerisinde bulunan bitmap bilgileri guncellenecek ve bloklarin yeni durumlari gosterilecektir. Bu guncelleme ile rollback’in bir ilgisi yoktur cunku herhangi bir data dictionary tablosu guncellenmemektedir. Lokal olarak extent’leri yonetilen bir tablespace’in extent tahsisinin yapilmasinda iki adet secenegimiz bulunmaktadir; UNİFORM veya AUTOALLOCATE. Uniform opsiyonunu secerek Oracle’a tahsis edecegi veya serbest birakacagi extent boyutlarinin ayni oldugu ve varsayilan olarak 1 MB olacagini ifade etmekteyiz. Uniform secenegi bir gecici tablespace icin varsayilandir ve bir undo tablespace’i icin secilemez. Ornegin; 20MB’a sahip bir uniform tablespace yaratabilmek icin asagidaki komutu calistirmamiz yeterlidir:
SQL> CREATE TABLESPACE kaya_tbs DATAFİLE '/db/kaya/mydf_01.dbf' SİZE 200M
EXTENT MANAGEMENT LOCAL UNİFORM SİZE 20M;
SQL> Tablespace created.
      
      Autoallocate secenegi ile tahsis edilecek veya serbest birakilacak extent’lerin boyutlarinin degisebilecegini ve segment’ler icerisinde bu sekilde yer alacagini ifade etmekteyiz. Burada uniform’dan farkli yani uniform’da belirli bir olcude (varsayilan olarak 1 MB) hareket etmesini soylemekteydik. Autoallocate secenegi bu ozelligi sayesinde kucuk veya buyuk tablolarin en iyi secenegi olmaktadir. Autoallocate secenegi ile bir tablespace yaratmak icinse;
SQL> CREATE TABLESPACE kaya_tbs DATAFİLE '/db/kaya/mydf_01.dbf' SİZE 20G
EXTENT MANAGEMENT LOCAL AUTOALLOCATE;
SQL> Tablespace created
      
       Son olarak 3. soruya cevap bulabilmek adina, manuel segment space management de boş alanları yönetmek için freelist kullanilir; otomatik segment space management da bitmap kullanılır. Otomatik segment space management daha verimlidir cunku boş alanları birleştirmeye (colascing) ihtiyaç yoktur ve default ayardır.
      Bu 3 konu uzerindeki kararlarinizi verdikten sonar artik tablepspace olusturabiliriz. İki komut ile tablespace yaratabiliriz. CREATE DATABASE veya CREATE TABLESPACE. Asagida ornek bir tablespace yaratma komutu verilmistir:



SQL> CREATE TABLESPACE "ORNEK" DATAFİLE 'C:\ORACLE\PRODUCT\10.2.0
\ORADATA\ORCL\ornek.dbf' SİZE 100M LOGGİNG EXTENT MANAGEMENT LOCAL 
SEGMENT SPACE MANAGEMENT AUTO;
SQL> Tablespace created

Tablespace information: Tablespace’lerle ilgili bilgilere nereden ve nasil ulasabiliriz?
Bir Oracle 11g veritabanina ait tablespace bilgilerine ulasabileceginiz goruntuler;
1) DBA_TABLESPACES
2) DBA_DATA_FİLES
3) DBA_TEMP_FİLES
4) V$TABLESPACE
Ornek sorgular ile alacagimiz ekran goruntulerini inceleyelim:
1-) SQL> SELECT tablespace_name, status, contents, extent_management, segment_space_management FROM DBA_TABLESPACES;

TABLESPACE_NAME          STATUS    CONTENTS  EXTENT_MAN  SEGMENT
-----------------------------------------------------------------------------------------------------------
SYSTEM                               ONLİNE    PERMANENT      LOCAL          MANUAL
UNDOTBS1                          ONLİNE    UNDO                  LOCAL          MANUAL
SYSAUX                               ONLİNE    PERMANENT      LOCAL          AUTO
TEMP                                    ONLİNE    TEMPORARY      LOCAL         MANUAL
....
....

2-) SQL> SELECT name, bigfile, flashback_on FROM V$TABLESPACE;

NAME                           BİGFİLE       FLASHBACK_ON
-----------------------------------------------------------------
SYSTEM                         NO                YES
UNDOTBS1                   NO                YES
SYSAUX                         NO                 YES
TEMP                             NO                YES

     Yukaridaki iki sorgunun ciktilarina da bakaraktan, V$TABLESPACE’in sagladigi bilgilerin biraz daha kisitli oldugunu anliyoruz ancak bu goruntu ile de FLASHBACK ile ilgili bilgileri gorebiliyoruz. Birde DBA_TABLESPACES’in biraz daha fazla ve nitelikli bilgi sunmakta oldugu hemen goze batiyor. Ote yandan DBA_TABLESPACES icerisindeki bilgiye veritabanini open duruma getirmeden ulasamazken, V$TABLESPACE icerisindeki veriye veritabani mount mod’da iken ulasabiliriz.

Tablespace’leri Kaldirmak: Bir tablespace’in artik veritabaninin bir parcasi olmadigini dusundugunuz zaman asagidaki komut yardimi ile ilgili tablespace’i database’den kaldirabiliriz:
SQL> DROP TABLESPACE KAYA_TBS;
SQL> Tablespace dropped
*Bir tablespace kaldirildigi zaman rollback sansiniz yoktur ve bu sekilde geri getiremezsiniz!!!
*SYSTEM tablespace’ini asla veritabanindan kaldiramazsiniz!!!
     
     Bir tablespace veritabanindan kaldirildigi zaman kontrol dosyasi uzerinde bir guncelleme gerceklestirilir. Onemli bir not, bir tablespace’i veritabaninin bir parcasi olmaktan cikardiginiz zaman varsayilan olarak o tablespace’e ait veri dosyalari sistemden kaldirilmaz. Baska bir tablespace icin ileride kullanabilirsiniz. Ancak yine de bu veri dosyalarini da sistemden kaldirmak istiyorsaniz asagidaki komutu yazmalisiniz:
SQL> DROP TABLESPACE KAYA_TBS İNCLUDİNG CONTENTS AND DATAFİLES;

Hiç yorum yok:

Yorum Gönder