Hurriyet

27 Aralık 2013 Cuma

Oracle Veritabanı: Oracle Veritabanındaki Kullanıcıların Yönetimi - Oracle Database Management For Users

Oracle veritabanlarına bağlanmak için kullanıcılarımızın bulunması gerekir. Bu kullanıcılar bir uygulama tarafından da kullanılabilir, son kullanıcılar tarafından da. Oracle bu kullanıcıların erişimiyle ilgili çeşitli limitler koymamızı sağlıyor. Veritabanındaki kaynakları da limitleyebiliriz. Bu bilgileri saklayan tablolar sayesinde bunları görebiliriz.

Kullanıcıların Yaratılması:

Kullanıcıları yaratırken "create user" ifadesini kullanırız. Bir kullanıcıyı yaratmak için "create user" yetkisinin bulunması gerekir. Bu yetki çok önemli olduğu için herkeste bulunmamalıdır. Kullanıcı yarattıktan sonra da kullanıcılara verdiğimiz yetkilere dikkat etmeliyiz. Bu yüzden ya kendi belirlediğimiz rolleri vermeliyiz ya da çok belirli yetkileri vermeliyiz.

Örnek: Bir kullanıcının yaratılması

 CREATE USER berke  
  IDENTIFIED BY password  
  DEFAULT TABLESPACE users  
  QUOTA 100M ON users  
  TEMPORARY TABLESPACE temp  
  PROFILE default;  
 GRANT CREATE SESSION TO berke;  

Burada berke kullanıcısı yaratıldığında sadece bağlanma yetkisi verilir. Bu yüzden bağlanma dışında berke kullanıcısı hiçbir şey gerçekleştiremez. Eğer kullanıcımızı silmek istersek de drop ederiz.

 drop user berke ;

Bu kullanıcının yarattığı objeler var ise ve bunlar birbirlerine foreign key gibi bağlarla bağlılarsa o zaman aşağıdaki komut ile kullanıcımızı drop edebiliriz.

DROP USER berke CASCADE;

O sırada online bir kullanıcıyı drop edemeyiz. Bunun için öncesinde kullanıcımızı kill etmemiz gerekir. Örnek komut aşağıdaki gibidir.

 ALTER SYSTEM KILL SESSION '127, 55234';  

Komutu uyguladıktan sonra kullanıcımızı drop edebiliriz.

Kendi session'ımızla ilgili bilgileri aşağıdaki sorgularla bulabiliriz.

 select sys_context('USERENV','SESSION_USERID') from dual;  
 select sys_context('USERENV','SID') from dual;  


Default Tablespace:
Kullanıcıların yaratılması sırasında default tablespace yani kullanıcıların yarattığı veya yaratacağı  nesnelerin tutulacağı yerdir. Bu ayar direk "system" tablespace'i olarak ayarlanmıştır. Bu işlem tehlikeli olabilir. Çünkü sistemsel dosyalar "system" tablespace'inde saklanır. Buradaki dosyaların bozulma ihtimalinde veritabanı bozulabilir. O yüzden veritabanını yaratırken default tablespace olarak kullanılacak bir tablespace yaratmalıyız.

Kullanıcı yetkileriyle ilgili yazıyı buradan daha da detaylı şekilde okuyabiliriz.

Quota:
Quota ifadesiyle kullanıcılara tablespace'ler üzerinde nesne yaratma yetkisi verilir. Yukarıdaki örneğimizde yaratılacak nesnelerin boyutunun 100MB olarak belirlendiğini görmekteyiz. Bu durumu kullanıcının hareketlerini kısıtlamak anlamında kullanabiliriz. "Unlimited Tablespace" yetkisi ise kullanıcıya herhangi bir tablespace üzerinde istediği kadar miktarda nesne yaratmasını sağlar. Bu yüzden tehlikelidir.

Temporary Tablespace:
Temporary Tablespace ise kullanıcıların çalıştırdıkları SQL'ler sonucunda temporary segment'ler kullanılması gerekiyorsa ihtiyaç duyulur. Standart Temporary Tablespace, eğer genel bir temporary tablespace yoksa system tablespace'i olduğu için bu konuda önemlidir. Ayrıca herkesin ortak temporary tablespace'i kullanmasına izin vermek burada yer kalmamasına da neden olabilir. Bu da performansda düşüşe neden olur ve işlemlerin durmasına neden olabilir.

Profile:
Kullanıcılarımıza  profiller atayabiliriz. Profil olarak belirttiğimiz durum kullanıcıların kaynaklarının kısıtlanmasını sağlayan bir sınır topluluğudur. Peki profillerde atanan sınırlar nelerdir?  Aşağıdaki sorguyla profillerde atanan sınırları görebiliriz.

 SELECT * FROM DBA_PROFILES  
   ORDER BY PROFILE;  

Profillerle ilgili daha fazla bilgi için bu dokümanımıza bakabiliriz.

Kullanıcıların Değiştirilmesi:

Kullanıcılarımızı yarattıktan sonra bunlarla ilgili değişiklik yapmak için "Alter User" yetkisine sahip olmamız gerekir. "Alter User" yetkisiyle aşağıdaki özellikler değiştirilebilinir.


  ALTER USER berke   
  IDENTIFIED BY password   
  DEFAULT TABLESPACE users   
  QUOTA 100M ON users   
  TEMPORARY TABLESPACE temp   
  PROFILE default; 

Kullanıcıların Yetkilendirilmesi:

