7 Ocak 2015 Çarşamba

Oracle 12c Multitenant Mimarisi

Oracle veritabanı 12c sürümüyle gelen en önemli yeniliklerden birtanesi Multitenant mimarisidir.. Basitçe, container adı verilen bir instance'ın pluggable birden çok veritabanını barındırması mantığına dayanıyor. Multitenant container database sıfır,bir veya daha çok user created pluggable database'i barındırabilir. PDB(pluggable database) ise schemaların, schema objelerinin ve nonschema objelerin portable bir koleksiyonu olarak adlandırılabilir.

12c sürümünde kullanabileceğimiz 3 farklı konfigürasyon tipi vardır;

  • Multitenant özelliklerinden faydalanmak istemiyorsak eski mimari ile alıştığımız 11g database özellikleri ile databaseimizi kurup yönetebiliriz.
  • İleride bu mimariye geçiş yapma ihtilamine karşılık 12c kurulumu esnasında 1 CDB ve 1PDB ile kurulumu gerçekleştirip, Multitenant architecture in single tenant konfigürasyonunu kullanabiliriz..Bu opsiyon için Multitenant lisans ücreti ödemiyoruz.
  • Son olarak ise multiple PDB per CDB olarak adlandırılan konfigürasyonla Multitenant özelliğini tam olarak kullanabiliriz,bu konfigürasyon için Multitenant lisansının olması gerekiyor..


CDB içerisindeki Container, PDB yada root container(root olarak da adlandırılır) olabilir..Container; schema, obje ve CDB içerisindeki ilişkisel yapılardan oluşur. CDB içerisindeki her container unique bir ID ve isme sahiptir..Container aynı zamanda tenant olarak da adlandırılır. Her CDB aşağıdakilere sahiptir;
  • Root; oracle-supplied metadata ve common userları tutar..Root container CDB$ROOT olarak adlandırılır..Root user datasını tutmaz.
  • Seed PDB; yeni PDB yaratmak için kullanılabilen system-supplied templatedir. PDB$SEED olarak adlandırılır. Seed PDBye obje eklenemez ve var olan objeleri değiştirilemez..
  • Zero or more user-created PDB; Pluggable dblerdir. CDB oluşturulduğunda otomatik olarak oluşturulmaz, kendi gereksinimimize göre PDB'ler yaratabiliriz. PDBler application datasını tutmak, datayı farklı bir CDB'ye taşımak amacıyla kullanılabilir..
Aşağıdaki şemada gördüğümüz CDB altında root, seed ve iki adet PDB bulunmaktadır. Her PDB'i kendi uygulamasına hizmet vermektedir. Her PDB'nin kendi administrator'ı bulunmaktadır. CDB administrator user'ı herbir PDB'yi yönetebilir..Fiziksel seviyede bakıldığı zaman CDB önceden var olan non-cdb databaseler gibi bir instance ve databasefile'lara sahiptir..Multitenant yapıda Background processleri, shared memory ve Oracle Metadata, redolog,controlfile ve undo tablespaceleri ortaktır. PDBlerde ise application data ve tablespaceleri,Local user ve roller ve local metada tutulur.Gerekli görüldüğü takdirde PDB bazında temp tablespaceler tanımlanabilir.

The Root

Multitenant Mimarinin Sağladıkları 
  • Cost Reduction : Kaynakların PDBler arasında paylaşımlı kullanılması maliyeti azaltır.daha az fiziksel sunucu ve daha az yönetim maliyeti ortaya çıkar..
  • Easier and More rapid movement of data : PDB'yi unplug edip başka bir CDB altına plug ettiğimiz zaman datanın hızlı bir şekilde taşınmasını sağlamış oluruz. Plıg/ungplug tekniği transportable tablespace mantığına oldukça yakındır..
  • Easier management and monitoring of the physical db : Non-cdb databaseler'de birçok fiziksel database'in yönetimi ve monitorü zorluğunu ortadan kaldırır. Fiziksel dosyaların ortak kullanımı sayesinde yönetimsel olarak daha az enerji harcanmasını sağlar..
  • Ease of performance tuning : Tek database'in performans metriclerinin toplanacağı için performans tuning işlemlerini kolaylaştırır.
  • Patches and Upgrade : CDB'ye uygulanacak patchler var olan tüm PDB'leri etkileyecektir.

