ablespace Nedir?
Bu yazımda tablespace’in ne olduğunu ve nasıl yönetildiğini ifade edeceğim. Bulunduğum birçok yerde, okuduğum forum’larda, herkesin detaylı olarak bilmek istediği yapılardan birisi tablespace’dir. Öncelikle tablespace’in mantıksal grup objeleri olduğunu bilmemiz gerekiyor. Tablespace’ler sıfır ya da sıfırdan fazla segment’e sahip olabilirler. Hemen hatırlayalım;
İşletim Sistemi Blokları –> Oracle Blokları –> Oracle Extent’leri –> Oracle Segment’leri
Bir uygulamaya ait tablo ve indeksleri bir tablespace içerisinde tutabilir ve verinin yönetimini kolaylaştırabilirsiniz. Bütün bir veritabanının yedeğinden dönmek yerine bir tablespace’i kurtarabilirsiniz, offline yapabilirsiniz. Bir tablespace’i read only yapabilir ve statik verinin sürekli yedeklenmesini önleyebilir veya bir tablespace’i başka bir veritabanına taşıyabilirsiniz.
Bir 11g veritabanında olmazsa olmaz iki tane tablespace vardır. Bunlar system ve sysaux’tur. System tablespace’i içerisinde data dictionary tutulmaktadır ve bir kullanıcı objesinin yaratılması için kullanılmamalıdır. Bir veritabanı yaratıldığı zaman bu iki tablespace mutlaka yaratılır. Eğer herhangi başka bir tablespace yaratılmadıysa (veritabanı oluşturulurken) system temporary (geçici) tablespace gibi davranacaktır. Genelde tavsiye edilen durum system ve sysaux dışında varsayılan bir temporary tablespace yaratmak ve bir de undo tablespace’e sahip olmak. Tekrar hatırlayalım, undo tablespace’in yokluğunda system, undo tablespace gibi davranmaktadır ve kesinlikle bu durum tavsiye edilmemektedir. System’in rollback segment’leri yerine, undo tablespace’in undo segment’lerinin, veri tutarlılığı açısından kullanılması daha iyidir.
Tablespace Yaratmak ve Bakımını Gerçekleştirmek
İki komut ile tablespace yaratılabilir. CREATE DATABASE veya CREATE TABLESPACE. Bir tablespace’i yaratırken almamız gereken bazı kararlar bulunmaktadır. Bunlar;
1) Bir tablespace’i bigfile veya smallfile tablespace yapmak.
2) Extent’lerin local mi olarak mı yoksa dictionary tarafından mı yönetilmesi.
3) Segment boşluklarının otomatik mi yoksa elle mi kontrol edilmesi.
Buna ek olarak az önce bahsettiğim gibi özelleştirilmiş iki tane tablespace vardır. Temporary ve undo tablespace’leri. Bir örnekle devam edelim;
1 |
SQL> CREATE TABLESPACE ogan_tbs |
2 |
2 DATAFILE '/db/ogan/mydf_01.dbf' |
Yukarıdaki sorgu ile ogan_tbs adında bir tablespace yarattım ve bir tane de datafile’ı olduğunu, boyutunun ise 20M olduğunu söyledim. Boyutlandırma ile ilgili önemli bir nokta, tablespace’in boyutu yoktur, tablespace’ler genişletilemez. Tablespace’lerin içerisindeki veri dosyalarının boyutu(ları) vardır ve bunların boyutlarının arttırılması ile tablespace büyür.
Bigfile ve Smallfile Tablespace Yaratmak
Bir bigfile tablespace yalnız bir veri (geçici) dosyadan (datafile veya tempfile) oluşmaktadır ve boyut olarak 2 üzeri 32 veri bloğundan oluşabilir. 32KB blok boyutu kullanmakta olan bir bigfile tablespace’in çıkabileceği (içerisindeki tek datafile’ın boyutu) toplam boyut 128TB’dir.
Bu tipte tablespace’ler çok büyük veritabanları için tasarlanmıştır. Eğer datafile adedini düşürürseniz checkpoint’in datafile başlıklarını güncellemesi kısmen daha hızlı olacaktır. Bir bigfile tablespace yaratmak için yapılması gereken tek şey “BIGFILE” özel kelimesini eklemektir;
1 |
SQL> CREATE BIGFILE TABLESPACE ogan_tbs |
2 |
2 DATAFILE '/db/ogan/mydf_01.dbf' |
Smallfile tablespace olarak adlandırdığımız tipte ise bir tablespace’e ait birden çok veri dosyası olabilmektedir. Örneğin 8KB blok boyutu kullanmakta olan bir tablespace’e ait veri dosyalarının azami boyutu 32GB olabilmektedir. Bir smallfile tablespace yaratabilmek için BIGFILE özel kelimesini gözardı edebilir veya isteye bağlı olarak SMALLFILE ekleyebiliriz;
1 |
SQL> CREATE [SMALLFILE] TABLESPACE ogan_tbs |
2 |
2 DATAFILE '/db/ogan/mydf_01.dbf' |
Oracle Managed File Tablespace’leri İle Çalışmak
OMF özelliği ile bir Oracle 11g veritabanının parçası olan veri dosyalarını rahatlıkla yönetebilirsiniz. OMF’i devreye alabilmek için aşağıdaki parametreyi ayarlamanız gerekmektedir;
2 |
2 DB_CREATE_FILE_DEST = '/db/ogan_veri/' |
Bir OMF tablespace’i yaratırken dosya adını gözardı ediyoruz;
1 |
SQL> CREATE TABLESPACE my_tbs; |
Bu aşamada OMF’in devrede olduğunu bilen Oracle veritabanı bizim için bir veri dosyasını otomatik olarak ve benzersiz bir isimle /db/ogan_veri/ altında yaratacaktır. OMF kullanırken dikkat edilmesi gereken nokta, tanımladığını dizin adından sonra da Oracle’ın birkaç altdizin yaratacak olması. Bu altdizinler DBNAME/datafile şeklinde olacaktır, yani veritabanının adının ve “datafile” isimlendirmesinin olduğu dizin adları olacaktır. Varsayılan olarak smallfile tablespace yaratılacaktır ancak yine BIGFILE kelimesi ile ilgili tablespace bigfile olarak yaratılabilmektedir. Otomatik olarak yaratılacak olan veri dosyasının ise oto-genişlemesi açık ve toplam boyutu 100MB olarak ayarlanacaktır.
Extent Yönetimini Seçmek
Oracle veritabanı bir tablespace içerisindeki bir obje için yer tahsisi etmek istediği zaman, bir yığın halinde duran veritabanı bloklarından oluşan extent’lerden tahsis etmektedir. Oracle bu extent bilgilerini; serbest olan extent’ler, extent boyutları, tahsis edilen toplam extent miktarı gibi bilgileri ya data dictionary’de ya da tablespace’in kendisi tarafından yönetmektedir ve bakımını yapmaktadır.
Bir tablespace’e ait extent bilgilerini dictionary’de tutmakla oluşan tablespace’e “dictionary managed tablespace” denmektedir. Extent’ler üzerinde yapılacak herhangi bir değişiklikte (tahsis veya bırakma – allocation or freed) ilgili data dictionary tabloları güncellenecek ve bu güncelleme için de ayrıca undo üretilecektir.
“Local extent” yönetimi ile veri dosyalarının başlıkları içerisinde bulunan bir güncelleme (bitmap pattern) ile bu işlem yapılmaktadır. Bu durumda Oracle, UET$ ve FET$ tabloları üzerinde dolanmak ve gereksiz recursive SQL’ler oluşturmak yerine bu başlıktaki bitmap bilgilerini güncelleyecektir. Örnekle devam edelim;
1 |
SQL> CREATE TABLESPACE ogan_tbs |
2 |
2 DATAFILE '/db/ogan/mydf_01.dbf' |
4 |
4 EXTENT MANAGEMENT DICTIONARY; |
Local extent yönetimine sahip bir tablespace’e ait olan veri dosyalarının extent’lerinde yapılacak bir güncellemede, bu veri dosyalarının başlıkları içerisinde bulunan bitmap bilgileri güncellenecek ve blokların yeni durumları gösterilecektir. Bu güncelleme ile rollback’in bir ilgili yoktur çünkü herhangi bir data dictionary tablosu güncellenmemektedir. Lokal olarak extent’leri yönetilen bir tablespace’in extent tahsisinin yapılmasında iki adet seçeneğimiz bulunmaktadır. UNIFORM veya AUTOALLOCATE. Uniform opsiyonunu seçerek Oracle’a tahsis edeceği veya serbest bırakacağı extent boyutlarının aynı olduğu ve varsayılan olarak 1 MB olacağını ifade etmekteyiz. Uniform seçeneği bir geçici tablespace için varsayılandır ve bir undo tablespace’i için seçilemez. 20MB’a sahip bir uniform tablespace yaratabilmek için aşağıdaki komutu çalıştırmamız yeterlidir;
1 |
SQL> CREATE TABLESPACE ogan_tbs |
2 |
2 DATAFILE '/db/ogan/mydf_01.dbf' |
4 |
4 EXTENT MANAGEMENT LOCAL UNIFORM SIZE 20M; |
Autoallocate seçeneği ile tahsis edilecek veya serbest bırakılacak extent’lerin boyutlarının değişebileceğini ve segment’ler içerisinde bu şekilde yer alacağını ifade etmekteyiz. Burada uniform’dan farklı yani uniform’da belirli bir ölçüde (varsayılan olarak 1 MB) hareket etmesini söylemekteydik. Autoallocate seçeneği bu özelliği sayesinde küçük veya büyük tabloların en iyi seçeneği olmaktadır. Autoallocate seçeneği ile bir tablespace yaratmak içinse;
1 |
SQL> CREATE TABLESPACE ogan_tbs |
2 |
2 DATAFILE '/db/ogan/mydf_01.dbf' |
4 |
4 EXTENT MANAGEMENT LOCAL AUTOALLOCATE; |
Bir lokal extent yönetimine sahip bigfile tablespace için hiçbir zaman dictionary özelliğine kullanamamaktayız. Bigfile tablespace’leri her zaman lokal extent yönetimine sahiptirler. Bunun yanı sıra, bir smallfile tablespace’i dictionary extent yönetiminden lokal extent yönetimine, DBMS_SPACE_ADMIN PL/SQL paketini kullandırarak geçirebilmekteyiz. Aslında bu kadar uzun cümlenin sonunda söylenebilecek şey şudur ki Oracle’ın 10g’den sonra 11g’de de tavsiye ettiği tablespace extent yönetimi lokaldir. Bu fikre nereden kapıldığımı sorarsanız eğer çok ince bir detay vermek isterim. Oracle 11g veritabanının DBCA (Veritabanı konfigürasyon asistanı) aracı varsayılan olarak SYSTEM tablespace’ini lokal extent yönetimi seçeneği ile yaratmaktadır ve bir SYSTEM tablespace’i bu seçenek ile yaratılırsa, veritabanı üzerinde hiçbir tablespace dictionary extent yönetimi ile yaratılamaz. Veritabanı yönetimi konusunda hiçbir bilgiye sahip değilseniz ve bir kurulum yapmaktaysanız bu bilgiye sahip olmanız faydalı olacaktır. Oracle’ın sizi nereye yönlendirdiğiniz bilmeniz her zaman iyidir.
Segment Alan Yönetimini Seçmek
Bütün lokal extent yönetimine sahip olan tablespace’ler için iki farklı segment alan yönetimi seçebilmekteyiz. Otomatik veya manuel. Manuel segment alanı yönetiminde bir serbest bloklar listesi tutulmaktadır ve bu listenin amacı hangi blokların insert işlemi için hazır olduğunu göstermektir. Bunu yaparken bir blok üzerinde kullandığı bilgilere ise PCTUSED ve PCTFREE parametreleri sahiptir. Herhangi bir “insert” veya “update” operasyonundan sonra veritabanı kalan alanı ilgili bloktaki PCTFREE parametresini kontrol ederek algılar. Eğer kalan veri bloğu alanı PCTFREE parametresinin altında ise bu blok yukarıda bahsettiğim listeden çıkartılır ve bir insert operasyonu için yeniden gösterilmez. Bu noktada ilgili blok üzerinde kalan PCTFREE parametresi kadar alan ileriki “update” operasyonları için saklanır. Herhangi bir “update” veya “delete” operasyonundan sonra veritabanı kullanılan alanı ilgili bloktaki PCTUSED parametresini kontrol ederek algılar. Eğer kullanılan veri bloğu alanı PCTUSED parametresinin altında ise bu blok yukarıda bahsettiğim listeye alınır ve sonraki insert operasyonu için hazır bekletilir. Kısacası döndü bu şekilde ilerlemektedir ve PCTUSED ile PCTFREE parametrelerini değiştirebilmekteyiz fakat Oracle şiddetle segment alan yönetimini otomatik ve extent yönetimini de lokal seçmemizi tavsiye etmektedir. Bu şekilde en optimum düzeyde ve bir veritabanı yöneticinin gündelik hayatını kolaylaştıracak seviyede yönetim sağlanmaktadır.
1 |
SQL> CREATE TABLESPACE ogan_tbs |
2 |
2 DATAFILE '/db/ogan/mydf_01.dbf' |
4 |
4 EXTENT MANAGEMENT LOCAL AUTOALLOCATE |
5 |
5 SEGMENT SPACE MANAGEMENT MANUAL; |
Bu segment alan yönetiminin bir tablespace için otomatik ayarlandığı durumda ise şu meşhur serbest bloklar listesi kullanılmayacak, onun yerine yine bitmap’ler kullanılacaktır. PCTUSED ve PCTFREE parametreleri bu defa gözardı edilecektir. Otomatik segment alan yönetimi yalnızca lokal extent yönetimine sahip olan tablespace’ler tarafından kullanılabilmektedir ve bir temporary veya system tablespace’i için bu tanımlama yapılamaz. Segment alan yönetimini otomatik olarak tanımlamak için;
1 |
SQL> CREATE TABLESPACE ogan_tbs |
2 |
2 DATAFILE '/db/ogan/mydf_01.dbf' |
4 |
4 EXTENT MANAGEMENT LOCAL AUTOALLOCATE |
5 |
5 SEGMENT SPACE MANAGEMENT AUTO; |
Diğer Tablespace Opsiyonlarını Seçmek
Buraya kadar gördüğünüz özellikler bir tablespace’in karakteristiğini oluşturmaktadır ve bizi bir seçim yapmaya zorlamaktadır. Aslında bu seçim konusunda her ne kadar bize yardımcı olmaktaysa da yönetimi kendimiz de ele alabilmekteyiz.
Diğer opsiyonlar ise;
1) Varsayılan olmayan bir blok alanı belirlemek.
2) Varsayılan depolama karakteristiğini belirlemek.
3) “Logging” ve “Flashback” özelliklerini belirlemek.
4) Offline tablespace yaratmak.
Aşağıdaki örneği inceleyebilirsiniz (dictionary yönetim);
01 |
SQL> CREATE TABLESPACE my_tbs |
02 |
2 DATAFILE '/db/ogan_veri/my_datafile.dbf' |
11 |
11 MINIMUM EXTENT 256K |
16 |
16 EXTENT MANAGEMENT DICTIONARY |
17 |
17 SEGMENT SPACE MANAGEMENT MANUAL; |
Aşağıdaki örneği inceleyebilirsiniz (lokal yönetim);
01 |
SQL> CREATE TABLESPACE my_tbs |
02 |
2 DATAFILE '/db/ogan_veri/my_datafile.dbf' |
04 |
4 DEFAULT STORAGE COMPRESS |
10 |
10 EXTENT MANAGEMENT LOCAL |
11 |
11 SEGMENT SPACE MANAGEMENT AUTO; |
DEFAULT STORAGE:Bu parametre ile tablespace üzerinde yaratılacak olan yeni objelerin varsayılan depolama karakteristiği belirlenmektedir. Bu parametre tanımlandığı anda tablespace için geçerli ve varsayılan depolama tekniği ve yolu devre dışı kalacak ve sizin belirlediğiniz şekilde objeler depolanacaktır. Eğer bu parametreyi kullanmayı seçtiyseniz içerisindeki (yukarıdaki örnek) hiçbir parametrenin kullanılması zorunlu değildir fakat en az 1 tane belirtmek zorundasınız. Yalnız unutmayınız, bu tipte alt parametreler yalnızca dictionary yönetime sahip tablespace’lerde geçerlidir.
BLOCKSIZE: Oracle 11g veritabanı, bir tablespace’in veritabanı için tanımlanmış ve sabit olan blok boyutu dışında da blok boyuna sahip olabilmesine izin vermektedir. Veritabanı genelinde yaptığınız blok boyutu belirlemesini sonradan değiştiremediğinizi de belirterek, bunu yapmak için kullandığınız parametrenin DB_BLOCK_SIZE olduğunu ifade etmeliyim. Eğer tablespace yaratırken BLOCKSIZE belirtilmemiş ise o tablespace için geçerli olacak blok boyutu, veritabanı için geçerli olan olacaktır. Geçerli ve tanımlanabilecek blok boyutları ise 2K, 4K, 8K, 16K ve 32K’dır.
MINIMUM EXTENT: Extent boyutlarının katının ne olacağını gösterir ve yalnızca dictionary yönetimine sahip bir tablespace için tanımlanabilir.
LOGGING / NOLOGGING: Bu parametrenin amacı DDL operasyonlarının ve direkt yüklemelerin (direct-load insert) redolog’larda kayıt altına alınıp alınmaması ile ilgilidir. Varsayılan olarak LOGGING seçeneği ile bir tablespace yaratılmaktadır. NOLOGGING seçeneğini tercih ederseniz veri çok minimal logging ile değiştirilecek ve komutlar çok daha hızlı tamamlanacaktır. Herhangi bir kurtarma işleminde koşturduğunuz bu komutları, redolog’lara yazılmadığı için tekrarlamak durumunda kalabilirsiniz.
FORCE LOGGING: Hiçbir tablespace’in LOGGING koşuluna bakmadan, yapılan bütün işlemlerin redolog’lara yazılmasını sağlamaktadır. Bir tablespace yaratılırken NOLOGGING ve FORCE LOGGING seçeneklerini belireterek bir hata yapmıyorsunuz ya da tablespace yaratılması sırasında hata almıyorsunuz ancak NOLOGGING seçeneğiniz, FORCE LOGGING seçeneği tarafından engellenecek ve yine yapılacak bütün işlemler redo log’lara yazılacaktır. Tablespace’in FORCE LOGGING özelliğini devre dışı bıraktığınızda ise NOLOGGING yeniden devrede olacaktır. Bu sebepten dolayı FORCE LOGGING seçeneği ile birlikte LOGGING veya NOLOGGING kullanımı serbesttir.
ONLINE / OFFLINE: Varsayılan olarak bir tablespace ONLINE yaratılır ve bu seçenek gözardı edilebilir. Eğer tablespace’in erişilebilir olmasını istemiyorsanız OFFLINE seçeneğini de kullanabilirsiniz.
FLASHBACK ON / OFF: FLASHBACK ON seçeneğini tablespace’i flashback moduna sokar ve varsayılan seçenektir. OFF olarak tanımlarsanız Oracle ilgili tablespace üzerinde herhangi bir flashback verisi oluşturmayacaktır. Flashback operasyonları ile ilgili daha önceki yazılarımı okuyabilirsiniz.
Geçici (Temporary) Tablespace Oluşturmak
Oracle 11g veritabanı temporary tablespace’i kullanarak sıralama (sort) operasyonlarını çok daha efektif olarak yapabilmektedir. Bu tablespace’i oluşturarak kalıcı (permenant) bir tablespace üzerindeki tahsisleri ve bırakma işlemlerini aşabilirsiniz. Temporary tablespace, temporary segment’leri için kullanılmaktadır ve gerektiği takdirde veritabanı tarafından yönetilmektedir. Bu tipte temporary segment’leri genelde aşağıdaki operasyonlarda kullanılmaktadır;
1) GROUP BY
2) ORDER BY
3) CREATE INDEX
4) Hash Join (Yığın birleşimi)
5) Insert into cümleciği
Bir veritabanı kurulumu aşamasında CREATE DATABASE komutunu takiben DEFAULT TEMPORARY TABLESPACE cümleciğini de kullanabiliyoruz;
1 |
SQL> CREATE TEMPORARY TABLESPACE ogan_temptbs |
2 |
2 TEMPFILE '/db/ogan_veri/temp01.dbf' ; SIZE 1G; |
Burada dikkat, DATAFILE yerine TEMPFILE isimlendirmesini kullandık. Temporary segment’leri yalnızca bir temporary tablespace’de bulunmaktadır, yedeklenmelerine gerek yoktur ve herhangi bir şekilde redo üretmezler. Bir diğer dikkat edilmesi gereken konu ise temporary tablespace’i SYSTEM tablespace’inin lokal extent yönetimi durumunda olduğu zaman yaratmak zorunda olmamız. Oracle 11g veritabanı da varsayılan olarak SYSTEM tablespace’ini lokal extent yönetiminde yarattığı için DBCA kurulumları sırasında bir de temporary tablespace’ine sahip olacaksınız demektir!
Tempfile ile datafile arasındaki fark, tempfile’ların gerekmedikçe yer tahsisinde bulunmaması. Ortamda yukarıda belittiğim 5 koşul bulunmuyorsa tempfile’lar da olduğu yerde kalacaktır. Her kullanıcıya yaratıldığı sırada bir temporary tablespace tahsis edilir. İlgili kullanıcı yine yukarıdaki 5 koşuldan bir veya birkaçını yerine getirdiği zaman temporary tablespace üzerinde sort operasyonları devreye girer. Varsayılan olarak, kullanıcı oluşturulması sırasında hem obje yaratmak için kullanılacak tablespace hem de sort operasyonları için kullanılacak olan tablespace SYSTEM’dir. Hiçbir kullanıcının SYSTEM tablespace’ini bu iş için kullanması optimum sonuç değildir ve SYSTEM tablespace’i üzerinde fragmantasyona sebep olacaktır.
TABLESPACE GROUP cümleciği ile bir temporary tablespace grubu kurabilir ve utilizasyonu en etkili biçimde kullanmaya çalışabiliriz.
1 |
SQL> CREATE TEMPORARY TABLESPACE ogan_temptbs |
2 |
2 TEMPFILE '/db/ogan_veri/temp01.dbf' ; SIZE 1G |
3 |
3 EXTENT MANAGEMENT LOCAL UNIFORM 10M |
4 |
4 TABLESPACE GROUP MY_TEMPS; |
Tablespace grupları yalnızca temporary tablespace’ler için geçerlidir.
Undo Tablespace Oluşturmak
Yine çok fazla üzerinde düşünülen ve soru sorulan bir başka konu da undo tablespace’in ne olduğu ve hangi durumlarda undo üretildiğidir.
Undo tablespace’i de yine temporary’de olduğu gibi bir çeşit segment’ler topluluğudur. Bünyesinde bulundurduğu segment’lere ungo segment’leri denmektedir. Bu segmentlerin ama