Hurriyet

29 Kasım 2013 Cuma

Oracle E-Business Suite: Dosya Versiyonlarının Kontrolü - Checking The Versions of The Files

Oracle E-Business Suite'de dosya ve sistemin versiyonlarının kontrol edilmesi, patch geçilmesi sırasında gerekebilmektedir. Bazı patch'lerde kontrol yapmak için bizden dosyaların versiyonları istenmektedir. Bunun için genel istekleri sıralarsak:

-Application versiyonu için:

 select release_name from apps.fnd_product_Groups;  

-Herhangi bir form'un veya report'un dosya versiyonunu bulmak için:

strings -a form_ismi | grep Header 

Örnek:

strings -a APXINWKB.fmb | grep Header 

Başka bir yöntem ise aşağıdaki komutu kullanmaktır.

 adident Header form_ismi

-Application Product, Patch Set Level, Code Level:

Patch'lerde gözüken, ve prerequisite olarak bazen istenen bilgiler olarak Application Product ya da Patch Set Level ya Code Level aşağıdaki sorguyla bulunabilinir. Örneğin Application DBA uygulaması için Patch Set Level'ı aşağıdaki sorgunun sonucudur.

select patch_level from fnd_product_installations where patch_level like '%AD%'; 

Eğer başka bir uygulama için isteniyorsa da "AD" yerine o uygulamanın kısa adını yazabiliriz.

Bu sorguyla yine diğer bütün uygulamaların seviyelerini bulabiliriz.

 select APP_SHORT_NAME, max(PATCH_LEVEL) from AD_PATCH_DRIVER_MINIPKS GROUP BY APP_SHORT_NAME;

Uygulamanın geliştirilme versiyonları aşağıdaki sorguyla bulunabilinir.

 select ARU_RELEASE_NAME||'.'||MINOR_VERSION||'.'||TAPE_VERSION version,  
  START_DATE_ACTIVE updated, END_DATE_ACTIVE "when lasted",  
  CASE WHEN BASE_RELEASE_FLAG = 'Y' Then 'BASE VERSION'  
  ELSE 'Upgrade' END "BASE/UPGRADE", ROW_SOURCE_COMMENTS "how it is done"  
  from APPS.AD_RELEASES; 





Oracle Veritabanı ve E-Business Suite: My Oracle Support(Metalink)'ten Nasıl Patch İndirilir? - How To Download a Patch For EBS or Oracle Database

Oracle'ın bütün ürünleri için aşağıdaki adımları izleyerek patch'ler indirebiliriz. Burada anlattığımız yollar Oracle Veritabanı ve Oracle E-Business Suite özelinde hazırlanmıştır ancak diğer ürünler içinde nereden indirilebileceğini aşağıdaki yoldan görebiliriz. İlk olarak My Oracle Support sayfasına gitmemiz gerekir. Bu ana sayfadan diğer yerlere yönlenebiliriz.


Bu sayfadan sonra yukarıdaki tab'dan "Patches & Updates" sekmesine tıklarız.



 Bu örnek için özel olarak patch numarasını bildiğimiz için buna göre bir arama gerçekleştiririz. Üzerine yükleyeceğimiz patch'i de seçip "search" düğmesine tıklayınca bununla ilgili sonuçlar aşağıdaki gibi karşımıza çıkar.


Bu patch arama işlemi sonrasında çıkan sayfada gerekli seçeneklleri seçeriz. Bazen versiyon seçenekleri, dil seçenekleri ve platform tipini sorabilmektedir. Aşağıdaki örnek için sadece dil seçeneğini seçeriz. Dil olarak türkçe seçmemiz önemlidir; çünkü sistemimiz türkçe'dir. Tabi bu duruma göre değişir. Türkçe'yi direk seçersek beraberinde US versiyonu da birlikte gelmektedir. Eğer EBS kurulumunda olduğu gibi US versiyonu Base installation'la birlikte gelmektedir. Yani default kurulumla birlikte gelir. Eğer Türkçeyi seçersek  yanında US versiyonunu da indirmek için soracaktır.


Burada da US versiyonunu indirmek için sormaktadır; çünkü öncesinde  versiyonu Türkçe olarak belirtmiştik.


Buradan her ikisini de indiririz.


Yukarıdaki resim de ise Oracle Database için nasıl patch indirilebileceğini görmekteyiz. Ürün olarak Oracle Database seçtikten sonra versiyonumuzu ve platformumuzu seçeriz. Sonrasında "Search"  diyip buna uygun patch'ler karşımıza çıkar


Karşımıza çıkan sonuçlardan istediğimizi seçip aşağıdaki örnekteki gibi indirip kurabiliriz.










27 Kasım 2013 Çarşamba

Oracle Veritabanı: SQL Çalışma Sırası - Problemli Sql İncelemesi - SQL Sequence - Analysing a SQL Statment - SQL Parsing

SQL incelemelerini yapmak için SQL'lerin nasıl işlendiğini bilmek gerekir. SQL işlenmesi 4 ana kısımdan oluşur.

SQL çalıştırılınca ilk aşamada parse edilir. Syntax kontrolü ve yetki  ve mantık kontrolü yapılır. Sorgu doğru yazılmış mı, sorgu doğru yazıldıysa sorgu da yer alan kaynaklara erişilebilinir mi, sorgu çalışabilir durumdaysa anlamlı bir ifade mi oluşturmuştur gibi sorular sorulabilinir. Bundan sonra olay sorgu içerisindeki kaynakların Shared Pool'da olup olmadığının aranmasıdır. Sorgunun arayacağı datalar shared pool'da varsa soft parse edilir. Daha önceden yoksa hard parse edilir. Execution plan'ı çıkarılır.  Sorgu eskiden bire bir şekilde çalıştırıldıysa direk cache'den çekilir. SQL sorgularımızda bind değişkenleri kullanırsak hard parse'lara gerek kalmaz.

Shared Pool içerisinde yer alan library cache ve sqlarea PL/SQL ve SQL ifadelerini saklamak içindir. Bir sorgu çalıştırıldığında ilk önce bu cache ortamı aranır.

Bind aşamasına gelindiğinde sorgu içerisinde bind değişkenleri aranır. Bu bind değişkenleri varsa ifadeye değerler atanır. Bu şekilde çalıştırılında sorgu soft parse edilir. Böylece kaynaklar daha az kullanılmış olur.

Execute ile sorgu için gerekli işlemler yapılmaya başlanır. Tablolar sorgulanır.

Fetch ile sonuçlar geri döndürülür. Düzenlenmesi gerekiyorsa düzenlenir.

Execution Plan Nedir?

Execution plan Oracle Optimizer tarafından belirlenen adımlar serisidir. SQL'ler çalıştırılırken işlemler sıralanır. Sorguda sıralama varsa Sort işlemi, başka bir tabloyla birleştirildiyse join işlemi bu plana eklenir. Bu planlardan sorunlar tespit edilebilinir. Eğer index  yerine full table scan yapılıyorsa, hint kullanılmıyorsa doğal olarak kaynaklar fazla kullanılıyor demektir.

Execution planına göre  çeşitli parametre değişiklikleri yapmamız gerekebilir. İndex yaratıp silmemiz gerekebilir. İstatistik toplamamız gerekip gerekmediğini görebiliriz.

Execution Plan'lerin Görüntülenmesi:

-"Explain Plan" komutu ile optimizer'ın kullanmayı seçtiği yolu görebiliriz. Explain Plan komutunda sorgu çalıştırılmaz; sadece optimizer seçebileceği yol gösterilir.

-V$SQL_PLAN view'ı ile çalıştırılan SQL komutlarının planlarını görebiliriz. Bir durum örneği vermemiz gerekirse ilk önce istenen SQL'in id'si bulunur. Oradaki SQL id V$SQL_PLAN içerisinde aranır ve orada seçilen operasyonlar görülür.

select prev_sql_id from v$session where sid =392;  
   
 select * from v$sql_plan where sql_id=(select prev_sql_id from v$session where sid =392);

V$SQL_PLAN'de gerçekten çalıştırılmış SQL gösterilir. EXPLAIN PLAN'de ise teorik olarak belirlenmiş bir SQL bulunur.

V$SQL_PLAN dışında incelenebilecek 2 tane daha önemli tablo bulunur. Bunlar V$SQL_PLAN_STATISTICS ve v$SQL_PLAN_STATISTICS_ALL'dur.  V$SQL_PLAN_STATISTICS_ALL view'ı V$SQL_PLAN,V$SQLPLA_STATISTICS ve V$SQL_WORKAREA tablolarının bileşiminden oluşur.
  
Problemli SQL İncelemesi:

Problemli SQL'leri incelerken önce bazı konulara dikkat etmemiz gerekir. Bunlara hızlıca bakmak iyi olur. Çünkü bunlar temel konulardır. SQL index'inin incelenmesi, SQL'lerde hint kullanılması, SQL sorgularının
biçimlendirilmesi gibi konular için inceleme yapmamız gerekir.

Problemli SQL'ler genelde çok kaynak tüketirler. Uzun parse sürelerine sahiptirler. CPU tüketimi fazladır. Fazladan wait'lere neden oluyordur. Çok fazla I/O yapıyorlardır. Kaynaklar bakımından sorgular AWR raporlarında listelenirler. Buradan hangi sorgularda değişiklik yapılabilineceği araştırılabilinir.