Yukarıdaki bazı yetkilerden bahsetmiştik. Kullanıcıların yerine göre bazı yetkilere ihtiyaç duyması kaçınılmazdır. Yarattığımız örnek kullanıcıya göre sadece session yaratma yetkisi vermiştik. Kullanıcı yetkileriyle ilgili bilgileri bu yazımızda da göstermiştik.
http://berkeoz1.blogspot.com/2013/09/oracle-veritaban-yonetimi-kullanc.html

Kullanıcılara verebileceğimiz bütün yetkiler burada bulunmaktadır.
http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9013.htm#SQLRF54937


Kullanıcıların Gösterildiği Tablolar:

Bütün kullanıcıları buradan görebiliriz.

 select * from dba_users;  

Bu kullanıcılar belirli bir zaman sonra kilitlenebilir. Profilerinden dolayı veya başka, kilitleme yetkisine sahip birisi tarafından kilitlenme ihtimalleri vardır. Bunları aşağıdaki gibi açabiliriz.

 alter user kullanıcı_ismi account unlock; 

Daha genel bilgiyi buradan alabiliriz:
http://berkeoz1.blogspot.com/2013/09/oracle-veritaban-expired-ve-locked.html

Kullanıcılara Kaynak Ayrılması:

Sistem kaynaklarının kullanıcılara, gruplara veya profillere göre ayrılmasıyla sistem kaynakları daha güvenli bir şekilde yönetilebilinir. Tüketim daha kontrollü sağlanabilinir. Bu işlemin yapılması için "Database Resource Manager" adlı araç kullanılır. Bu işlem kaynakların çok kısıtlı olduğu sistemlerde daha da önemli hale gelmektedir. Kullanıcılar profillerini açtıkları sırada performansta bir düşüş gözlemlenebilir; çünkü veritabanına girişte bu kısıtlar kullanıcılara direk ayrılır.

Kullanıcı Kaynak Kısıtları ve Limitleri:

Veritabanından kontrol edebileceğimiz çeşitli kısıtlama tipleri vardır. Bunlar:

-Kullanıcı Session'ı seviyesinde
-Database Calls - Veritabanına Sorgular
-CPU Time
-Logical Reads
-Diğer Kaynakların Kısıtlanması

Kullanıcı Session'ı Limitleri:
Bir kullanıcı veritabanına her bağlandığında, bir session yaratılmış olur. Her session CPU kullanır ve belirli bir hafıza kullanır. Eğer kullanıcı bütün kaynaklarını kullanırsa gönderdiği ifade durdurulur ve hata verir. Hata verince de sadece commit veya rollback komutlarını verebilir.

Database Calls - Veritabanı Kullanım Limiti:
Veritabanına gönderilen sorguların kullandığı kaynakların ne kadar kullanılacağı ya da ne sıklıkla kullanılacağı sınırlanır.

CPU Limiti:
SQL'ler sonucu kullanılabilecek CPU'nun kısıtlanmasıdır.

Logical Reads:
Logical Reads hem diskten hem de memory'den okunan datalardır. Çok fazla kaynak tüketen bir sorgu veya sorgular topluluğu veritabanı kaynaklarını fazla sıkıştıracağı için bu logical read olarak tanımladığımız okuma türlerine kısıtlar koyabiliriz.

Diğer Kaynaklar:
Diğer kaynaklar olarak nitelediğimiz konular ise kullanıcıların arka arkaya açabileceği session sayısının kısıtlanması, bir session için idle time sınırlamasının yapılması, SGA miktarının ayarlanmasıdır.

Kullanıcılarla İlgili Daha Fazla Bilgiler:

Kullanıcılarımız sisteme bağlandığında bir session oluşturduğunu söylemiştik. Bu session'lar her bağlantıda bir id ile belirlenirler. Bu session id'imizi aşağıdaki linkten bulabiliriz.
http://berkeoz1.blogspot.com/2013/10/oracle-veritaban-sessionid-imizi-nasl.html

Bu session içerisinde yaptığımız sorgular başka session'lardaki kullanıcıların yaptığı sorguları etkileyebilir. Yani onları kilitleyebilir. Kilitlemesi de onların iş yapamaması ve beklemesi anlamına gelir.

Bloke eden session'ları aşağıdaki link'imizden bulabiliriz.
http://berkeoz1.blogspot.com/2013/09/oracle-veritaban-bloke-eden-sessionlarn.html

Kullanıcımızla ilgili nesneleri görmek istiyorsak aşağıdaki sorguyu kullanabiliriz.

SELECT OWNER, OBJECT_NAME FROM DBA_OBJECTS WHERE OWNER LIKE 'BERKE';

Kullanıcımızla ilgili diğer bütün bilgileri örnek olarak SID,Serial#,kullanıcı adımız,kullanıcı id'si gibi bütün bilgileri aşağıdaki SQL'imizle bulabiliriz.

 select * from v$session where sid= (select    
   sid    
  from    
   v$mystat    
  where    
   rownum <=1); 

Her kullanıcının ne kadar hafaıza kullandığını görmek için aşağıdaki sorguyu kullanabiliriz.

  SELECT sess.SERIAL#,sess.SID,USERNAME, VALUE || 'bytes' "Current UGA memory"  
   FROM V$SESSION sess, V$SESSTAT stat, V$STATNAME name  
 WHERE sess.SID = stat.SID  
   AND stat.STATISTIC# = name.STATISTIC#  
   AND name.NAME = 'session uga memory';  


Hiç yorum yok:

Yorum Gönder