Naming For PDB
Unique bir adı olmalıdır.PDB kendisiyle aynı isme ait servicename'e sahip olacaktır.PDB'ler ayrı namespace'lere sahiptir. Ayrı PDB'lerde aynı isme sahip şemalar bulunabilir. Objeler ise PDB içinde unique name'e sahip olmalıdır.

Data Dictionary Architecture
CDB içerisindeki her containerın data dictionarysi ayrıdır.Mesela DBA_OBJECTS viewine bir select attığımız zaman farklı PDB'ler için farklı sonuçlar döndürebilir.Dictionarylerin farklı olması sayesinde Her PDB'nin birbirinden ve roottan bağımsız yönetilmesi sağlanır.

Yeni yaratılmış henüz data içermeyen bir non-CDB databasede data dictionary sadece sistem metadatasını içerir. Örneğin  TAB$ tablosu şu an sadece oracle supplied table'ları içerir.Aşağıdaki grafikte kırmızı çizgiler bu sistem kayıtlarını göstermektedir.

Non-CDB bir database oluşturduktan sonra user kendi objelerini yaratmaya başladığı zaman, oracle-supplied kayıtların yanında user-created objeler içinde dictionary'de kayıtlar tutulmaya başlanacaktır.


Şimdi CDB bir databasede durumun nasıl olduğuna bakarsak; Data dictionary metadata root ve PDB'ler arasında ayrılmıştır.User data PDB'de tutulur. PDB'nin usercreated objelerin metadatası tutulurken, oracle-supplied objeler için root'un dictionarysini işaret eder..

Bu dictionary mimarisi temelde iki önemli avantaj sağlar..
  • Duplication'ı azaltır ; Örneğin DBMS_ADVISOR PL/SQL paketinin her PDB için tutulmasına gerek kalmaz.sadece CDB$ROOT'ta tutulur ve böylece diskten tasarruf sağlanır..
  • Database upgradeini kolaylaştırır ; Yeni sürümlerde meydana gelen değişiklikleri her PDB'ye ayrı ayrı uygulama zahmetinden kurtarır bizi..

CDB'de servis yaratılması
Bir PDB yarattığımız zaman database otomatik olarak CDB içerisinde bir servis yaratır ve başlatır.PDB ile aynı isme sahip olan bu servis defaultdur ve drop edilemez.Bu PDB için ayrıca servisler de yaratabiliriz.Servis yaratma işlemi non-CDBlerdeki ile aynı şekilde yapılmaktadır..


CDB administrator CBD altındaki herhangi bir container'a bağlanabilir.Containerlar arasında geçiş yapmak için ise aşağıdaki komut kullanılır.
ALTER SESSION SET CONTAINER = ContainerName;

SQL plus ile databaseimize bağlandığımız zaman default olarak roota bağlanıyor..

SQL> SHOW CON_NAME

CON_NAME
------------------------------
CDB$ROOT

Servisleri sorgulamak için;
SQL> SELECT NAME, PDB FROM V$SERVICES
ORDER BY PDB, NAME;    

NAME                  PDB
---------------------------------------------------------------- ------------------------------
SYS$BACKGROUND CDB$ROOT
SYS$USERS                  CDB$ROOT
cdb1                  CDB$ROOT
cdb1XDB                   CDB$ROOT
pdborcl                          PDBORCL



Şuan CDB üzerindeki containerları görmek için aşağıdaki sorguyu kullanabiliriz.

SQL> SELECT NAME, CON_ID, DBID, CON_UID, GUID FROM V$CONTAINERS ORDER BY CON_ID;