Sql'leri nasıl inceleyebiliriz? Eğer "Toad" programını kullanıyorsak, üst bardaki ambulans görüntülü tuşu incelemek istediğimiz SQL'i seçtikten sonra tıklayabiliriz. Sqlplus'ta çalıştırıyorsak "set autotrace=on" şeklide sorgumuzu çalıştırmadan önce ifademizi çalıştırmamız gerekir.

 Bu konuları eğer sıralarsak:

-Tablolar ve index'ler analiz edildi mi?

Index ve tabloların en son analiz edildiği zaman

-SQL Hint'leri kullanılmış mı?

SQL Hint'leri

-Cartesian Product kullanılmış mı?

Kartezyen çarpım bir sorgunun sırasında kullanıldıysa bu sorgu çok fazla kaynak harcamaktadır. Bu sorgunun tekrar düzenlenmesi gerekebilir. O yüzden buna dikkat edilmelidir.

-Full Table Scan mi kullanıyor?

Full Table Scan yapılması gereken zamanlarda sorgularımızı iyice incelememiz gerekir. Çünkü full table scan bayağı maliyetli olabilir. Eğer tablomuz çok küçükse, tablonun büyük bir kısmını sonuç olarak getiriyorsa full table scan iyi bir sorgulama yöntemiyken, tablo çok büyükse ve çok az bir sonuç için full table scan yapılıyorsa kötü bir sorgulama yöntemine dönüşür.

-Sorgu içerisinde kaç tablo join edilmiş?

Sorgu içerisinde join edilen tablolar arttıkça "Cost Based Optimizer" 'ın aralarından seçeceği yöntem sayısı artıyor. Seçenek artınca kullanılan zaman artıyor. Bu sorunu sorgumuzu "Explain Plan" ile test edip, sonuç olarak A-B-C-E-D şeklinde sıralama yaptıysa tespit edebiliriz. A-B-C-D-E şeklinde olsaydı kullanım daha başarılı olurdu. Bu sorunu hint kullanımı ile aşabiliriz ancak hint kullanımı önceden de belirttiğimiz gibi çok tercih edilmemektedir.

-Sorgu planı içerisinde "Remote" sözcüğü var mı?

Bunun anlamı sorgunun sonuçlarının çekilmesi için uzak bir veritabanı bağlantısı yapılmakta; yani dblink kullanılıyor olabilmektedir. Bu durum doğal olarak sonuçların gelmesini geciktirebilir.

-Trigger bulunan bir tabloya DML ifadelerimi uygulanmakta?

Bu soru sorgunun performansını çok ilgilendirmektedir; çünkü her bir DML ifadesinde(Insert,Update,Delete) sorgu her çalıştığında trigger'ı da tetikleyeceği için zaman kaybına neden olacaktır.

 SELECT *  
 FROM  dba_triggers  
 WHERE table_name = 'tablo_adı';

-INSERT/UPDATE/DELETE yavaşlığı:

Bu durum ise ancak sorguların birbirini lock'lamasıyla oluşabilir. Eskiden çok kısa süren DML işlemleri şimdi çok uzun sürüyorsa eğer sistemdeki "lock"'lar araştırılmalıdır. Aşağıdaki 2 sorgu bu konuda bize yardımcı olabilir.

Bu sorgu bize sistemdeki kilitli durumları verir:

Bu sorguda işletim sistemi kullanıcısını parametre olarak vermek yeterlidir. Client PID veya Server PID'de sorup bu sorguyu daha detaylı hale getirebiliriz.

 SELECT  s.osuser  
 ,  s.process  
 ,  p.spid  
 ,  s.username  
 ,  decode (s.status,'INACTIVE','I'  
   ,  'ACTIVE' ,'A'  
   ,  'KILLED','K'  
   ,  s.status)  status  
 ,  w.event  
 ,  w.wait_time  
 ,  t.sql_text  
 FROM  sys.v_$session s  
 JOIN  sys.v_$process p ON (p.addr = s.paddr)  
 LEFT OUTER JOIN  
   sys.v_$session_wait w ON (w.sid = s.sid)  
 LEFT OUTER JOIN  
   sys.v_$sqltext t  
   ON (  
     t.address = s.sql_address  
   AND  t.hash_value = s.sql_hash_value  
   )  
 WHERE  p.background IS NULL  
 AND  s.audsid != userenv('SESSIONID')  
 AND  (  
     upper(s.osuser) like upper('&response')  
   OR  s.process = '&response'  
   )  
 AND  (  
     p.username = 'oracle'  
   OR  p.username = s.osuser  
   )  
 UNION ALL  
 SELECT  s.osuser  
 ,  s.process  
 ,  p.spid  
 ,  s.username  
 ,  decode (s.status,'INACTIVE','I'  
   ,  'ACTIVE' ,'A'  
   ,  'KILLED','K'  
   ,  s.status)  status  
 ,  w.event  
 ,  w.wait_time  
 ,  t.sql_text  
 FROM  sys.v_$process p  
 JOIN  sys.v_$session s ON (p.addr = s.paddr)  
 LEFT OUTER JOIN  
   sys.v_$session_wait w ON (w.sid = s.sid)  
 LEFT OUTER JOIN  
   sys.v_$sqltext t  
   ON (  
     t.address = s.sql_address  
   AND  t.hash_value = s.sql_hash_value  
   )  
 WHERE  p.background IS NULL  
 AND  s.audsid != userenv('SESSIONID')  
 AND  p.spid = '&response'  
 AND  (  
     p.username = 'oracle'  
   OR  p.username = s.osuser  
   )  
 ORDER BY 1,2,3  
 /  

Buradaki sorgu ise bekleyen ve bekleten kullanıları ve bekleme tiplerini listelemektedir.

 SELECT waitsess.osuser || '(' || waiter.sid || ')' waiter,  
   waiter.type,  
   case waiter.request  
     when 0 then null  
     when 1 then null  
     when 2 then 'row-S'  
     when 3 then 'row-X'  
     when 4 then 'share'  
     when 5 then 'sRowX'  
     when 6 then 'excl'  
   end req,  
   holdsess.osuser || '(' || holder.sid || ')' holder,  
   case holder.lmode  
     when 0 then null  
     when 1 then null  
     when 2 then 'row-S'  
     when 3 then 'row-X'  
     when 4 then 'share'  
     when 5 then 'sRowX'  
     when 6 then 'excl'  
   end held,  
   nvl(obj.object_name, waiter.id1 || ',' || waiter.id2) object  
 FROM sys.v_$lock holder  
 JOIN sys.v_$lock waiter  
   ON (  
     holder.id1 = waiter.id1  
   AND  holder.id2 = waiter.id2  
   AND  holder.type = waiter.type  
   )  
 JOIN sys.v_$session holdsess  
   ON (holdsess.sid = holder.sid)  
 JOIN sys.v_$session waitsess  
   ON (waitsess.sid = waiter.sid)  
 LEFT OUTER JOIN sys.v_$lock tmhold  
   ON (tmhold.type = 'TM' and tmhold.sid = holder.sid)  
 LEFT OUTER JOIN sys.v_$lock tmwait  
   ON (tmwait.type = 'TM'  
   AND tmwait.sid = waiter.sid)  
 LEFT OUTER JOIN dba_objects obj  
   ON (obj.object_id = tmwait.id1)  
 WHERE holder.request = 0  
 AND holder.block = 1  
 AND waiter.request > 0  
 AND nvl(tmhold.id1,0) = nvl(tmwait.id1, 0)  
 /  






Oracle Veritabanı: Oracle Error ORA-01950 No Privileges On Tablespace

Ora-01950 hatasını yeni bir tablespace yaratıp sonrasında içerisinde bir object yaratmak istediğimde aldım. Tablespace talebi sonrasında karşılaştığım bu sorun ertesinde bu tablespace'i kullanan default bir user olmadan genel kullanıcımızla ilgili bir yetki sorunu olabileceğini düşündüm. Yani ilgili tablespace üzerinde apps kullanıcımla yani E-Business Suite'deki en güçlü kullanıcıyla bir tablo yaratmak istediğimde bu sorunu aldım.

Bu sorunu gidermek için de yeni yaratılmış bu tablespace üzerinde apps kullanıcıma aşağıdaki yetkileri verip bu sorunu hallettim.

 ALTER USER apps UNLIMITED QUOTA ON tablespace_adı  
    
 GRANT UNLIMITED TABLESPACE TO apps;  




Oracle Veritabanı: Oracle Error ORA-01918 User Name Does Not Exist

Bu hatayı bir tablespace içerisinde bir object yaratmaya çalıştığım zaman aldım. Ancak bu işlemi yapmaya çalıştığım zaman kullanıcımın schema'sını göremeyip bu hatayı verdi.

Bu sorunun çözümü için ilk olarak gerçekten doğru olarak kullanıcıyı yazıp yazmadığımızı kontrol etmemiz gerekir.

 SELECT * FROM ALL_USERS;  

Eğer yukarıdaki sorgumuzda kullanıcımızı görüyorsak ve daha önceden de buna bağlı tablespace'i yarattıysak şimdi kullanıcımızın gerekli hakları olup olmadığını kontrol etmemiz gerekir.

 SELECT * FROM DBA_ROLES; 

Ayrıca aşağıdaki object'lere de bakmamız gerekebilir. Ayrıcalıklar için en çok sorgulanan object'ler bunlardır.

 dba_role_privs  
 dba_sys_privs  
 dba_tab_privs  

Buralarda gerekli yetkilerin varlığını sorgulayabiliriz. Bunlar için de en önemlileri "connect" ve "resource" yetkileridir. Burada yetkilerini sorguladığımız kullanıcı tablespace içerisinde object yaratmaya çalışan kullanıcıdır.

Sonuç olarak yukarıdaki hatayı aldığımızda ilk önce kullanıcının varlığı ve buna bağlı olarak schema'nın varlığını kontrol ederiz. Ertesinde de o schema üzerinde object yaratabilme yetkilerimizi sorgularız. Bu işlemlerin sonucuna göre aksiyon alabiliriz.



25 Kasım 2013 Pazartesi

Oracle Veritabanı: Hints - Hint'ler - Hint Kullanımı

Aşağıdaki doküman bize hint'lerle ilgili bilgiler vermektedir. Bazı sorgularda "hint" kullanımını görebiliriz. Bu kullanım bazen kullanılan SQL'lerin yavaş çalışmasına neden olabilirken bazen de amacına uygun çalışabilmektedir. Oracle tarafından tavsiye edilen ise bu hint'lerin mümkün olan en az şekilde kullanılmasıdır.

Genel Kullanım Syntax'ı

select /*+ hint_adı */ kolon_adı from tablo_adı 


HintPurposeUse when...
Hints for Access Methods
FULL(tab)Force a Full Table Scan on tab.Used to stop Oracle from performing an index scan.
ROWID(tab)Force a table access by Rowid on tabGiven an equals condition on a rowid, Oracle will alwayse use it. This hint is used to force a Rowid Range scan on tab.
CLUSTER(tab)Force a cluster scan on tabThis would be rare. A cluster scan is pretty good, so Oracle will normally select it automatically. If it doesn't, this hint will force a cluster scan.
HASH(tab)Force a hash access on tab if tab is hash clustered.Typically an equals predicate on a hash clustered table will always use hash access, unless the table is very small indeed. This hint may be required if accessing a hash clustered table via an IN list, or an IN subquery
INDEX(tab [ ind ...])Force an index scan on table tabSpecifying just the table name (or alias) is the preferred method of stopping a Full Table Scan. If the statistics are calculated against the tables and indexes, Oracle should choose the best available index. The second form is dangerous, as it assumes the name of the index to be used will not change. Only use it if there are many indexes and Oracle will not choose the right one. Better yet, use NO_INDEX to disable the index you want to avoid.
If you supply multiple indexes, Oracle will usually choose the best one from the list specified. Beware though that you don't fall into the AND-EQUAL trap.
INDEX_COMBINE(tab [ ind ...])Forces a bitmap index access path on tabPrimarily this hint just tells Oracle to use the bitmap indexes on table tab. Otherwise Oracle will choose the best combination of indexes it can think of based on the statistics. If it is ignoring a bitmap index that you think would be helpful, you may specify that index plus all of the others taht you want to be used. Note that this does not force the use of those indexes, Oracle will still make cost based choices.
INDEX_JOIN(tab [ ind ...])Use the Index Join technique to avoid a table access.All columns in your SQL for a given table are contained in two or more indexes. Oracle can merge the indexes to avoid a table lookup. If there are different possible combinations of indexes that could be used, specify the index names as well if there is a particular combination that would be faster.
INDEX_DESC(tab [ ind ...])Same as the INDEX hint, except process range scans in descending orderUse this hint if you are using an index to sort rows instead of an ORDER BY.
INDEX_FFS(tab [ ind ...])Forces a Fast Full Scan on one of tab's indexesIf all columns required for a SQL reside in one index, then a Fast Full Scan may be used instead of a Full Table Scan to avoid a table access.
NO_INDEX(tab [ ind ...])Forces Oracle to ignore indexesUsed with just the table name (or alias), Oracle will ignore all indexes on that table. This is equivalent to a FULL hint unless the table is clustered. If index names are specified, they will not be used. If Oracle has two indexes to choose from, this could be used to disable an index, instead of using the INDEX hint to force the use of the other index.
AND_EQUAL(tab ind ind [ ind...])Forces Oracle to scan all nominated single column indexes used in AND col = ... predicatesDon't use this. You will probably never come across a good implementation of this technique. See the AND-EQUAL trap.
USE_CONCATExpand OR predicates or IN lists into UNIONsEach predicate in the list of ORs can individually use and index, and collectively the ORs return less than 4% of the table. Also useful in a join query where each of the OR predicates is indexed and on a different table.
NO_EXPANDStops Oracle from expanding ORs and IN lists into UNIONs. See USE_CONCAT.If in Explain Plan you see that Oracle is expanding ORs or IN lists into UNIONs, and you think a full table scan would be faster because the UNIONs collectively return more than 4% of the table, then use this hint to check it out.
REWRITE([view ...])Forces Oracle to resolve the query using a meterialized view instead of the tables in the FROM clause.Use when the materialized view resolves the same joins or aggregates as are used in the query.
NO_REWRITEForces Oracle to stop using query rewrite.Use when the session or database parameter QUERY_REWRITE_ENABLED is set to true, but you want to avoid using the materiazed view because it may be out of date.
Hints for Join Orders
ORDEREDJoin the tables in the FROM clause in the order they are specifiedUse if Oracle is joining table in the wrong order. Can also be used to encourage Oracle to use a non-correlated WHERE col IN sub-query as the driving table in a SELECT and then join back to the outer table. If you just want to suggest the best table to lead the join, try the LEADING hint instead.
STARForces Oracle to use a star query plan.Avoid using this. Star queries are deprecated in favour of STAR_TRANSFORMATION which uses bitmap indexes in favour of cartesian joins. See Star Query.
Hints for Join Operations
USE_NL(tab [tab..])Use a Nested Loops joinUse when Oracle is using a Hash or Sort Merge join (high volume SQLs), and you want it to use a Nested Loops join (low volume SQLs). Older versions of Oracle required this hint to be used in conjunction with the ORDERED hint. This is still advisable to avoid unexpected results.
USE_MERGE(tab [tab..])Use a Sort-Merge join on tabUse when Oracle is using a Nested Loops join, and you have a high volume join using range predicates. Older versions of Oracle required this hint to be used in conjunction with the ORDERED hint. This is still advisable to avoid unexpected results.
USE_HASH(tab [tab..])Use a Hash join on tabUse when Oracle is using a Nested Loops or Merge join, and you have a high volume join using equals predicates. Older versions of Oracle required this hint to be used in conjunction with the ORDERED hint. This is still advisable to avoid unexpected results.
DRIVING_SITE(tab)Forces Oracle to evaluate a join involving a remote table on the remote table's database.Firstly, try not to join to remote tables. If you must, use this hint when you are joining a local table to a remote table, and the local table is smaller. See Remote Table.
LEADING(tab)Forces tab to be the leading table in a joinUse instead of the ORDERED hint if you only want to suggest the best starting table. Oracle can have trouble choosing a leading table if there a two of more in the SQL with non-indexed WHERE clauses.
HASH_AJUse a Hash Anti-Join to evaluate a NOT IN sun-query.Use this when your high volume NOT IN sub-query is using a FILTER or NESTED LOOPS join. See High Volumne Nested Loops Joins. Check Explain Plan to ensure that it shows HASH JOIN (ANTI). Try MERGE_AJ if HASH_AJ refuses to work.
The HASH_AJ hint is sepcified from within the sub-query, not in the main SQL statement.
MERGE_AJUse a Merge Anti-Join to evaluate a NOT IN sun-query.Use this when HASH_AJ does not work. MERGE_AJ will probably not work either, but it's worth a try.
HASH_SJUse a Hash Semi-Join to evaluate a correlated EXISTS sub-query.Use this when you have a high volume outer query, and a correlated single table sub-query with equals joins back to the outer query, and no DISTINCT / GROUP BY clause. Check Explain Plan to ensure that it shows HASH JOIN (SEMI). Try MERGE_SJ if HASH_SJ refuses to work.
The HASH_SJ hint is sepcified from within the sub-query, not in the main SQL statement.
MERGE_SJUse a Merge Semi-Join to evaluate a correlated EXISTS sub-query.Use this when HASH_SJ does not work. MERGE_SJ will probably not work either, but it's worth a try.
Hints for Parallel Execution
Parallel Query hints have been deliberately omitted because they are a lazy way to tune and wreak havoc for DBAs if over-used. Speak to your DBA about using parallel query.
Additional Hints
APPENDDirect Path InsertUse Direct Path data load to append inserted rows to the end of the table, rather than searching for free space in previously used data blocks.
CACHECache blocks from Full Table ScanUsually Full Table Scans will not bump other blocks out of cache, the theory being that they probably won't be used again. Use this hint if you are going to perform another Full Table Scan on the same table straight away.
NO_CACHEDo not cache blocks from a Full Table ScanThis is the default behaviour, so you should never need it. Perhaps if the CACHE hint were hard coded into a view, the NO_CACHE hint on a select from the view would override it. Just guessing.
MERGEEnables Complex View MergingUse when you join to a view that contains a GROUP BY or DISTINCT. See Selecting from Views
NO_MERGEDisable Complex View MergingComplex View Merging is a good thing. Don't use this hint unless you are curious to see how much faster complex view merging can be.
UNNESTA global panacea for badly written sub-queries. Can be used in place of Anti-joins and Semi-joins if you are not really sure what you're doing.If you can't get your sub-query to stop using a FILTER step, try UNNEST. It uses internal cleverness to rewrite your query.
NO_UNNESTForces Oracle not to Unnest sub-queries.If UNEST_SUBQUERY initialisation parameter is set, Oracle will automatically try to unnest sub-queries. Use this hint to stop it from doing that for a particular sub-query.
PUSH_PRED(view)Push a join predicate between a view (or inline view) and a table into the view.Use with a Nested Loop join to a view when the view is the outer (2nd) table in the join. The join condition will be pushed into the view, potentially enabling an index use. See Selecting from Views.
NO_PUSH_PRED(view)Stop Oracle from pushing join predicates.Pushing Join Predicates is a good thing - don't use this hint.
PUSH_SUBQForce Oracle to evaluate sub-query before other non-indexed predicates.Use this if you have lots of non-indexed predicates, most of which almost always come out true, and a non-merged sub-query that reduces the number of rows significantly. The performance benefit will only be noticeable over larger data volumes. Over those volumes you will probably be better off merging the sub-query (see the UNNEST hint).
STAR_TRANSFORMATIONUse bitmap indexes for a Star Transformation execution path.Use this when joining a fact table with bitmap indexes to dimension tables keyed by those bitmap indexed columns. See Star Query.
ORDERED_PREDICATESExecute the non-indexed non-join predicates in the order in which they are supplied.If one predicate eliminates a row for a query, Oracle does not evaluate the others. If you order your predicates with the ones most likely to fail first, then this hint can reduce the total number of predicates evaluated. Also see PUSH_SUBQ.