NAME        CON_ID  DBID    CON_UID    GUID
--------            ----------    ----------        ----------     --------------------------------
CDB$ROOT  1         841923413            1   FD9AC20F64D344D7E043B6A9E80A2F2F
PDB$SEED  2        1497111388 1497111388   0BE96D62907A1C0EE0538338A8C04659
PDBORCL  3        2980990456 2980990456   0BE9A9F319561EE4E0538338A8C09583



CDB'de Common Ve Local Userlar
CDB üzerinde yaratılan common userlar root dahil tüm PDB'lere bağlanabilir ve işlemler yapabilir.Oracle-supplied yada user-created common userlar vardır. Örneğin SYS and SYSTEM oracle-supplied common userlardır..User created common userlar C## veya c## ile başlayan isimlere sahip olmalıdır.Aşağıdaki şemada hrpdb ve salespdb pluggable databaseleri bulunmaktadır, SYS ve c##dba common userlardır.hr ve rep userları ise iki PDB'de de local user olarak bulunmaktadırlar..


  • Common user root dahil create session privilegine sahip olduğu tüm containerlara login olabilir. Common user her container için aynı haklara sahip olmak zorunda değildir. Örneğin hrpdb ve roota bağlanabilirken, salespdb için create session hakkı vermeyebiliriz..
  • Unique ve c## yada C## ile başlayan bir isme sahip olmalıdır. Root içinde bulunur fakat tüm PDBlere aynı kimlikle bağlanır..
  • Common user birden çok PDBye bağlanma hakkına sahip ise o herbir c#dba şeması farklı objeler içerebilir.
Local User ; yalnızca yaratıldığı  PDB için operasyonları gerçekleştirebilecek userdır.
  • PDB altında kendi şemasına sahiptir.Başka bir PDB yada roota login olamaz.
  • Local user rootda yaratılamaz.Yaratıldığı PDB içerisinde unique bir ismi olmalıdır.
  • Common user  altındaki objelere izinlerine bağlı olarak erişebilir.Örneğin c##dba kullanıcısı kendi şemasında ve hrpdb üzerinde bir tablo yaratırsa, gerekli izinler verildiğinde hr kullanıcısı bu tabloya erişebilir.
Common  ve Local Roller


Common Roles oracle-supplied yada user created roller olabilir. DBA ve Public gibi oracle-supplied rollerin hepsi common roldür..User created common roller ,common userda olduğu gibi c## yada C## ile başlamak zorundadır. Common role yaratabilmek için common user create role yetkisine sahip olmalıdır ve SET CONTAINER hakkında sahip olmalıdır.. CREATE ROLE statementında CONTAINER=ALL olarak set edilir ve common role yaratılmış olur.
Local Roller ise yaratıldıkları PDB içerisinde geçerlidirler.Yine local userlarda olduğu gibi aynı isme sahip roller farklı PDBler altında yaratılabilir..

Grant işlemleri ise non-CDBlerde olduğu gibi yapılır. Aradaki temel fark ise; local ve common durumudur..Localde bir yetkilendirme yapılacaksa CONTAINER=CURRENT, common bir yetkilendirme işlemi yapılacaksa CONTAINER=ALL opsiyonuyla yapılır.


CDB'de Database Dosyları
Fiziksel olarak bakıldığı zaman, her pluggable database kendi tablespace ve data dosyalarına sahiptir.
Redolog files,Undo tablespace ve control file ise ortaktır..Default olarak CDB içerisinde temp file bulunur ve PDB'ler bunu kullanır. Ancak ihtiyac durumunda local bir temp file yaratılarak ilgili PDB'nin onu kullanması sağlanılabilir.Her PDB kendi SYSTEM ve SYSAUX tablespaceine sahiptir.



Kaynaklar:
Oracle Database Concepts, 12c Release 1 (12.1)
TROUG-LOG Oracle 12c Veritabanının Yeni Özellikleri / Zekeriya Beşiroğlu
https://blogs.oracle.com/Multitenant/entry/single_tenant_configuration












0 yorum:

Yorum Gönder