Oracle Veritabanı: Index ve Tablo'ların En Son Analiz Edildiği Zamanın Bulunması - When Were Tables and Indexes Analyzed?

Tabloların ve Index'lerin ne zaman analiz edildiğinin bulunmasıı için aşağıdaki scriptleri kullanabiliriz. Bu scriptlerde incelenen object'ler veritabanındaki bütün object'ler olacağı için sorgu içerisinde where koşulunda object_name de sokulmalıdır. Tablolalar için table_name, Index'ler için de index_name şeklinde kullanılacak scriptlere eklemeler yapılabilinir.

Tabloların Ne Zaman Analiz Edildiğinin Bulunması:

 select owner,table_name,last_analyzed, global_stats  
 from dba_tables  
 where owner not in (‘SYS’,'SYSTEM’)  
 order by owner,table_name;  

Partitioned Tabloların Ne Zaman Analiz Edildiğinin Bulunması:

 select table_owner, table_name, partition_name, last_analyzed, global_stats  
 from dba_tab_partitions  
 where table_owner not in (‘SYS’,'SYSTEM’)  
 order by table_owner,table_name, partition_name; 

Index'lerin Ne Zaman Analiz Edildiğinin Bulunması:


 select owner, index_name, last_analyzed, global_stats  
 from dba_indexes  
 where owner not in (‘SYS’,'SYSTEM’)  
 order by owner, index_name;

Partitioned Index'lerin Ne Zaman Analiz Edildiğinin Bulunması:


 select index_owner, index_name, partition_name, last_analyzed, global_stats  
 from dba_ind_partitions  
 where index_owner not in (‘SYS’,'SYSTEM’)  
 order by index_owner, index_name, partition_name;  

Veritabanı için İstatistikler En Son Ne Zaman Toplandı?:

select dbms_stats.get_stats_history_availability from dual; 


Oracle Veritabanı: Trcsess Aracı - Trcsess Tool

Trcsess aracı ile trace dosyaları belirli kriterlere göre birleştirilir. Trace dosyaları olarak belirttiğimiz dosyalar, session üzerindeki aktiviteyi gözlemleyip loglarını tutan dosyalardır. Bu trace'lerdeki bilgiler performans sorunlarını gözlemlememiz için ve bunların çözümünü bulmamız için büyük bir önem taşımaktadır. Ancak bu trace dosyaları session'ların farklı farklı zamanlarını tuttukları için bize veritabanının genel resmini göstermezler.

Trcsess tool'u ile veritabanındaki aktiviteleri daha kompakt ve birleşik şekilde görebiliriz. Bu birleştirme işini de belirli kriterlere göre hallederiz. Bu kriterler:

-Session_id (Session_id nasıl bulunur?)
-Client_id
-Service
-Action
-Module

Genel Syntax:

 trcsess [output=output_file_name]  
 [session=session_Id]  
 [clientid=client_Id]  
 [service=service_name]  
 [action=action_name]  
 [module=module_name]  
 [trace_files]  

Output: Bizim çıktımız olacak.
Session: İlgili session ile bilgileri toparlar.
Clientid: İlgili client ile trace bilgileri sıralar.
Service: İlgili servis bilgilerini ayırır.
Action: İlgil aksiyonları gruplar.
Module: Modülleri gruplar.
Trace_files: Bununla da gerekli trace dosyaları listelenir.

Trcsess Örneği:

İlk olarak trace dosyalarını birleştiririz.

 trcsess output=abc.trc service=XXX *.trc  

Service ismi olarak XXX kullanılan bütün trace dosyaları toplanılıp tek bir "abc.trc" adlı dosyasına konur.

Bu birleştirme işlemi ertesinde tkprof komutumuz ile bu dosyadan okunabilir tek bir dosya oluşturabiliriz.

 tkprof abc.trc abcd.trc  

Burada dikkat edilmesi gereken konu eğer bu işlemlerin öncesinde trace enabled edilmediyse pek bir bilgi bulunamayacağıdır.

Trace Session Bazında Nasıl Açılır?


 alter session set enable_trace=true;  


Session'ın Yazdığı Trace Dosyası Nasıl Bulunur? 


 select tracefile from v$session join v$process on (addr=paddr) and sys_context('userenv','sessionid')=audsid ;


22 Kasım 2013 Cuma

Oracle Veritabanı: Tkprof - TK*Prof Nedir? - Nasıl Kullanılır?

TK*Prof Oracle tabanlı bir istatistik gösterme aracıdır. Üretilen trace dosyalarından tkprof aracıyla .prf uzantılı dosyalar yaratılır. .trc uzantılı dosyalar anlaşılamayacak yapılarda üretilirken tkprof aracıyla bunlar okunabilir hale getirilirler.

Trace Dosyalarının Bulunması:

Bütün trace dosyaları aynı yere yazılmaktadır. Bu lokasyonu bulmak için aşağıdaki sorguyu kullanabiliriz.

 SELECT value  
 FROM sys.v_$parameter  
 WHERE name = 'user_dump_dest'  

Bu sorgunun sonucunda çıkan lokasyona gidilerek "ls -lrt" komutunu çekerek en güncel dosyayı buluruz.

TK*Prof Çalıştırılması:

tkprof trace_dosyasının_ismi çıktı_ismi [explain=kullanıcı/sifre@veritabanı]

Örnek:

 tkprof XXX_ora_24772664.trc abc explain=apps/apps@XXX 

Böylece trace dosyası içerisindeki bütün SQL'ler explain plan çıkartılır.




TK*Prof Çıktı Dosyası:

Her SQL için "Elapsed" yani sorgu için geçirel zamana bakılabilinir. Çok büyük değerler, uzun süren SQL'leri belirtir.

Disk ve Query  ifadelerine göre eğer Disk için Query'e göre daha büyük bir değer çıkıyorsa Disk'e erişim fazla olduğu sonucu çıkartılabilinir. Eğer Disk az,Query çoksa bu sefer de Query ile ilgili bir sorun düşünülebilinir.


Oracle E-Business Suite: Finding OPP Log - OPP Logunun Bulunması

Eğer bir concurrent program OPP servislerine bağlı bir hata alırsa, ya da xml publisher ile ilgili bir sorun yaşarsa, sorun yaşanan concurrent'ın request_id'sini alıp aşağıdaki SQL'de request_id istenen yere koyarak o concurrent'ın neden sorun  yaşadığına dair bir bilgi edinebiliriz.


 SELECT fcpp.concurrent_request_id req_id, fcp.node_name, fcp.logfile_name  
  FROM fnd_conc_pp_actions fcpp, fnd_concurrent_processes fcp  
  WHERE fcpp.processor_id = fcp.concurrent_process_id  
   AND fcpp.action_type = 6  
   AND fcpp.concurrent_request_id = &request_id;  

Buradaki SQL'in kullanımı dışında direk concurrent'ın log dosyasını bulmak için application'a bağlanılır. System Administrator>Concurrent:Manager>Administration seçilir. Buradan Output Post Processor seçilir ve Processs düğmesine basılır. Request'in çalıştığı andaki Concurrent Process seçilir ve Manager Log düğmesine basılarak o process'in OPP(output post processor) dosyasını bulabiliriz.








Oracle E-Business Suite: Idle Kullanıcıların Kesilmesi - Killing Idle Sniped Users, Connections

Bazı kullanıcılar application'a bağlanıp işlerini bitirdikten sonra browser'larını ya da bulundukları session'ı kapamayıp, öylece bırakırlar. Bunlar sistemden kaynak kullandıkları için bunların bulunması ve eğer iş çalıştırmıyorlarsa kill edilmesi gerekir.

Session'ların durumunu aşağıdaki gibi ayırabiliriz.

-O anda SQL çalıştırılıyorsa - ACTIVE
-Inactive session client tarafında bekletiliyorsa - SNIPED
-Herhangi bir SQL çalıştırmadan sisteme bağlı bekleniyorsa - INACTIVE
-Eğer session cache'e alındıysa - CACHED


Yukarıdaki tanımlara göre hangi session'ların ne kadar süre sonra "SNIPED" olarak ifade edilmesi gerektiğini bir parametreyi değiştirerek karar verebiliriz.

alter profile DEFAULT set idle_time=120;  

Yukarıdaki parametre sayesinde 2 saat sonunda idle session'lar sniped olarak işaretlenir. Aşağıdaki SQL ile  sniped session'ları bulup kill eden sorguları üretebiliriz.

 SELECT DECODE(TRUNC(SYSDATE - LOGON_TIME), 0, NULL, TRUNC(SYSDATE - LOGON_TIME) || ' Days' || ' + ') || TO_CHAR(TO_DATE(TRUNC(MOD(SYSDATE-LOGON_TIME,1) * 86400), 'SSSSS'), 'HH24:MI:SS') LOGON, SID, v$session.SERIAL#, v$process.SPID UNIX_PROCESS, v$session.USERNAME, STATUS, OSUSER, MACHINE, v$session.PROGRAM, MODULE, 'alter system kill session ' || '''' || SID || ', ' || v$session.serial# || '''' || ' immediate;' kill_sql FROM v$session, v$process   
 WHERE ((v$session.paddr = v$process.addr) AND (status = 'SNIPED'))   
 ORDER BY logon_time ASC;  
   

Buradaki prosedüre ile de yine istediğimizde bu takılı kalmış session'ları bulup bunları kill edebiliriz.

DECLARE  
   a    v$session.SID%TYPE;  
   b    v$session.serial#%TYPE;  
   cur   INTEGER;  
   ret   INTEGER;  
   STRING  VARCHAR2 (100);  
   
   CURSOR mycursor  
  IS  
    SELECT SID, serial#  
     FROM v$session  
     WHERE status = 'SNIPED';  
 BEGIN  
   OPEN mycursor;  
   
   LOOP  
    FETCH mycursor  
     INTO a, b;  
   
    EXIT WHEN mycursor%NOTFOUND;  
    STRING :=  
       'alter system disconnect session '  
      || ''''  
      || TO_CHAR (a)  
      || ','  
      || TO_CHAR (b)  
      || ''''  
      || ' immediate';  
   
    BEGIN  
      cur := DBMS_SQL.open_cursor;  
      DBMS_SQL.parse (cur, STRING, DBMS_SQL.v7);  
      ret := DBMS_SQL.EXECUTE (cur);  
      DBMS_SQL.close_cursor (cur);  
      DBMS_OUTPUT.put_line ('SID:' || a || ' is killed.');  
    EXCEPTION  
      WHEN OTHERS  
      THEN  
       IF DBMS_SQL.is_open (cur)  
       THEN  
         DBMS_SQL.close_cursor (cur);  
       END IF;  
    END;  
   END LOOP;  
   
   CLOSE mycursor;  
 END;  
 /  












21 Kasım 2013 Perşembe

Oracle E-Business Suite: Workflow Tabloları - Workflow Tables

WF_ACTIVITIES: bu tablo aktivitelerin tanımını içerir. Bu aktiviteler  "folder", "notice", "function", "process", "event"'lerden herhangi birisi olabilir.

WF_ITEMS: Sistemdeki herhangi bir workflow item'ı buradaki tabloya yazdırılır.

WF_ITEM_ATTRIBUTES: Bu tablo process'ler içerisindeki attribute'leri ve tanımlarını belirtir. 

WF_NOTIFICATIONS: Gönderilen mesajlarla ilgili bilgileri içermektedir. Her gönderilen mesaj için bir satır oluşturulmaktadır.

Buradaki sorguyla bir mailin hiç yaratılıp, gönderilip, gönderilmediği bulunabilinir. Eğer burada değilse workflow process'ine bakılmalıdır. 

select recipient_role,notification_id,status,mail_status from wf_notifications where recipient_role like '&user_name';

Bir email notification'ı ancak Notification Status'u "Open" veya "Cancelled" ise Notification mail_status'u de "Mail","Sent","Failed" veya "Invalid"olursa gönderilir. 

Workflow Log File:

Aşağıdaki sorguyla workflow notifications ile ilgili log dosyasını bulabiliriz.

SELECT fcp.logfile_name  
  FROM apps.fnd_concurrent_queues fcq,  
     apps.fnd_concurrent_processes fcp,  
     apps.fnd_lookups flkup  
 WHERE     
 concurrent_queue_name IN ('WFMLRSVC')    AND --Workflow concurrent manager'ı  
 fcq.concurrent_queue_id = fcp.concurrent_queue_id    AND  
 fcq.application_id = fcp.queue_application_id  
     AND flkup.lookup_code = fcp.process_status_code  
    -- AND lookup_type = 'CP_PROCESS_STATUS_CODE'  
     AND meaning = 'Active'; 


Workflow Notification ile İlgili Sorunlar:

-"recipient_role"'un  email'i alabilmesi için "notification preference"'ı 'query','disabled','summary','sumhtml''e set edilmemiş olmalıdır ve "recipient"'ın gerçek bir email adresi olmalıdır.

 SELECT email_address, nvl(WF_PREF.get_pref(name, 'MAILTYPE'), notification_preference)   
 FROM wf_roles   
 WHERE name = '&recipient_role';  

-Burada belirtilen Workflow servisleri kontrol edilmelidir. Workflow'larla ilgili çalışan agent'lar buradaki gibidir.

Workflow Deferred Agent Listener
Workflow Deferred Notification Agent Listener
Notification Mailer

Bu servislerin açıp kapalı olduğunu aşağıdaki gibi kontrol edebiliriz.

  select * from apps.fnd_svc_components    
  where component_name like '%Workflow%';   







Oracle E-Business Suite: Daily Checklist - Günlük ve Genel Kontrol

Burada Oracle E-Business Suite için günlük yaptığımız kontrollerin script halini yazmaktayız. Amacımız bu işleri otomatik hale getirmek için  aşağıdaki script'i kullanabiliriz.

Script:
Güne başlarken ya da bir sorun anında bu kontrollerle başlayabiliriz. Belli başlı olayların ve servislerin ne durumda olduğunu bu şekilde görebiliriz.

Bu script ile yapılan kontroller:

-Workflow Mailer Servislerinin Kontrolü
-Concurrent Manager Kontrolü
-Application Listener Kontrolü
-OAFM, FORMS ve OACORE Servis Kontrolleri


 #!/bin/bash  
 echo "Application Listener Control";  
 adalnctl.sh status;  
 echo "Genel Olarak Servislerin Kontrolü";  
 adapcctl.sh status;  
 echo "Concurrent Manager Kontrolü";  
 adcmctl.sh status apps/apps;  
   
 echo "Workflow Mailer Component'lerinin Kontrolü"  
 sqlplus -S apps/apps << EOF  
 set linesize 200  
   
  select component_name,component_status from apps.fnd_svc_components  
  where component_name like '%Workflow%';  
 exit;  
 EOF  

Applications Usage:
Script dışında kontrol edeceğimiz diğer konular sayfalara erişimlerdir. Aşağıdaki yazımızda sayfalara erişimin nasıl izlendiğini görebiliriz.
http://berkeoz1.blogspot.com/2013/12/oracle-e-business-suite-sayfalara.html

Buradaki bilgilerle hangi kullanıcının nereye girdiği, ne kadar iş yaptığı, hangi işlemleri yaptığı bulunabilinir.

System Alerts:
Bu sayfada karşılaşılan kritik hatalarla ilgili notlar yer alır. Gözümüzden bir şey kaçmaması amacıyla veya tekrar eden sorunları görmek için bu sayfaya bakabiliriz.

System Alerts sayfasına "System Administrator"  sorumluluğuna girip  "Oracle Applications Manager" Menüsü altında "System Alerts" seçeneğine tıklayaraktan gidebiliriz.

System Alerts'in açık olabilmesi Site, Application, User veya Java System Property Settings'den biri ya da hepsinin izlenmesi gerekir. Bunun içinde aşağıda gösterilen seçeneğin açık olması gerekir.


Yukarıda görülen "Site" seçeneğinin altında "Log Enabled" seçeneği bulunmaktadır. Yukarıdakilerden herhangi birisini açsak bile Site altındaki "Log Enabled" açık değilse diğerleri çalışmaz. Bunu açtıktan sonra sistemdeki hatalar veya daha fazlası toplanabilinir. Buradan loglar ayaralandıktan sonra yine "System Administrator" sorumluluğu "Oracle Applications Manager" altından "Logs" fonksiyonu ile loglar indirilebilinir.


Linux / Unix: Shell Scripting For Loops - For Döngüleri


Bu yazımızda daha önceden bahsettiğimiz While döngülerine ve If/Else koşullarına ek olarak For döngülerini işleyeceğiz.

For döngülerinde belirli bir işin sınırlı bir sayıda tekrar edilmesi sağlanır.  Temel syntax aşağıdaki gibidir.

 for degisken in {1..N}  
 do  
      komut  
 done  

1'den 10'a yazdıran örnek aşağıdaki gibidir.

for x in {1..10}  
  do  
   echo $x  
  done  


Peki döngümüze bir artış miktarı koymamız için ne yapmamız gerekir? Bunun için son bash versiyonuna ihtiyacımız lazım. Yani ${BASH_VERSION} parametresi v4.0+ olmalıdır.

 for x in {1..10..2}  
  do  
   echo $x  
  done  

Bu for örneğimizde  ise bir klasöre yazdırdığımız dosya adlarını terminale  bastırırız. Örnekte asıl vurgulamak istediğimiz şey " ` " işaretinin kullanımıdır. Ayrıca bir dosya içerisindeki verilerin alınıp satır satır incelenmesidir.

 ls > abc.log  
 for x in `cat abc.log`  
 do  
 echo "Bu dosyanin adi:" $x  
 done  


Bu durumda abc.log adlı dosyamızın adı :

 >more abc.log   
 Mail  
 a.sh  
 abc.html  
 abc.log  
 adstats.sql  
 awrrpt.html  
 control_scripts  
 core  
 oradiag_oracle  
 profile.11g.db  
 smit.log  
 smit.script  
 smit.transaction  
 tdpoerror.log  

20 Kasım 2013 Çarşamba

Linux / Unix: Shell Scripting While Conditions - While Koşulları

Önceki yazımızda If/Else koşulunu incelemiştik. Bu yazımızda da While yapısını inceleyeceğiz.  While yapısında içerideki kodlar tekrar tekrar çalıştırılabilinir. Genel syntax'ı aşağıdaki gibidir.

 while [ koşul ]  
 do  
   komutlar  
 done  


Burada sonsuz döngü oluşması için içerideki koşulun asla yanlış hale gelmemesi gerekir. İçerideki koşul herhangi bir boolean ifade yani doğru veya yanlış bir ifade olabilir.

Buradaki örnekte 1'den 5'e  kadar sayıları yazdırırız.:

 #!/bin/bash  
 x=1  
 while [ $x -le 5 ]  
 do  
  echo " $x "  
  x=$(( $x + 1 ))  
 done 


Aşağıdaki örneğimizde de faktoriyel hesabı yaptırmaktayız. Bu örnekte sayac'ımızı dışardan vermekteyiz. Yani bu programı "abc.sh" olarak kaydedip "chmod 777 abc.sh" olarak yetkilerini verdikten sonra    "./abc.sh 5" şeklinde çalıştırdığımızda bize 5 faktoriyelin cevabını verir.

 #!/bin/bash
 x=$1  #Sayac
 a=1
 echo $x;
 while [ $x -gt 0 ]
 do
   a=$(( $a * $x ))
   x=$(( $x - 1 ))
 done
 echo $a

Continue İfadesi:

While döngülerinde continue ifadesi bir sonraki iterasyona geçmek için kullanılır. Yani örnek olarak sayacımız 10'dan geriye sayarken 5'te atlamasını istiyorsak, 5 bizim için istisna bir değerse, if deyip değerimiz 5'e geldiğinde atlamasını isteyebiliriz.

Continue syntax'ı aşağıdaki gibidir.


while [ koşul ]  
 do  
  ifadeler 
  if (koşul)  #Örnek olarak x=5 ise
  then  
      continue  
  fi  
  ifadeler
 done  

Break İfadesi:

Break ifadesi bizi direk döngüden çıkaran bir ifadedir. Yani yukarıdaki örneğimizdeki döngüde "continue"  bizi bir iterasyon sonrasına gönderirken, break ile döngüyü tamamen kırabiliriz. Bu şekilde örneğin while döngümüzün de sonsuz olmasını engelleyebilir, kendimize bir çıkış yolu yaratabiliriz.

while [ koşul ]  
 do  
  ifadeler 
  if (koşul)  #Örnek olarak x=5 ise
  then  
      break 
  fi  
  ifadeler
 done  
















Linux / Unix: Shell Scripting If/Else Conditions - If/Else Koşulları

Scriptlerimizin daha interactive yani etkileşimli olması için bazı soruların sorulması ve bunlara göre işlemlerinin değiştirilmesi gerekir. Verdiğimiz cevaplara veya değişkenlere göre farklı şartların devreye girmesi gerekir. Bu etkileşimli yapının devreye sokulmasında koşullu ifadeler çok önemli bir yer tutar. Bu koşullu ifadelere örnek verirsek if/else, while, do while ifadeleri kullanılabilinir.

Bu ifadelerden ilk if/else'i inceleyeceğiz. If/else'i bir örnek üzerinden inceleyelim.

 #!/bin/bash  
   
   
 echo "Yapmak istediginiz islem icin lutfen numara giriniz.\n"  
   
 read var1  
 echo "var1=$var1"  
 if [ "$var1" == "1" ];  
   then  
    ls;  
   else  
    echo "Yanlis";  
 fi

Yukarıdaki örneğimizde kullanıcıdan bir numara girmesini istiyoruz. Bu numaraya göre de işlem yaptırıyoruz. Buradaki syntax'ımıza göre önce if ile başlayıp sonra karşılaştırmamızı yaptırıyoruz. Ertesinde then diyip koşulumuzun doğru olması durumunda bulunduğumuz klasör de ls çekip içeriklere bakarken, 1 dışında herhangi bir numara girince "yanlış" şeklinde bir uyarı çıkarmaktadır. En sonunda "fi" denerek işlem bitirilir.

Burada syntax ve boşluklar çok önemlidir. if'ten sonra bir boşluk sonra köşeli parantezlerden sonrada birer boşluk bırakılması önemlidir.

Buradaki örnekte ise yas aralıkları kontrol edilmektedir. Kullanıcının girdiği yaşa göre bir sonuç döndürmektedir. Burada farklı olan "else" yerine "elif" örneği verilmiştir.

 #!/bin/sh  
   
   
 echo "Yaş giriniz.:"  
 read yas  
   
 if [ "$yas" -lt 20 ] || [ "$yas" -ge 50 ]; then  
      echo "yas aralıgının dısında ."  
 elif [ "$yas" -ge 20 ] && [ "$yas" -lt 30 ]; then  
      echo "20'den büyük 30'tan küçük"  
 elif [ "$yas" -ge 30 ] && [ "$yas" -lt 40 ]; then  
      echo "30'dan büyük 40'tan küçük"  
 elif [ "$yas" -ge 40 ] && [ "$yas" -lt 50 ]; then  
      echo "40'tan büyük 50'den küçük"  
 fi  


Shell Scripting'deki Karşılaştırma Operatörleri:


 -eq     eşittir  
 -ne     eşit değildir  
 -lt     küçüktür  
 -le     küçük eşittir  
 -gt     büyüktür  
 -ge     büyük eşittir  
 ==      eşittir  
 !=      eşit değildir  


İf/Else Örneği:


Örneğimizin amacı  `pwd` ile "$PWD" komutlarının sonucu aynıdır. Bu yüzden kullanıcıların kafaları karışabilinir. " ` " işareti " ' " bu işaretle karıştırılmamalıdır.

 LOG_DIR=/home/users/oracle 
if [ `pwd` != "$LOG_DIR" ] #veya: if [ "$PWD" != "$LOG_DIR" ]  
 then  
  echo "Oracle Home'unda değilsiniz."  
  exit;
 fi   



19 Kasım 2013 Salı

PL\SQL Örnekleri: Authid Nedir? - Ne İşe Yarar?

Authid ifadesi veritabanına  programın, procedure ya da function'ın hangi kullanıcının haklarıyla çalıştırılması gerektiğini söyler. Invoker's rights yani programı çalıştıran kişinin mi yoksa programı yaratan kişinin haklarının kullanılması büyük fark yaratır.

Programımızı yaratan kişi kullanan kişiden daha üstün olabilir. Bu durumda programı çalıştıran kişi daha az object üzerinde hakka sahip olduğu için programın içinde kullanılmış olabilecek herhangi bir object kullanma yetkisi yoksa hata alacaktır. Bunu engellemek ya da düzenlemek için Authid ifadesini kullanırız.

Authid ifadesini kullanabilmek için "Authid" ifadesini başlıktaki "IS" veya "AS" anahtar sözcüklerinden önce kullanmak gerekmektedir.

Seçenekler:

Authid definer: default olarak kullanılmaktadır. Yani normalde programı oluşturan kullanıcının hakları ile çalıştırılır.

Authid current_user: Programımızı yaratan değil de, şu an çalıştıran kullanıcının haklarıyla çalıştırır.

Avantajı Nedir?

Object'lerin çalıştırılması sırasında bu şekilde ayırt edilmesi bize ayrı bir katman yaratır, güvenlik sağlar. Bu şekilde birden fazla aynı object'i kullanabilir. Kod paylaşılırken erişilebilen object'ler(data) ayrı tutulabilinir. İstediğimiz object'i paylaşmak istediğimizde bu yapıyı, programın içine atarak erişebiliriz.

Özetle; datalar ayrı ama kodlar paylaşılırken bu yapı kullanılabilir. Ancak bu sayede data başka birisinin tablespace'indeyken erişim sağlanabilir.


Syntax?

Syntax olarak daha önce de belirttiğimiz gibi procedure veya fonksiyonlarda isimden sonra kullanılacak şekilde konulur ve "AS" ve "IS" yapılarından önce konulur.

Örneğin aşağıdaki yapılarda DBA rolüne sahip birisi olarak aşağıdaki prosedürü yaratıp DBA rolüne sahip olmayan birinin kullanımına AUTHID DEFINER olarak verirsek procedure  çalışacaktır. Halbuki AUTHID CURRENT_USER olarak verilirse procedure çalışmayacaktır; çünkü kullanıcı DBA rolüne sahip olmayacaktır.


 CREATE OR REPLACE PROCEDURE definer_test AUTHID DEFINER IS   
 BEGIN  
  FOR rec IN (SELECT table_name FROM dba_tables)  
  LOOP  
   dbms_output.put_line(rec.table_name);  
  END LOOP;  
 END definer_test;  
 /  
   
 CREATE OR REPLACE PROCEDURE cu_test AUTHID CURRENT_USER IS   
 BEGIN  
  FOR rec IN (SELECT table_name FROM dba_tables)  
  LOOP  
   dbms_output.put_line(rec.table_name);  
  END LOOP;  
 END cu_test;  
 / 

Oracle Veritabanı: Oracle Error ORA-01652 Unable To Extend Segment By XX In Tablespace XX

ORA-01652 hatası TEMP tablespace'i çok kullanan bir sql sonucunda alınır. TEMP tablespace'i bütün database iç operasyonlarında kullanılır. Özellikle sql işlemlerinde yani join, distinct gibi işlemlerinde TEMP tablespace'i kullanılmaktadır. TEMP tablespace kullanıldıktan sonra bu alan boşaltılır; ancak eğer sorgu bitmeden bu alan doldurulursa o zaman sorgu bitemeden hata döner. Bu da bizim tablespace'imizdeki yerle alakalı olmadığını göstermektedir. Tablespace'imizde yeterli alan olsa bile TEMP tablespace'inden dolayı hata alır.

Eğer sorgunun illa gerçekleşmesi gerekiyorsa TEMP tablespace'e datafile ekleyerek yer arttırılmasıyla bu sorun giderilir. Data file ekleme işlemini "Data File Yönetimi" adlı yazımızda bulabiliriz.

Oracle Veritabanı Sertifikasyon - OCA - OCP - Oracle Certified Professional Nasıl Olunur?


Oracle veritabanı konusunda eğer sertifika edinmek istiyorsak bu konuda bazı sınavlardan geçmemiz gerekmektedir. Aşağıdaki ekranda seçeneklerde sırasıyla Database Administrator,Database,Oracle Database ve Oracle Database 11g seçeneklerini seçerek OCP sertifikasını ve diğer Oracle Database 11g ile ilgili sertifikaları görebiliriz.

Aşağıdaki ekrana bu linkten gidebilirsiniz.



OCP olmak için gereken adımlar nelerdir?

Oracle Database 11g Certified Professional olmak için 3 tane sınav geçmek ve belirli bir eğitimden geçmek gerekmektedir.

İlk sınav Oracle Database 11g Sql Fundamentals: 1Z0-051 sınavıdır. Bu sınavla Sql bilgimiz ölçülür. Bu sınav non-proctered olarak alınabilinir yani sınava evde girebiliriz.


İkinci sınav Oracle Database 11g Administration I: 1Z0-052 sınavıdır. Bu sınav sayesinde Oracle Database 11g Certified Associate sertifikasını almaya hak kazanırız. Bu sınav Oracle Database konusunda genel konseptleri inceler.

Sınav Konuları Başlıca aşağıdakiler gibidir.:
-Database Mimarisi
-Oracle Process'leri
-Database Ortamı
-Oracle Database Kurulması ve Database Yaratılması
-Oracle Network İşleyişi
-Database kullanıcıları Yönetimi
-Database Bakım, Performans ve Optimizasyon Araçları
-Backup ve Recovery Konseptleri
-Data Taşınması

Üçüncü sınav Oracle Database 11g Administratiıon II: 1Z0-053 sınavıdır. Bu sınav sayesinde Oracle Database 11g Certified Professional olmaya yaklaşırız. Hak kazanmak için ise "Complete Training" adlı aşamayı da gerçekleştirmemiz gerekir. Yani Türkiye de kayıtlı, Oracle tarafından tanınmış bir yerden,şu an için sadece Bilginç IT Academy, OCP eğitimi almak gereklidir. Sınav konuları OCA'in daha ilerisidir. Konular yaklaşık olarak aynı iken, konular üzerine daha detaylı sorular sorulmaktadır.

Sonuç olarak aşağıdaki resimde de görüldüğü gibi OCP olmak için 3 tane sınav geçmek, ve geçerli bir eğitim almak gerekmektedir. Bu şekilde OCP olunabilinir.



18 Kasım 2013 Pazartesi

Oracle E-Business Suite: Adadmin Nedir? - Ne İşe Yarar?

Adadmin olarak belirttiğimiz araç Ad Administration'dır. Adadmin ile çoğu bakım(maintenance) işlemi gerçekleştirilmektedir. Adadmin tarafından gerçekleştirilebilecek işlemler gruplanmıştır. Bu gruplar aşağıdaki gibidir.



Gruplarda sırasıyla Menu'lerin tekrar yaratılması, veritabanındaki application object'lerinin compile edilmesi, application'ın maintenance mode'a alınması, application ile ilgili bazı işlemlerin gerçekleştirilmesidir. Menu'ler ve içerikleri aşağıdaki gibidir.


Generate Applications Files Menu:

Uygulama kullanımı sırasında bazen formların zamandan zamana yeniden yaratılması gerekebilir.  Bunun için formların,mesajların veya raporların tekrar üretilmesi gerekebilir. Patch'ler uygulandığında ya da geliştirmeler yapıldığında bunlar bozulabilir. Bunların tekrar yaratılması sorunu çözebilir. Bu regenerasyon işlemi sırasında uygulamanın kapatılmasına gerek yoktur ama bu belirttiğimiz tipteki objectlerin kullanılmaması gerekmektedir.

En iyi çözüm ise uygulamanın kapatılıp bu işlemin yapılmasıdır.

Java dosyalarının tekrardan yaratılması ise eğer java kütüphanelerinden herhangi biri eksikse ya da uygulamaya herhangi bir geliştirme uygulandıysa yapılmalıdır.

Mesaj dosyalarının tekrar yaratılması ise EBS ekranlarında gördüğümüz yazıların tekrar yaratılmasını sağlar; ancak bunun kontrollü bir şekilde yapılması gerekmektedir.

























Maintain Applications Files Menu:



























Compile/Reload Applications Database Entities:

Compile Apps Schema  ile apps schema'sındaki invalid olan object'ler derlenir, compile edilip bozuk olanlar tekrar çalıştırılır.

Compille Menu Information ile menu yapıları tekrar derlenir. Sorun olması durumunda çalıştırılması tavsiye edilir. Aynı şekilde compile flexfields da bozuk olan flexfield'lar yapılır.






















Maintain  Applications Database Entities Menu:

Database'in bütünlüğünü kontrol eden bu menu'de "Validate Apps Schema" ile bir rapor yaratılır  ve bu raporda APPS'la ilgili düzeltilmesi gereken sorunlar, APPS'la ilgili olmayan düzeltilmesi gerekn hatalar ve APPS Schema'sıyla ilgili düzeltilebilinecek hatalar listelenir.

"Re-create grants and synonyms for Apps Schema"  ile APPLSYSPUB schema'sı için bazı SYSTEM ve APPS paketlerine grant'ler ve synonym'ler tekrar yaratılır. Genelde "Validate Apps" ile ortaya çıkan sorunlar ertesinde gösterilir.




















Application'ın Maintenance Mode'a Alınması

Application'ın maintenance mode'a alınması adadmin aracı ile yapılır. Oracle Applications'ı adstpall.sh scriptiyle kapadıktan sonra, Adadmin'i çalıştırıp 5. seçenek seçilip oradan da enable seçeneği seçilir. Application'ın Maintenance Mode'a alınmasının nedeni patch geçmektir. Patch geçmek için bu mode'a alınması gereklidir.

Not: Maintenace mode ile ilgili yazı







Oracle Veritabanı: PL\SQL Paketleri - PL\SQL Packages

Oracle PL\SQL Packages Nedir?

Package olarak bahsettiğimiz yapılar çeşitli PL\SQL tiplerinin, fonksiyonların, procedure'leriin ve alt programcıkların toplandığı object'lerdir..

Package'lar genelde 2 ayrı birimden oluşurular. Ilk birim "specification ya da spec" dediğimiz package içerisinde bulunan fonksiyon ve procedure'lerin başlık kısmının yazıldığı yerdir. Bu kısımda paket içerisinde yer alacak fonksiyonlar ve procedure'leri ifade ederiz. Bunu da başlık kısımlarını yani procedure veya fonksiyon diyip ismini yazıp yanına da alacağı parametreleri yazarak gerçekleştiririz.

 İkinci birim ise "body"'dir. "Body" içerisinde fonksiyon ve procedure'lerin kodları yer alır. Burada fonksiyon ve procedure'lerin nasıl gerçekleşeceğini yani kaynak kodlarını yazarız.
Package Yapısı

PL\SQL Package Örneği:

Bu örneğimizde bir PL\SQL package'ının nasıl yaratıldığını göstereceğiz. Bu işleme önce package spec'i ile başlarız. Yukarıdaki tanımımız da yaptığımız gibi ilk önce paketimizi içinde yer alacak fonksiyon ve prosedürler ile bunların alacağı parametreleri yazarak oluştururuz. Buradaki paketimizin adı deneme3'tür. Örnek olarak oluşturduğumu procedure'lar ise deneme ve deneme2'dir.


CREATE OR REPLACE PACKAGE deneme3 AS   
   PROCEDURE deneme(  
   yas number,  
   isim varchar2(10),  
   soyisim varchar2(10)  
 );  
   PROCEDURE deneme2(  
    sehir varchar2(20)  
 );  
 END deneme3;  

"deneme" ve "deneme2" olarak oluşturduğumuz iki procedure'de ise deneme ve deneme2 adlarıyla oluşturulmuş iki tabloya değerler girilir.

 CREATE OR REPLACE PACKAGE BODY deneme3 AS    
   PROCEDURE deneme(   
   yas number,   
   isim varchar2(10),   
   soyisim varchar2(10)   
     ) IS  
      BEGIN  
        insert into deneme values(yas,isim,soyisim);  
      END deneme;   
   
   PROCEDURE deneme2(   
   sehir varchar2(20)   
       )   
     BEGIN  
        insert into deneme2 values(sehir);  
      END deneme2; ;   
       
  END deneme3; 

Package'larımız içine procedure'lerimizi tanımladıktan sonra bu procedure'leri dışarıdan aşağıdaki gibi çağırabiliriz. Örneğin:

exec (schema_ismi).(package_ismi).(prosedür_ismi)(parametreler);  

Bu örneğimiz için uyarlarsak eğer;

exec berke.deneme3.deneme2('istanbul');  


PL\SQL Package'ları Oluşturmanın Amacı Nedir?

-Modülerlik:

Package'ların en temel özelliği procedure ve fonksiyon gbi yapıların gruplanmasına olanak sağlamaktadır. Böylece yapılan işe özel tasarlanmış fonksiyon ve prosedürler aynı yapı altında tutulabilinir.

-Fonksiyonellik ve Uygulama Tasarlama Kolaylığı:

Package'ların içine konan yapılar sayesinde uygulamamıza özel tasarladığımız package'lara ekstra fonksiyonlar ve tipler, cursor'lar tanımlayabiliriz. Bu şekilde hem bizim için uygulama dizaynında kolaylık sağlanır hem de package'ların eklenen programlarla etkeni genişler.

-Performans Artışı:

Performans artışı package çağırıldığı zaman hafızaya yüklenmesiyle oluşur. Bu şekilde uygulama sırasında package'ın diğer bütün  fonksiyonlarının veya prosedürlerinin kullanılmasıyla performans artışı sağlanır. Daha hızlı çalıştırılır.

-Gizlilik: 

Uygulamalar paketin sadece spec dediğimiz arayüzüne ulaşabilirler. Paketin içindeki kodları göremezler.

-Overloading: Birden Fazla Aynı Adlı Program

Overloading dediğimiz şey aslında java'da bulunan bir programlama tekniğidir. Program içerisinde yer alan fonksiyon veya prosedürler parametreleri değişik olduğu sürece,  veya parametreleri aynı olup da birinde fazladan parametre olduğunda paket derlenmesinde bir sorun yaşanmaz. Peki niye aynı adlı programlar yazdığımız konusuna geldiğimizde ise, paketimizin içindeki programların modülerliğinin veya fonksiyonalitesinin artması için bunu yapabiliriz.

Var Olan Paketlerin Text'lerini Nasıl Görebiliriz?


 select * from dba_source where name='STANDARD' and type ='PACKAGE BODY' order by line asc;

Yukarıdaki sorguyla paketlerin içlerini görebiliriz. Arayüz olarak bahsettiğimiz kısımlarını görmek içinse type'ı Package olarak değiştirebiliriz.


PL/SQL Paketlerinin Kalıcılığı:

Paketler çağrıldıkları andan itibaren yüklenirler. Değişkenler UGA kısmında yer alırlar. Yüklendikten itibaren session süresince UGA'de saklanırlar. Eğer "PRAGMA SERIALLY_REUSABLE" ifadesi kullanılırsa, programın sadece çağrıldığı süre boyunca memory'e yüklenir, sonra bu alan boşaltılır. Eğer memory bakımından kıstımız varsa ve session boyunca açık kalması gerekmiyorsa yararlı olur. Ayrıca işlerimiz geçici ise yine paketlerimizde pragma ifadesini kullanabiliriz.

"Pragma Serially_reusable" Spec örneği:

CREATE PACKAGE pkg1 IS
   PRAGMA SERIALLY_REUSABLE;
   num NUMBER := 0;
   PROCEDURE init_pkg_state(n NUMBER);
   PROCEDURE print_pkg_state;
END pkg1;
/

"Pragma Serially_reusable" Body örneği:

CREATE PACKAGE BODY pkg1 IS
   PRAGMA SERIALLY_REUSABLE;
   PROCEDURE init_pkg_state (n NUMBER) IS
   BEGIN
      pkg1.num := n;
   END;
   PROCEDURE print_pkg_state IS
   BEGIN
      DBMS_OUTPUT.PUT_LINE('Num: ' || pkg1.num);
   END;
END pkg1;
/


Hem Body hem de Spec tanımında Pragma serially_reusable ifadesi kullanılmaktadır. İkisinden birinde kullanılması yetmez.

Paketlerde PL/SQL Tablo Tipinde Kayıtların Kullanılması (Using PL/SQL Tables of Records in Packages):

PL/SQL tablo tipindeki kayıtların kullanılması demek paketler içerisinde belirtilecek tabloların içerisindeki sütunlar baz alınarak oluşturulacak tabloların geçici olarak sonuç depolaması demektir. Bu tanımı örneklerimizden de daha kolay bir şekilde görebiliriz. Bunun için ilk olarak paketimiz içerisinde bu tablo tipini tanımlamamız gerekir.

 CREATE OR REPLACE PACKAGE emp_pkg IS  
  TYPE emp_table_type IS TABLE OF employees%ROWTYPE INDEX BY BINARY INTEGER;  
  PROCEDURE get_employees(p_emps OUT emp_table_type);  
 END emp_pkg;  
   

Yukarıdaki örneğimizde de "employees" tablosunun bütün kolonlarını baz alan emp_table_type adında bir değişken tipi oluşturulur. Sonrasında bu tipte bir değişkeni geri döndürecek bir prosedür yazılır. Yani bu prosedürde get_employees içerisindeki işler çalıştırılır. Sonrasında bu işlere göre p_emps adlı değişken içine değerler atılır.

 CREATE OR REPLACE PACKAGE BODY emp_pkg IS  
  PROCEDURE get_employees(p_emps OUT emp_table_type) IS  
   v_i BINARY_INTEGER := 0;  
  BEGIN  
   FOR emp_record IN (SELECT * FROM employees)   
   LOOP  
    p_emps(v_i) := emp_record;  
    v_i:= v_i + 1;  
   END LOOP;  
  END get_employees;  
 END emp_pkg; 

Paketin yukarıda belirttiğimiz body kısmında get_employees adlı prosedürümüz içeriğini oluştururuz. "employees" adlı tablodan bütün veriler alınıp bunlar set edilecek.

Bu paketin kullanımına dair örneğimiz de aşağıdadır.

 DECLARE  
  v_employees emp_pkg.emp_table_type;  
 BEGIN  
  emp_pkg.get_employees(v_employees);  
  DBMS_OUTPUT.PUT_LINE('Emp 4: '||v_employees(4).last_name);  
 END;  

Örnekteki programda da paketimizin içinde tanımladığımız tablo tipinde bir değişken oluştururuz. sonra paketimizdeki get_employees prosedürünün içine atıp set ederiz. Yani tablomuzu içindeki değerlerle oluştururuz.  Oluşturduktan sonra da o tablonun istediğimiz index'li datasını çekebiliriz.


13 Kasım 2013 Çarşamba

Oracle Veritabanı: Partitioning - Partition Kararı Neye Göre Verilir? - Partitionlama

Oracle Veritabanında partitionlara ayırma konusunda bir sürü aşama var.

Ne Zaman Partition Edilir?

-2 Gb'dan büyük tablolar

-Arşivleme amacı güden tablolar

-Tablo içerikleri farklı depolama araçlarında deponlanması gerektiğinde

Farklı Tablespace'lerde Partition'lamanın Avantajları: 

-Data corruption ihtimali azalır.

-Backup'lama ve Recovery her partition için ayrı yapılabilinir.

Partition Kararı Hangi Amaçla Verilir?

Partition tip'lerine ve üzerinde partition yapılacak sütun'lara karar vermek Partitioning sürecinin önemli bir parçasıdır.  Burada önemli olan yönetimi kolaylaştırmak ve performansı arttırmaktır. Özet olarak:

-Performans için

-Yönetim kolaylığı sağlaması için

-Data silmek için

-Data arşivlenmesini kolaylaştırmak için

-Backup'ın verimliliğini arttırmak için

partition'lama yapılabilinir.

  • Performans:
Performans partition yapılanmalarının ana amacıdır. Birden fazla partition'a ayırarak sürekli "full table scan" sorgularda büyük performans artışları sağlayabiliriz; çünkü artık bütün tabloyu aramasına gerek kalmayacaktır.
  • Yönetim Kolaylığı Sağlaması ve Data Silmek İçin:
Yönetim kolaylığı açısından partitionlar ile tablolar üzerinde yapılan index'ler, o index'lerin tekrar tekrar drop edilip, rebuild edilmesi daha hızlı halledilir. Gerektiğinde daha önceden anlattığımız gibi "select" sorgularımız daha hızlı halledilir.

Ayrıca tablolar partitioned hale getirilerek, partition'ların yönetimi, silinmesi, partition'ların eklenip çıkarılması daha kolay halledilir.


  • Data Arşivlenmesi:
Data arşivlenmesini yukarıda anlattığımız gibi historic data içeren bir tabloyu, partition'lara ayırıp bu partition'ları uygun arşiv tablespacelerine taşınması, gerektiğinde export edilip başka veritaban'larına gönderilmese veya başka depolama yerlerinde tutulması mümkündür.

  • Backup'ın Verimliliğini Arttırmak:
Backup'ın verimliliğini arttırmak, backup alabileceğimiz granülerliğe erişmek demektir.