Hurriyet

30 Ağustos 2013 Cuma

Linux / Unix Komutu: Time - Zaman Ölçümü

Time komutu ile bir kaynağa ulaşma ve execute edilme zamanını bulabiliriz. Time komutu sonrasında parametre olarak verilen programı veya komutu çalıştırır ve komut bittiğinde stdout yani çıktı olarak zamanla ilgili istatistikleri ekrana verir.

 time sleep 3  
   
 real  0m3.009s  
 user  0m0.000s  
 sys   0m0.004s  

Time komutunun en çok kullanilan parametresi "-p"dir. Örnegin `time ls veya time cd gibi /usr/bin altında bulunan komutların çalıştırılma zamanları aynıdır ancak çıkarttıkları output ve sonuçlarının ekrana basılma zamanları farklı olabilir. Bunun için bir komutu en sonuna kadar ölçmek icin time `-p` parametresi aşağıdaki gibi kullanmalıyız.

 time -p ls  

Birden Fazla Komutun Zamanını Bir Kerede Nasıl Ölçebiliriz?

Birden fazla komutun zamanını belirlemek için komutları aynı script dosyasına koyup çalıştırdıktan sonra görebiliriz. Aşağıdaki adımlari izlersek amacimiza ulasabiliriz. Aşağıda önce abc.sh'ımızı oluşturup sonra abc.sh 'ımııza çalıştırılma ve yazma yetkisini veririz. En sonunda da zamanını ölçeriz.

 vi abc.sh  
   
 cd   
 ls   
 cd /home   
 ls -lrt  
   
   
 chmod 755 abc.sh  
   
 time -p abc.sh 







29 Ağustos 2013 Perşembe

Oracle Veritabanı: Materialized View ve Konsepti

Materialized View uzaktaki veya başka bir database'deki sorgunun sonuçlarını ana database'de tutan object'lerdir. Daha önce snapshot olarak tanımlanırlardı. Materialized View'lar belirli bir datanın o anki kopyasıdır.

Eğer materialized view başka bir database'deki object'e erişecekse, uzaktaki database'e bir link oluşturulması gerekmektedir.  Bunlar oluşturulmadan önce izinler kontrol edilir.

 GRANT CREATE DATABASE LINK TO scott;  
 GRANT CREATE MATERIALIZED VIEW TO scott; 

İzinler test edildikten sonra database link yaratılır.

CREATE DATABASE LINK orcl1  
 CONNECT TO berke IDENTIFIED BY berke  
 USING 'orcl'; 

Buradaki orcl ana makinamızın SID'sidir. "orcl1" ise link adıdır.

 CREATE MATERIALIZED VIEW employees  
  ON PREBUILT TABLE   
  REFRESH FORCE AS  
  SELECT *   
 FROM employees@orcl1 

Materialized View'lar Ne İşe Yarar?

Materialized View'lar ile değişiklikler takip edilir. Uzaktaki makinada ilgili tablolarda değişiklik yapılıp kaydedildiğinde o değişiklikler üzerine yaratılmış view ve tabloların bilgisi de değişmelidir. Materialized View'lar bir sorguya göre düzenlendiği için bu sorgulara göre view içindeki içerik değişmektedir.

Eğer herkesin aynı database'deki kayıtlara erişmesi gerekiyorsa ve network bağlantısının azaltılması gerekiyorsa başka database'lerde de materialized view'lar yaratılarak data'nın başka yerlerde kopyalanıp yedeklenmesi ve oralara ulaşılarak ana makina netwok trafiğinin azaltılması sağlanır.

Materialized View Log'ları Nedir ve Niye Yaratılır? 

Materialized View'ın üzerine ya da materialized view'ı oluşturan tablolara bir değişiklik yapıldığında(DML işlemleri yapıldığında), bu değişikliklerden etkilenen satırlarla ilgili bilgiler materialized view log'a kaydedilir. Bunu sağlayanda materialized view log'la oluşturulan bir "after row"  trigger'ıdır.

Materialized view log'unu eğer master tablo üzerine yaptığımız değişikliklerin hemen materialized view'lar üzerinde güncellenmesini istiyorsak yaratmalıyız. Materialized view log'u yaratıldığında adı "MLOG$_tablo_adı" olarak belirlenir.

Materialized View'lar Nasıl Bulunur?


 select * from dba_base_table_mviews;  

Materialized View Log Nasıl Yaratılır?


SQL> create materialized view log on emp with rowid;  

Invalid Olan Materialized View'ların Bulunması:


select * from dba_objects where status='INVALID' and object_type like 'MATE%';

Invalid olan materialized view'ları dba_objects'ten bulabileceğimiz gibi dba_mviews adlı tablodan da bulabiliriz.

 select * from dba_mviews;  

Invalid Olan Materialized View'ların Compile Edilmesi:

İlk olarak compile edilecek Materialized View'lar için bir ifade yaratırız. Bunu aşağıdaki ifade ile yaratabiliriz.

select 'alter materialized view '|| object_name ||' compile;' from dba_objects where status='INVALID' and object_type like 'MATE%';

Bu sorgu sonucunda çıkan sonuçlarıda kopyalayıp çalıştırabiliriz.

Materialized View'lar Niye Invalid Olur?

Materialized view'lar içlerindeki data'lar değiştiğinde invalid hale düşerler. Bu yüzden eğer içlerindeki datalar değişirse compile edilmeleri gerekir.

SQL> create materialized view log on emp with rowid;  
   
 Materialized view log created.  
   
 SQL>  
 SQL> create materialized view emp_mv  
  2 refresh fast on demand  
  3 with rowid  
  4 as select * from emp;  
   
 Materialized view created.  
   
 SQL>  
 SQL> select status,object_type  
  2 from user_objects  
  3 where object_name = 'EMP_MV' and object_type='MATERIALIZED VIEW';  
   
 STATUS OBJECT_TYPE  
 ------- -------------------  
 VALID  MATERIALIZED VIEW  
   
 SQL>  
 SQL> select mview_name,compile_state  
  2 from user_mviews;  
   
 MVIEW_NAME           COMPILE_STATE  
 ------------------------------ -------------------  
 EMP_MV             VALID  
   
 SQL>  
 SQL>  
 SQL> update emp set ename=ename where empno>7500;  
   
 12 rows updated.  
   
 SQL> commit;  
   
 Commit complete.  
   
 SQL>  
 SQL> select status,object_type  
  2 from user_objects  
  3 where object_name = 'EMP_MV' and object_type='MATERIALIZED VIEW';  
   
 STATUS OBJECT_TYPE  
 ------- -------------------  
 INVALID MATERIALIZED VIEW  
   
 SQL>  
 SQL> select mview_name,compile_state  
  2 from user_mviews;  
   
 MVIEW_NAME           COMPILE_STATE  
 ------------------------------ -------------------  
 EMP_MV             NEEDS_COMPILE 

Materialized View'ları Compile Edecek Script:

Aşağıdaki script'imizde compile edilebilinecek bütün materialized view'lar compile edilir.  Sonrasında hata alan olursa hata alanlar belirtilir.

 declare  
 z varchar2(100);  
 cursor a is select owner,object_name from dba_objects where status='INVALID' and object_type like 'MATE%';  
 begin  
 for x in a   
 loop  
 z := 'alter materialized view ' || x.owner || '.'|| x.object_name || ' compile' ;  
 dbms_output.put_line(z);  
 begin  
 execute immediate z;  
 exception   
  when others  
  then  
  dbms_output.put_line('HATALI:');dbms_output.put_line(z);
 end;  
 end loop;  
 end;  
 /  




X$DBAGALERTEXT Tablosu:

Bu tablo sistemdeki alert.log'un veritabanınındaki tanımlı halidir. Önceden bu tablo otomatik olarak gelmediği için dba'ler external tablo olarak alert.log'u veritabanına kaydedip onun üzerinde sorgu çekerlerdi. 11g versiyonundan sonra bu tablo veritabanına x$dbagalertext olarak tanımlanmıştır. Böylece external tablo olarak belirtmeden de sorgu çekebilir hale gelmiş olduk ancak SYS kullanıcısı dışında kimse bu tabloya sorgu atamadığı için hala bir sorun bulunmaktadır. Bu sorunu çözmek için bir yöntem ise bu tablonun view'ının veya materialized view'ının oluşturulması gerekir. Bu da materialized view için uygun bir örnek olabilir.


Referanslar:

https://community.oracle.com/thread/2356037?tstart=0
http://docs.oracle.com/cd/A97630_01/server.920/a96567/repmview.htm



Oracle E-Business Suite: Workflow Notification Mailer'ın Açılıp Kapanması ve Durum Kontrolü

Apps kullanıcısıyla aşağıdaki komutlları kullanarak Notification Mailer'ı yönetebiliriz. Bu işlemleri yaparak
sistem'in Mail işlemlerinde tıkanıklık olduğunda veya restart edilmesi gerektiğinde sonuca ulaşabiliriz.


Notification Mailer'ı Statüsünü Kontrol Etmek:


 select component_status from fnd_svc_components   
 where component_name='Workflow Notification Mailer'; 

Notification Mailer'ı Durdurmak:

 declare  
 n_component_id number;  
 l_errcode number;  
 l_errstr varchar2(4000);  
 begin  
 select component_id into n_component_id from fnd_svc_components   
 where component_name='Workflow Notification Mailer';  
 FND_SVC_COMPONENT.stop_Component(n_Component_Id, l_errcode, l_errstr);  
 commit;  
 end;  
 /  

Notification Mailer'ı Başlatmak:


 declare  
 n_component_id number;  
 l_errcode number;  
 l_errstr varchar2(4000);  
 begin  
 select component_id into n_component_id from fnd_svc_components   
 where component_name='Workflow Notification Mailer';  
 FND_SVC_COMPONENT.start_Component(n_Component_Id, l_errcode, l_errstr);  
 commit;  
 end;  
 /  

Worflow Mailer'ı Applications Manager'dan Başlatmak:

Worflow Mailer ile ilgili sayfaya gitmek için "System Administraton" sorumluluğundan Dashboard seçeneğine gideriz.






Yukarıdaki gibi Navigate to: Workflow Manager seçeneğine gidip "Go" tuşuna basarız. Sonrada karşımıza aşağıdaki sayfa gelir.


Buradan ilgili servislerden hangisi çalışmıyorsa onun üzerine tıklayarak açabiliriz.

Workflow Durum Kontrolü:

Workflow durum kontrolünü buradan yapabiliriz.

Workflow'ların Hangi Durumda Olduğunu Kontrol Etmek:

Mailler takılı kaldığında Workflow Maillerinin Workflow'ların hangi aşamasında kaldığını görmek için uygulamayı kullanabiliriz. Bu şekilde veritabanından alabileceğimiz daha fazla bilgiyi edinebiliriz. Ayrıca her zaman her bilgiyi veritabanından bulamayabiliriz.

"Workflow Administrator Web (New)" sorumluluğu altından "Administrator Workflow" fonksiyonlarından  "Status Monitor"'a girebiliriz. Ertesinde de Workflow tipimizi girip  seçtikten sonra o Workflow'larla ilgili eski ve çalışmakta olan bütün kayıtlar gelir. Bu kayıtlardan herhangi birisini seçip "Status Diagram"'a tıklarsak o workflow ile ilgili bütün aşamalar karşımıza getirilir.



Workflow SQL'leri:

Workflow Mailer Parametreleri:


 SELECT b.component_name,  
 c.parameter_name,  
 a.parameter_value  
 FROM fnd_svc_comp_param_vals a,  
 fnd_svc_components b,  
 fnd_svc_comp_params_b c  
 WHERE b.component_id = a.component_id  
 AND b.component_type = c.component_type  
 AND c.parameter_id = a.parameter_id  
 AND c.encrypted_flag = 'N'  
 AND b.component_name like '%Mailer%'  
 AND c.parameter_name in ('OUTBOUND_SERVER', 'REPLYTO')  
 ORDER BY c.parameter_name;

Mailer Concurrent Manager'ı:


 select * from fnd_concurrent_queues where concurrent_queue_name like 'WFMLRSVC%';


28 Ağustos 2013 Çarşamba

Oracle E-Business Suite: Bir Kullanıcı Tarafından Çalıştırılan Concurrent Programlar

 Bir kullanıcı tarafından submit edilen concurrent programları buradan görebiliriz.

 SELECT  
 user_concurrent_program_name,  
 request_date,  
 request_id,  
 phase_code,  
 status_code  
 FROM  
 fnd_concurrent_requests fcr,  
 fnd_concurrent_programs_tl fcp,  
 fnd_responsibility_tl fr,  
 fnd_user fu  
 WHERE  
 fcr.CONCURRENT_PROGRAM_ID = fcp.concurrent_program_id  
 and fcr.responsibility_id = fr.responsibility_id  
 and fcr.requested_by = fu.user_id  
 and user_name = '&user'  
 AND actual_start_date > sysdate - 1000  
 ORDER BY REQUEST_DATE Asc;  


Bu sorguyu Audit amaçlı işlerde kullanabileceğimiz gibi sırf bilgi edinmek için de kullanabiliriz.







Oracle E-Business Suite: Workflow Mailer Durum Kontrolü

Workflow Mailer kontrolünü aşağıdaki sorguyla yapabiliriz. Bu sorgu ebs kontrolü sırasında kullanılması gereken sorgulardan biridir.

select * from fnd_svc_components;  
   
   
 SELECT component_name as Component, component_status as Status FROM fnd_svc_components WHERE component_type = 'WF_MAILER';



Geri kalan bileşenlerin kontrolünü:

select SC.COMPONENT_TYPE, SC.COMPONENT_NAME, FND_SVC_COMPONENT.Get_Component_Status(SC.COMPONENT_NAME) COMPONENT_STATUS from FND_SVC_COMPONENTS SC order by 1, 2;


EBS'te atılan maillerin durumu:

 select * from wf_notifications;  


Buradaki maillerin status'u eğer "pending" ise bunları "sent" çekebiliriz. Bunun için tabloyu update  etmemiz yeterlidir.


Oracle E-Business Suite: Concurrent Manager Status Control - Concurrent Manager Statü Kontrolü


Oracle Applications'da eğer concurrent managerları sql ile kontrol etmek istiyorsak aşağıdaki sorguyu kullanabiliriz. Böyle browser'dan girip zaman kaybetmemiş oluruz.

   
 select  
 decode(CONCURRENT_QUEUE_NAME,  
 'FNDICM','Internal Manager',  
 'FNDCRM','Conflict Resolution Manager',  
 'AMSDMIN','Marketing Data Mining Manager',  
 'C_AQCT_SVC','C AQCART Service',  
 'FFTM','FastFormula Transaction Manager',  
 'FNDCPOPP','Output Post Processor',  
 'FNDSCH','Scheduler/Prereleaser Manager',  
 'FNDSM_AQHERP','Service Manager: AQHERP',  
 'FTE_TXN_MANAGER','Transportation Manager',  
 'IEU_SH_CS','Session History Cleanup',  
 'IEU_WL_CS','UWQ Worklist Items Release for Crashed session',  
 'INVMGR','Inventory Manager',  
 'INVTMRPM','INV Remote Procedure Manager',  
 'OAMCOLMGR','OAM Metrics Collection Manager',  
 'PASMGR','PA Streamline Manager',  
 'PODAMGR','PO Document Approval Manager',  
 'RCVOLTM','Receiving Transaction Manager',  
 'STANDARD','Standard Manager',  
 'WFALSNRSVC','Workflow Agent Listener Service',  
 'WFMLRSVC','Workflow Mailer Service',  
 'WFWSSVC','Workflow Document Web Services Service',  
 'WMSTAMGR','WMS Task Archiving Manager',  
 'XDP_APPL_SVC','SFM Application Monitoring Service',  
 'XDP_CTRL_SVC','SFM Controller Service',  
 'XDP_Q_EVENT_SVC','SFM Event Manager Queue Service',  
 'XDP_Q_FA_SVC','SFM Fulfillment Actions Queue Service',  
 'XDP_Q_FE_READY_SVC','SFM Fulfillment Element Ready Queue Service',  
 'XDP_Q_IN_MSG_SVC','SFM Inbound Messages Queue Service',  
 'XDP_Q_ORDER_SVC','SFM Order Queue Service',  
 'XDP_Q_TIMER_SVC','SFM Timer Queue Service',  
 'XDP_Q_WI_SVC','SFM Work Item Queue Service',  
 'XDP_SMIT_SVC','SFM SM Interface Test Service'  
 ,CONCURRENT_QUEUE_NAME) as "Concurrent Manager's Name"  
 , max_processes as "TARGET Processes", running_processes as "ACTUAL Processes" from fnd_concurrent_queues where max_processes>0 ;





Linux / Unix Komutu: Sleep - Uyku / Bekleme Komutu

Sleep komutu sistemin belirli bir süre beklemesini sağlar. Bu süre içinde hiçbir komut işlemez.

 sleep   

Sleep komutundan sonra gelen zaman inputu saniye cinsinden yorumlanır. Dakika için 60 ile saat için 3600 ile çarpabiliriz.

Sleep Komutunu Ne Zaman Kullanabiliriz?

Sleep komutunu bir uygulamayı kapatırken, parent ve child process'lerin kapatılmasını beklemek için kullanabiliriz. Bizim parent process'i kill etmemiz altındaki child process'lerinde kill edilebileceği anlamına gelmez. Bu yüzden bazı process'ler zombie state diye tarif edebileceğimiz bir durumda kalabilirler.

Sleep komutunun buradaki amacı sistemin otomatik olarak child ve zombie process'leri kill etmesini beklemektir. Böylece daha sonradan başlatacağımız applicationların process'leri arasında çatışmaları engelleriz.

25 Ağustos 2013 Pazar

Linux / Unix Komutu: Mount - Disk Mounting - Disk Mount Edilmesi

Bir partition'un yani genelde bir disk'in mount edilmesi , partition'un linux file sistemine eklenmesidir. Bir linux partition'ın yüklenmesi için aşağıdaki komut yazılabilinir.

mount -t ext3 /dev/sda1 /dıskmnt  

-t   argümanı burada dosya sistemini ifade eder. -t argümanından sonra dosya sistemi tipi yazılır.
Örnek olarak aşağıdaki sistemler yazılabilinir.

  • ext3
  • msdos
  • hfs
  • nfs
/dev/sda1 ismi disk ismini ifade eder. 

/diskmnt klasörü ise mount point'ı ifade eder. Disk mount edildiğinde içindeki bilgilere bu klasör içinden erişilebilinir. Eğer "/ " dizini altında yani root dizini altında /diskmnt adlı bir klasör yaratmadıysak daha önceden bu tarz bir klasör yaratmamız gerekir.  Aşağıdaki örneğimizde bu işlemi gerçekleştirmiş oluruz.

 mkdir /deneme  
 mount -t ext3 /dev/sda1 /deneme  


Unmount Nasıl Yapılır?

Unmount işlemi umount komutuyla yapılır. Kısaca:

 umount /dev/sda1  


24 Ağustos 2013 Cumartesi

Linux / Unix Komutu: Grep - Text Search - Text Araması

Grep komutu verilen dosya içinde text araması yapar. Eşleştiklerini gösterir. Grep komutu regular expression'ların eşleştiği satırların aranması için kullanılmalıdır.

Grep Kullanım Örnekleri:

 grep 'kelime' dosya  
 grep 'kelime' dosya1 dosya2 dosya3  
 grep 'kelime1 kelime2' dosya  
 cat dosya | grep kelime  
 grep --color 'kelime' dosya  


Bir klasör içinde text aranması:

 grep -r "set newname" Desktop/ 


Sadece kelimelerin aranması için "" işaretleri içerisine kelimenin alınması gerekir. Eğer alınmazsa, örneğin berke kelimesi arandığında içinde berke geçen berke1 berke2 gibi kelimelerin bulunduğu satırlar da getirilir.

 grep - w "berke" newfile.sql  

Birden fazla eşleşen kelime aramak için aşağıdaki komut kullanılır.

egrep -w 'kelime1|kelime2' /home/users/berke  

Bulmak istediğimiz dosyaları içindeki text'ten farklı olarak sadece dosya isimlerine bakarak arama istersek :

grep -l 'main' *.c  

Yukarıdaki komutta örneğin içinde main yazısı geçen "c" uzantılı dosyalar arasından arama yapılır. Böylece main.c dosyası bulunur.

Grep çıktılarını renklendirmek için ise --color argümanı kullanılır.

 grep --color vivek /etc/passwd  


Oracle Veritabanı: Çalışan Oracle Process'leri - Running Oracle Processes

Oracle Database'inde arka planda çalışan process'leri aşağıdaki sorguyla bulabiliriz. Bu sorguyla ileride database'i kapatacaksak önceden buradaki bilgileri kullanıp database kapattıktan sonra hangi processlerin açık kaldığını görebiliriz.

select sid, process, program  
   from v$session s join v$bgprocess using (paddr)  
   where s.status = 'ACTIVE'  
  and rownum<50>

Özel olarak oracle'a bağlanmış bir process'i de v$process tablosunu sorgulayarak bulabiliriz. Örnek çıktı aşağıdaki gibidir.

 select * from v$process;
070000077D3BA858     1                    0               0     0     0     0  
 07000007553B1548     2     21430352     PMON     oracle     1     UNKNOWN          1265926     1409518     0     1409518  
 07000007513AEB90     3     15663620     PSP0     oracle     1     UNKNOWN          1264766     1409518     0     1409518  
 070000074D3AE800     4     19202486     VKTM     oracle     1     UNKNOWN          1260670     1409518     0     1409518  
 07000007493DD9B8     5     18415986     GEN0     oracle     1     UNKNOWN          1268790     1409518     0     1409518  
 070000075D3A63F0     6     17826302     DIAG     oracle     1     UNKNOWN          1260942     1409518     0     1409518  
 070000075942CCE0     7     21364850     DBRM     oracle     1     UNKNOWN          2354222     2597534     0     2925214  
 070000077D3BB8C8     8     21495994     DIA0     oracle     1     UNKNOWN          16027398     18759502     1376256     18759502  
 07000007553B25B8     9     16843168     MMAN     oracle     1     UNKNOWN          1264766     1409518     0     1409518  
 07000007513AFC00     10     21299338     DBW0     oracle     1     UNKNOWN          14074094     24248622     3538944     26935598  
 070000074D3AF870     11     17170878     DBW1     oracle     1     UNKNOWN          14210286     17883262     1703936     21356670  
 07000007493DEA28     12     7275202     DBW2     oracle     1     UNKNOWN          13990582     19128446     2555904     20897918  
 070000075D3A7460     13     20906074     DBW3     oracle     1     UNKNOWN          13975398     18145406     1572864     21946494  
 070000075942DD50     14     17367694     DBW4     oracle     1     UNKNOWN          14084822     19062910     2555904     21291134  
 070000077D3BC938     15     15532590     DBW5     oracle     1     UNKNOWN          13825550     18604158     2424832     20635774  
 07000007553B3628     16     15467036     DBW6     oracle     1     UNKNOWN          14521582     19521662     2228224     21749886  
 07000007513B0C70     17     20643926     DBW7     oracle     1     UNKNOWN          14267502     18145406     1572864     20897918  
 070000074D3B08E0     18     15074008     DBW8     oracle     1     UNKNOWN          13835798     17686654     1966080     21160062  
 07000007493DFA98     19     15401640     DBW9     oracle     1     UNKNOWN          14430910     18866302     2031616     21028990  
 070000075D3A84D0     20     21233884     LGWR     oracle     1     UNKNOWN          14087670     19292158     0     25059326  
 070000075942EDC0     21     20578490     CKPT     oracle     1     UNKNOWN          3434982     13190350     4128768     13321422  
 070000077D3BD9A8     22     14549702     SMON     oracle     1     UNKNOWN          3361694     5128014     917504     6635342  
 07000007553B4698     23     15598076     RECO     oracle     1     UNKNOWN          2372838     3178990     458752     3178990  
 07000007513B1CE0     24     20250840     RBAL     oracle     1     UNKNOWN          1274230     1417886     0     1417886  
 070000074D3B1950     25     20185246     ASMB     oracle     1     UNKNOWN          1358318     1475054     0     1475054  
 07000007493E0B08     26     20054108     MMON     oracle     1     UNKNOWN          4072038     5660670     524288     5922814  
 070000075D3A9540     27     18481644     MMNL     oracle     1     UNKNOWN          2500182     2785774     0     2785774  
 070000075942FE30     28     14745928     MARK     oracle     1     UNKNOWN          8946326     9142766     0     9142766  
 070000077D3BEA18     29     11338438     SMCO     oracle     7     UNKNOWN          2684710     3047918     0     7635438  
 07000007553B5708     30     19726412     P000     oracle     2     UNKNOWN          2582359     4948462     720896     109937134  
   

Bu process'lerden SPID sütununu alıp orada ilgili process'imizin process id'sini alaraktan kill edebilir ve program hatalıysa bu programı kapatabiliriz.

Linux / Unix Komutu: Ps - Process Information - Process'ler Hakkında Bilgi

Linux veya Unix sistemdeki her process hakkında bilgi edinmek için ps komutunu kullanabiliriz. Ps komutu bize varolan aktif çalışan processlerin bir görüntüsünü gösterir. Ps komutu genelde kullanım kolaylığı açısında kullanıcıların istediği process'in çalışıp çalışmadığını görmek için grep komutuyla birlikte kullanılır.

 ps -e  
   
 ps -ef  
   
 ps -eF  
   
 ps -ely  
   
 ps axu  

Bütün Oracle Database Processlerini görmek için aşağıdaki komutu kullanabiliriz.

 ps -ef | grep -v grep | awk '{print $8}' | grep ora*  



Ps -o komutuyla ps komutunun çıktısını kendimize göre düzeltebiliriz.

 ps axo pid,command,args  



ps formatımızın default görünüm halini yukardaki gibi göstermek istiyorsak da aşağıdaki komutu kullanabiliriz.

 export PS_FORMAT=pid,command,args  
 ps auxww  


En çok çalışan 10 process komutu:

  ps -auxf | sort -nr -k 4 | head -10   






Linux / Unix Komutu: Kill - Process Kill - Process Durdurmak, Kill Etmek

Bir Process Neden Kill Edilmek İstenir?

Linux ve Unix'te kill komutu durmuş ve duraklamış cevap vermeyen process'ler için kullanılır. Windows'ta task manager gibi çalışır ve process'lere sinyal göndererek onları kapatır. Eğer herhangi bir sinyal ifade edilmediyse default olarak SIGTERM sinyalini kullanır.

Kill Komutuyla Neler Kill Edilebilinir?

Kill komutuyla sadece kendi processlerimizi kill edebiliriz. Root kullanıcısıyla sistem seviyesindekileri kill edebiliriz. Root kullanıcısıyla diğer kullanıcıların process'lerini de kill edebiliriz.

Bir Process Nasıl Kill Edilir?

Linux'ta bir process'i durdurmak için ilk önce kill etmek istediğimiz process'i ve PID'sini bulmalıyız.  Process'i bulmak için  önce aşağıdaki gibi "ps aux" komutunu kullanırız.

ps aux | grep oracle  


Komutun çıktısında 2. sütundaki değerler bizim process'lerimizin PID'sini temsil etmektedir. Buradaki PID'yi aldıktan sonra komutumuzu çalıştırabiliriz. Standart KILL SIGNAL değerimiz 15'tir(SIGTERM); ancak zorla öldürmek istiyorsak 9 sinyalini kullanırız. Diğer kill sinyalleri aşağıda sıralanmıştır. 





kill -s 15   
kill -s 15 2500



Birden Fazla Process Nasıl Kill Edilir?

Kill  komutu yanına birden fazla process koyularak birden fazla process kill edilebilinir.

kill -9 3521 1523 2555  

Pkill Komutu:

pkill komutu process'leri isim vererek kill etmemizi sağlar. Örneğin yukarıdaki örnek için pkill komutunu kullanırsak şöyle kullanmamız gerekir. 

 pkill -9 -u oracle vim 

Buradaki  "-u oracle" parametresi oracle kullanıcısını belirtirken "vim" parametresi ise process'in adını belirtir.

Killall Komutu:

Killall komutu her process'e kill komutunu gönderiri. Özel olarak öldürmek istediğimiz bir process ailesi varsa aşağıdaki gibi bir komut kullanabiliriz. Örneğin bütün apache process'leri kill etmek için: 

 killall -9 apache



22 Ağustos 2013 Perşembe

Oracle Veritabanı: Controlfile'ın File System'den ASM'e Geçirilmesi

İlk olarak  controlfile'ların bulunduğu yer belirlenir. Sqlplus'tan "show parameter control_file" veya TOAD'dan v$controlfile sorgulanır.

 select * from v$controlfile;  


Sonrasında database shutdown edilir ve startup nomount modunda başlatılır. Nomount modunda başlatılmasının nedeni nomount modda sadece parametreler okunurken, mount moda geçerken controlfile'lar okunmuş oluyor. Bu nedenle controlfile'ların okunduğu mount moddayken değişiklik yapılmaz.

 shutdown immediate;  
 startup nomount; 

Nomount moddayken rman'e bağlanılıp controlfile'ımızı ASM içerisine atacak komutumuzu çalıştırırız.

rman target /  
   
 restore controlfile to ‘+DATA’ from ‘/home/users/oracle/Desktop/standby_control.ctl’;


Sadece "+DATA" diye belirtmemizin nedeni Oracle'ın Oracle Managed File System(OMF) kullanmasıdır. Oracle dosya adlandırmasını kendisi yapacaktır.

 asmcmd;  
   
 cd +DATA/BERKE/CONTROLFILE  
   
 ls;  
 current.1387.681888623  
 current.1389.681888685  

Bunun dışında controlfile'ımızı database'imizin controlfile'ı kullanılmıyorken ya da database shutdown iken controlfile'ı direk kopyalarak da ASM'e atabilirdik.

Controlfile değişikliğini yaptıktan sonra parametre dosyamızda bu değişikliğin etkisini göstermesi için bir değişiklik yapmamız gerekir. Bu yüzden spfile'dan yaratacağımız pfile'ımızda controlfile'ımızın yeni yerini belirtiriz.

create pfile from spfile; 
vi initBERKE.ora  

Controlfile'ımızın yeni yerini belirttikten sonra database'i başlatırız. Controlfile değişikliği nedeniyle "RESETLOGS" ile açarız.

 alter database open resetlogs;  

En son adımda değişikliklerimizin geçerliliğini kontrol ederiz.

select * from v$controlfile;  
 show parameter control_file  




21 Ağustos 2013 Çarşamba

Oracle Veritabanı: Veritabanı - View'lar

Database'deki view'ları sorgulayabileceğimiz belirli tablolar bulunmaktadır. Bizim sıkça sorgulayacağımız tablolar ise dba_views ve all_source'dur. all_source tablosundan view'ların text'leri görülebilinir.

select text from all_source where type='VIEW'; 

Bütün view'ları görmek için :

 select * from dba_views;  

Burada çıkacak text kolonu long tipinde olduğu için TOAD'da çalışıtırlırsa iki kere kolon değeri üzerinde tıklanması gerekir.  Bunu engellemek için TOAD'da aşağıdaki komut script olarak yani F5 ile çalıştırılır.

set long 32646; 

View'ların status'unu ise dba_objects'den komtrol ederiz.


select * from dba_objects where object_type='VIEW' and status='INVALID'; 

View'ları günlük kontrolü gereklidir. Database'de yapılan import export'larda invalid olanlar çıkabilir. Invalid olanlar tekrar compile edilmelidirler. Bunun için invalid olanlar yukarıdaki sorguyla bulunduktan sonra aşağıdaki komut içinde view_adı kısmına yazılıp çalıştırılır.

 ALTER VIEW view_adı  
   COMPILE;   





Linux / Unix İşlem: İki Linux Makina Arasında Şifresiz Bağlantı - Connection Between Two Linux Machines

2 Linux makina arasında bağlantı gereken işlemler için yazılacak script'lerde şifre sorulmaması için  her makina da bazı işlemler yapılması gerekmektedir. Bunlar sayesinde kolayca ssh bağlantılarımızı yapabilir; istediğimiz log aktarımları, datafile geçişleri veya sadece kolay bir şekilde diğer makinaya bağlanma işlemleri gerçekleştirilebilinir.

Her iki kullanıcıda da .ssh klasörü oluşturulur. Bu klasör bütün linux makinalarında  bulunmasına rağmen test edilmesi önemlidir. Sonrasında gereken haklar verilir. Buradaki  "~" işareti kullanıcının "home" dizinini point eder.

 mkdir ~/.ssh  
 chmod 755 ~/.ssh 

Bu işlemlerden sonra ssh-keygen komutu çalıştırılır. Ssh-keygen komutu bizim için gerekli şifre kombinasyonlarını oluşturur.



ssh-keygen işlemleri sırasında bize sorunlan şifre alanı şifre verilmeden geçilir. Var olan dosyaya yazılma sorusunda ise direk evet denilerek geçilir.

 /usr/bin/ssh-keygen -t rsa  
 /usr/bin/ssh-keygen -t dsa  
   

Yukarıdaki komutları da üstteki resim gibi çalıştırdıktan sonra  aynı işlemleri  bağlanacağımız makinada da çalıştırırız. Sonuç olarak 2 makinada da ssh-keygen komutlarını çalıştırmış ve klasörlerini oluşturmuş oluruz.

Sonrasında 1.makinamızda bu işlemleri hangi kullanıcıyla yaptıysak eğer:

 cat ~/.ssh/id_rsa.pub>> ~/.ssh/authorized_keys  
 cat ~/.ssh/id_dsa.pub>> ~/.ssh/authorized_keys  

Buradaki komutlarımızda ssh kullanacağız. Karşı tarafta hangi kullanıcı ile bağlanıyorsak o kullanıcıyı kullanırız. Remote makinaya oracle kullanıcısı  ve kaebsorad1 makina adıyla bağlanıp oradaki  id_dsa.pub dosyasını buradaki authorized_keys'e append ederiz.


ssh oracle@kaebsorad1 cat/home/users/oracle/.ssh/id_dsa.pub >> /home/users/applmgr/.ssh/authorized_keys  

ssh oracle@kaebsorad1 cat/home/users/oracle/.ssh/id_rsa.pub >> /home/users/applmgr/.ssh/authorized_keys 

 Yukarıda rsa ve dsa olarak yarattığımız her iki anahtarı da karşı makinaya aktarırız.

1. makinada yaptığımız her işlemi 2. makinada da gerçekleştiririz. 2.makinaya geçip aşağıdaki işlemleri gerçekleştiririz.

 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys  
 cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys  
   
 ssh oracle@kaebsoapd1 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys  
 ssh oracle@kaebsoapd1 cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys  
 chmod 644 ~/.ssh/authorized_keys  

Bundan sonra her iki makinadan da şifresiz olarak geçiş sağlanabilinir.

Oracle Veritabanı: Datafile'ların Yerlerini Değiştirilmesi - Datafile Switch

Datafile Switch işlemini diskimiz bozulduğunda veya datafile'ların bir disk veya dizinden başka bir disk veya dizine taşınması gerektiğinde gerçekleştirebiliriz.

Bunun için aşağıdaki işlemi rman'de çalıştırmamız gerekir. Aşağıda göstereceğimiz işlemi datafileswitch.sql olarak bir dosyaya kaydedip rman'den çalıştırabiliriz.

İşlemler sırasında datafile'larımızın offline olması gerekmektedir. Yani işlemimizi Mount modda yapmamız gerekir. Bunun dışunda mutlaka datafile'larımızı restore edebileceğimiz bir backup'ın alınmış olması gerekir. Bir  felaket anında zaten hazırda olan bir backup'ımızı kullanırız; ancak disk değiştireceksek bunun için önce backup almamız gerekir.

 Shutdown immediate;  
   
 startup mount;  

Backup alınması için  rman'e bağlanırız.

 rman target /  

Backup için aşağıdaki komutumuzu çalıştırırız.

 backup database plus archivelog; 

Hazır rman'e geçmişken rman'de çalıştıracağımız sql dosyasını oluşturmaya başlayabiliriz. Bunun için çalıştıracağımız datafileswitch.sql dosyası içinde run komutumuzu oluştururuz.

run{   
  set newname for datafile '/u01/app/oracle/oradata/berke/users01.dbf' to '/home/users/oracle/Desktop/database/users01.dbf'   
   
 restore database;  
  switch datafile all;  
 recover database;   
  } 

Bu dosyayı oluşturup kaydettikten, dosyanın bulunduğu path'i rman'e vererek çalıştırırız.

@/home/users/oracle/Desktop/datafileswitch.sql  

Bu komutumuzu çalıştırdıktan sonra datafile'larımızın yerini değiştirmiş oluruz. Aynı zamanda datafile recovery de yapmış oluruz. Database bundan sonra RESETLOG'lar açılır.

alter database open resetlogs;  

 Bu işlemlerden sonra "best practice" olarak log file switch yaparız. Archive log'lama sürecini başlatırız. En sonunda bir backup daha alınır.

 alter system switch logfile;  
   
 alter system archive log all;  


 rman target /  
   
 backup database plus archivelog;  

Tek Bir Tablespacedeki Dosyaların İsmini veya Lokasyonunu Değiştirmek İstersek:

Not:Bu örneğimizdeki tablespace'imizin adı USERS'dır. Buradaki durumumuz datafile ismini değiştirmeye veya datafile'ların yerini değiştirmeye uygundur.

1-Tek bir tablespacede değiştirme işlemini yapacaksak önce tablespace'imizi offline mode'a alırız.

 ALTER TABLESPACE users OFFLINE NORMAL;  

2-Sonrasında datafileları işletim sistemi komutları kullanarak yer değiştirtiriz.

cp /u01/app/oracle/product/oradata/users01.dbf /home/users/oracle/users01.dbf 

3-Değiştirdiğimiz datafile'ları sisteme belirtmek için de aşağıdaki komutları uygularız.

 Alter tablespace users rename datafile '/u01/app/oracle/product/oradata/users01.dbf' to '/home/users/oracle/users01.dbf'

4-Bu işlemin ertesinde tablespace'imizi tekrar online mode'a alırız. Online mode'a aldıktan sonra backup alınması tavsiye edilir.

 Alter tablespace users online

Not: Bütün veritabanı datafile'larının yeri değişecekse veritabanını mount mode'a getiririz. Sonrasında "Alter database rename file ..... to ...." şeklinde komutumuz çalıştırırız.

Referans:

http://docs.oracle.com/cd/B28359_01/server.111/b28310/dfiles005.htm#ADMIN11434

15 Ağustos 2013 Perşembe

Oracle Veritabanı: Oracle Data Pump (Expdp and Impdp) Oracle Database 11g - Export ve Import İşlemleri

Oracle Data Pump eski "exp" ve "imp" komutlarına göre daha yeni, hızlı ve esnek bir tool olarak kullanılmaktadır. Temel import ve export işlemlerine istinaden PL\SQL komutları da kullanılmaktadır ve external tablolar için destek vermektedir.

Oracle Data Pump işlemlerimize başlamamız için öncesinde belirli yetkileri kullanıcılara vermeliyiz ve bir klasör yaratıp bunu database'e kaydettirmeliyiz.

Berke kullanıcısına read,write yetkilerini tanırız. Ayrıca import ve export'ları alacağımız klasörümüzü yaratırız.

CREATE OR REPLACE DIRECTORY test AS '/u01/app/oracle/ora/datapumpdir/';  
   
 GRANT READ, WRITE ON DIRECTORY test TO berke; 

Database'de tanımlı bütün klasörleri görmek için aşağıdaki şekilde sorgulama yapabiliriz.

select * from all_directories; 

Tablo import/export'u:

expdp berke/berke tables=employees directory=test dumpfile=employees.dmp logfile=expemployees.log  
   
 impdp berke/berke tables=employees directory=test dumpfile=employees.dmp logfile=impemployees.log


"TABLE_EXISTS_ACTION=APPEND"  argümanı var olan tablolara data eklenmesini sağlar. Bundan başka " TABLE_EXISTS_ACTION=TRUNCATE" ve "TABLE_EXISTS_ACTION=REPLACE" parametreleri da vardır. Amaca göre kullanılabilinirler.

Schema import/export'u:

Schemas kısımında import edeceğim şemayı belirtiyorum.


expdp berke/berke schemas=berke directory=test dumpfile=berke.dmp logfile=expdpberke.log  
   
impdp berke/berke schemas=berke directory=test dumpfile=berke.dmp logfile=impdpberke.log  


Database import/export'u:

"Full" argümanı yerine content=metadata_only dersek export'umuzu önemli oranda küçültebiliriz.


 expdp berke/berke full=Y directory=test dumpfile=berkefull.dmp logfile=berkefull.log  
   
 impdp berke/berke full=Y directory=test dumpfile=berkefull.dmp

Include ve Exclude Argümanları:

Export veya import işlemlerinde include ve exclude argümanları belirli objelerin import export edilmesini sağlar.

 expdp berke/berke schemas=berke include=TABLE:"IN ('employees', 'department')" directory=test dumpfile=berke.dmp logfile=expdpberke.log  
   
 expdp berke/berke schemas=berke exclude=TABLE:"= 'salary'" directory=test dumpfile=berke.dmp logfile=expdpberke.log  

Content Argümanı:

Content parametresi ile alacağımız export ve importlarda aldığımız tablo,tablespace veya database`in yapsını çıkartmıs oluruz.

Content=All veya Content=DATA_ONLY veya Content=METADATA_ONLY

expdp tables=employees content=METADATA_ONLY directory=test dumpfile=exp_content.dmp logfile=exp_content.log;


Network Export/Import'ları:

Network_link parametresi network export/import'u olarak kullanılacak kaynağı belirtir.


CONN / AS SYSDBA  
 GRANT CREATE DATABASE LINK TO berke;  
   
 CONN berke/berke  
 CREATE DATABASE LINK berke_link CONNECT TO apps IDENTIFIED BY apps USING 'DEV';

Bunun için ilk önce yukarıdaki gibi bir database link yaratırız. İlk önce "create database link" yetkisini alırız. sonrasında kaynak bilgisayara yönelticek şekilde link yaratırız.

Bu şekilde alacağımız export veya import'larda kaynakta erişeceğimiz bilgileri lokaldeki dizinimize atabiliriz. İşlemlerin yürüyebilmesi için her iki taraftaki kullanıcılarında "exp_full_database" yetkilerine sahip olması gerekir.

Ör: Export


 expdp berke/berke tables=apps.fnd_responsibility network_link=berke_link directory=test dumpfile=apps_fnd.dmp logfile=expdp_apps_fnd.log

Ör: Import
impdp berke/berke tables=APPS.fnd_responsibilty network_link=berke_link directory=test logfile=impdp_apps_fnd.log remap_schema=APPS:BERKE


Datapump'da Query ile Nasıl Data'lar Filter Edilerek Import/Export Yapılır?

Import/ Export ifadelerimize "Query" ifadelerini ekleyerek istediğimiz data'ları seçip alabiliriz.  Bu filtrelemeyide Query argümanına select ifadesini koyarak yapabiliriz.

QUERY=[[schema_adı.]tablo_adı:]koşul 

"Koşul" olarak yazdığımız kısım genelde where ifadesidir ama başka bir kısıtlayacı ifade olabilir.

Query parametresini aşağıdaki parametrelerle kullanamayız. Bunlar:


  • Content=Metadata_only
  • SQLFILE
  • TRANSPORT_TABLESPACES


Örnek olarak:

 impdp hr/hr DIRECTORY=test DUMPFILE=expfull.dmp  
  QUERY=departments:'"WHERE department_id < 120"' NOLOGFILE=Y 

Bu örneğimizde önemli olan kısım, eğer export'umuz full ise sadece bu koşula uygun olan verileri getirir. Eğer export'umuzda bu koşula göre alınsaydı import'da böyle bir koşul vermemize gerek kalmazdı.


Referans:
http://www.oracle-base.com/articles/10g/oracle-data-pump-10g.php
http://www.acehints.com/2012/06/data-pump-expdp-impdp.html

Oracle Veritabanı: Daily Checklist - Günlük Veritabanı Kontrolleri - Backup Kontrolleri

Sistemimizde mutlaka kontrol etmemiz gereken konu ise backup'ların alınıp alınmadığıdır. Backup'ların kontrolü aşırı önemlidir. Onların varlığı database'imizi bir felaket senaryosunda kurtarmamız için bir gereklilikdir. Bununla birlikte backup'lar alındıktan sonra bunların rman catalog'una yazılması, obsolete kalmış backupların veya gerekliliğini yitirmiş, backup stratejilerine göre kullanışlılığını yitirmiş olan backup parçalarının silinmesi de gereklidir; çünkü bunlar veritabanına göre çok fazla yer kaplaya bilmektedirler.

Bu yüzden ilk daha önce dediğimiz gibi önce ilk önce backup'ların durumunu katalogdakilerle eşleştiririz.

 crosscheck archivelog all;  
 crosscheck backup;  
 crosscheck backupset;  

Gereksiz olanları sileriz. Bir backup'ın gereksiz olup olmadığına backup stratejisine göre karar verebiliriz. Eğer incremental backup stratejisi uyguluyorsa 7 günden daha önce alınmış  archive log'lar silinebilinir. 1 Haftadan önce alınmış  backuplar silinebilinir.

DELETE NOPROMPT BACKUPSET DEVICE TYPE DISK COMPLETED BEFORE 'SYSDATE-1';  
   
 DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';  

Alınmış olan backupların durumu incelenmelidir. Bir gün önce alınan backupların başarıyla sonuçlanıp sonuçlanmadığı kontrol edilmelidir. 

select * from v$rman_status where object_type ='DB INCR' order by start_time desc ;  

Aynı şekilde normal alınmış database backup'ları da mutlaka kontrol edilmelidir.

select * from v$rman_status where OPERATION ='BACKUP' order by start_time desc ;  


Genel olarak backupların ne zaman başlatıldığı ne zaman bittiği nereye alındığı, hangi backup'ın alındığı gibi bilgiler için aşağıdaki komutu kullanabiliriz.

 select to_char(start_time,'dd.mm.yyyy hh24:mi:ss'),to_char(end_time,'dd.mm.yyyy hh24:mi:ss'),status,object_type,output_device_type from v$rman_status     
 where OPERATION ='BACKUP' order by start_time desc ;    

Yapılan backup joblarıyla ilgil daha ayrıntılı bilgi almak için aşağıdaki komut da kullanılabilinir.

SELECT * FROM (    
   SELECT TO_CHAR(start_time,'DD-MON-YY HH24:MI') "Start", TO_CHAR(end_time,'DD-MON-YY HH24:MI') "End", time_taken_display "Time", input_bytes_display "Input", output_bytes_display "Output", input_bytes_per_sec_display "Input/sec", output_bytes_per_sec_display "Output/sec",    
       output_device_type, status, input_type,    
 round(elapsed_seconds/60,2) "Elapsed Min", Optimized,    
 ROUND(compression_ratio,2) "Compress Ratio"    
    FROM v$rman_backup_job_details    
   ORDER BY session_key DESC    
 )    
 WHERE ROWNUM < 21;




Oracle Veritabanı: Daily Checklist - Günlük Veritabanı Kontrolleri - Status

Günlük kontrollerimizde ilk yapılması gerek kontrol her zaman durum kontrolleridir. Bu durum kontrolleri bariz olmakla beraber sorumluluğunuz altında onlarca veritabanı bulunuyorsa eğer gözünüzden kaçabilir. Böyle durumlar için ben şahsen script yazılmasını tavsiye ederim. Yoksa son derece sıkıcı olabilir.
Bakılacak belli başlı konuları aşağıda sıralayacağım.

Enterprise Manager Durumu:

 emctl status dbconsole;  
   
 emctl start dbconsole; 


Database Durumu:

 sqlplus / as sysdba;  
   
 select status from v$instance; 


DBMS_JOB Paketlerinin Durumu:

Çalışan DBMS_Job paketlerinin durumuna göre önemleri artabilir. Eğer bir istatistik DBMS_JOB'a atandıysa ve bu bir şekilde durduysa bunların devamlılığı sağlanmalıdır.

 select  
 job                j,  
 to_char ( last_date, 'hh24:mi:ss' ) last,  
 to_char ( this_date, 'hh24:mi:ss' ) this,  
 to_char ( next_date, 'hh24:mi:ss' ) next,  
 broken              b,  
 failures             f,  
 interval,  
 what  
 from dba_jobs;

Object ve Package'ların Durumu:

Hiçbir index'in veya package'ın invalid olmamasını sağlamak.

 select owner,object_name,object_type,status from dba_objects where   
 --status='INVALID' and  
 (object_type='INDEX' or object_type='PACKAGE'); 


Linux / Unix Komutu: Chown - Dosya Grup ve Sahibinin Değiştirilmesi

Chown komutu genelde chmod komutu ile birlikte çok kullanılan bir komuttur. Chown komutuyla dosyaların grup ve sahiplerinin değiştirilmesi sağlanabilinir. Bazı programlar kullanım sırasında dosyların sahiplerine ve gruplarına bakarlar. Bu yüzden dosyaların kimin kontrolünde yaratıldığı ve kimlerin kullanımına açık olduğu önemlidir. Bu işlemden sonra dosyanın write, read ve execute haklarına bakılır. Kullanımı aşağıdaki gibidir.

 chown kullanıcı dosya  
 chown kullanıcı:grup dosya  
 chown kullanıcı:grup klasör  

Burada -R'nin anlamı recursive olarak

 chown -R kullanıcı klasör  


Örnek kullanım:

 ls -lrt   
   
 -rw-r--r-- 1 root root 0 Jul 31 05:48 demo.txt  
   
 chown berke demo.txt  
   
 ls -lrt  
   
 -rw-r--r-- 1 berke root 0 Jul 31 05:48 demo.txt  

Oracle Veritabanı: Daily Checklist - Günlük Veritabanı Kontrolleri - Storage

Bu yazımızda database server'ındaki storage ile ilgili günlük kontrollerimizi yazacağız. Geçen yazımızda tablespace ile ilgil kontrollerimizi yazmıştık.

Storage kontrollerimizde ilk adımımız database server'ın bulunduğu makinada partition'ların boyutunu ölçmek olacaktır.

Bunun için bir işletim sistemi komutunu kullanabiliriz.

Linux sistemlerde:

 df -g  

Redhat'de:

 df -h

Microsoft sistemlerinde ise zaten "My Computer"'dan sağ klik'le bakabiliriz; ama onun dışında cmd'yi açıp oradan da partition adına göre aşağıdaki komut çalıştırılabilinir.

 fsutil volume diskfree C:  
 fsutil volume diskfree D:  

Buradaki doluluk oranlarına bakmamızın nedeni sistemde yer kalıp kalmadığını görmektir. Bu şekilde sistemde gerektiğinde temp dosyaları silip silmememiz gerektiğini ya da sisteme yeni disk gerekip gerekmediğini belirleyebiliriz.

Peki sistem genelinde yer yoksa napılır?

Alert Loglar
Alert logların silinmesi ihtimali düşünebilir. Alert log'ların sistemdeki lokasyonunu sqlplus'a bağlanıp "show parameter dump diyerek bulabiliriz.

 SQL> show parameter dump  

Buradan da background_dump_dest parametresinin gösterdiği lokasyona gidip oradaki trace dosyalarını silebiliriz.

Alert log'un bulunduğu yer  $ADR_HOME/trace klasörü olarak geçmektedir. Her .trc uzantılı dosya için bir tane .trm uzantılı dosya bulunmaktadır. Trm uzantılılar trace metadata dosyaları olarak görülmektedir. Trm dosyalarındaki metadatalar trc dosyalarındaki trace kayıtlarını gösterir. Trace metadatası ADRCI gibi tool'lar tarafından kullanılabilinir.

Archive Loglar
Archive logların arşivlenmiş ve ziplenmiş olarak tutulması önemlidir. Archive log konusunda sadece bugünün ve dün kayıtlarının tutulması yeterlidir.

select * from v$logfile;  
select * from v$log;  

Yukarıdaki tabloları inceleyerek hangi archive logların ziplenebilieceği görülebilinir.

Ayrıca sistemde log'lar için gerekli yer kalıp kalmadığı da gözlemlenmelidir. Bunu önce archive log dizinini aşağıdaki şekilde bularak sonra da oradaki yer miktarını inceleyerek yapabiliriz.

SQL> show parameter log%dest  
 log_archive_dest_1          string   LOCATION=+ARCHLOG  

Yukarıdaki örneğimizde  log dosyalarının bulunduğu yer ASM'de bir yer olduğu için ortamımızı ASM ortamına geçiririz. Sonrasında "lsdg" komutu ile direk boyut bilgilerini öğrenebiliriz.

Control File'lar

Controlfile'ların varlığı sistemlerde sürekli kontrol edilmelidir. Zaten bunlardan birinin kapanması database'in bozulmasına ve açılmamasına yol açar.

 select * from v$controlfile; 


Listener Loglar
Sqlnet.logları çok büyümüş ise bu loglar silinip tekrar yaratılabilinirler. Sqlnet logları $ORACLE_HOME/network/log  kısımında bulunurlar.




14 Ağustos 2013 Çarşamba

Oracle Veritabanı: Daily Checklist - Günlük Veritabanı Kontrolleri - Tablespace

Günlük olarak database'de neler yapılmalı?

Günlük olarak database'de genel kontroller gerçekleştirilmelidir. Bu genel kontroller içerisinde hem sistemsel veriler kontrol edilmeli, hem database object'lerinin yani tablo, view, index gibi unit'lerin boyutları, durumları kontrol edilmeli, database'in performansı ölçülmeli, backup'ların alınıp alınmadığı gibi kontroller yapılmalıdır.

Bunlar için karışık olarak şimdi belirteceğimiz kontroller yapılabilinir:

1- Tablespace Kontrolleri:

Tablespace kontrollerinde ilk olarak var olan tablespace'lerin kapladığı boyutlarla ilgili query'leri çalıştırır ve bunlarla ilgili rapor almaya çalışırız. Toad kullanlar için bunun bir kısa yolu vardır. Database tab'ı altında Administer>Tablespaces seçeneğini tıklayarak bir grafik elde edebiliriz.

Tablespace kontrollerinin amacı tablespace büyüklükleriyle ilgili bilgi edinmek, büyüme oranlarıyla ilgili öngörüde bulunmak ve eğer tablespace'in büyüme için bir yeri kalıp kalmadığını öğrenmektir.

Bununla birlikte rapor hazırlarken bize kendimizin kullanabileceği sorgular gerekir.

Datafile'larla ilgili gerekli bilgiler için aşağıdaki query'i kullanabiliriz.

select file_name, tablespace_name, bytes, autoextensible,maxbytes from dba_data_files; 

Bu sorguyla tablespace'lerin hepsinin ne kadar yer kapladığını bulabiliriz.

 select tablespace_name, sum(bytes)/1024/1024/1024 from dba_data_files group by tablespace_name ; 



Buradaki sorgu ise en kapsamlı sorgu konumundadır. Buradaki sorguda maksimum kullanılabilicek doluluk oranlarına göre tablespace'ler sıralanır. Şu anki varolan sınırlara göre doluluk oranlarına bakılmak istenirse "order by pct_used" yapılmalıdır.

 SELECT tablespace_name,  
 megs_alloc,  
 megs_free,  
 megs_used,  
 pct_free,  
 pct_used,  
 MAX megs_max,  
 case when MAX=0 then 0 else round(100 * (megs_used / MAX)) end used_pct_of_max  
 FROM (SELECT a.tablespace_name,  
 round(a.bytes_alloc / 1024 / 1024) megs_alloc,  
 round(nvl(b.bytes_free, 0) / 1024 / 1024) megs_free,  
 round((a.bytes_alloc - nvl(b.bytes_free, 0)) / 1024 / 1024) megs_used,  
 round((nvl(b.bytes_free, 0) / a.bytes_alloc) * 100) pct_free,  
 100 - round((nvl(b.bytes_free, 0) / a.bytes_alloc) * 100) pct_used,  
 round(maxbytes / 1048576) MAX  
 FROM (SELECT f.tablespace_name,  
 SUM(f.bytes) bytes_alloc,  
 SUM(decode(f.autoextensible, 'YES', f.maxbytes, 'NO', f.bytes)) maxbytes  
 FROM dba_data_files f  
 GROUP BY tablespace_name) a,  
 (SELECT f.tablespace_name, SUM(f.bytes) bytes_free  
 FROM dba_free_space f  
 GROUP BY tablespace_name) b  
 WHERE a.tablespace_name = b.tablespace_name(+)  
 UNION ALL  
 SELECT h.tablespace_name,  
 round(SUM(h.bytes_free + h.bytes_used) / 1048576) megs_alloc,  
 round(SUM((h.bytes_free + h.bytes_used) - nvl(p.bytes_used, 0)) / 1048576) megs_free,  
 round(SUM(nvl(p.bytes_used, 0)) / 1048576) megs_used,  
 round((SUM((h.bytes_free + h.bytes_used) - nvl(p.bytes_used, 0)) / SUM(h.bytes_used + h.bytes_free)) * 100) pct_free,  
 100 - round((SUM((h.bytes_free + h.bytes_used) - nvl(p.bytes_used, 0)) / SUM(h.bytes_used + h.bytes_free)) * 100) pct_used,  
 round(SUM(f.maxbytes) / 1048576) MAX  
 FROM sys.v_$temp_space_header h,  
 sys.v_$temp_extent_pool p,  
 dba_temp_files f  
 WHERE p.file_id(+) = h.file_id  
 AND p.tablespace_name(+) = h.tablespace_name  
 AND f.file_id = h.file_id  
 AND f.tablespace_name = h.tablespace_name  GROUP BY h.tablespace_name)  ORDER BY used_pct_of_max DESC;


Yukarıdaki sorguyla aynı işi yapan başka bir sorguda aşağıdaki gibidir.

 SELECT total.tablespace_name,      
     total_space total__mb,  
     round(nvl(total_space-Free_space, 0),2) used__mb,   
     round(nvl(free_space, 0),2) free__mb,  
     round(nvl(total_space-free_space, 0)/total_space*100,2) percent  
 FROM  
  (select tablespace_name, sum(bytes/1024/1024) Free_Space  
    from sys.dba_free_space  
   group by tablespace_name  
  ) Free,  
  (select tablespace_name, sum(bytes/1024/1024) TOTAL_SPACE  
    from dba_data_files b  
   group by tablespace_name  
  ) Total  
 WHERE free.tablespace_name = total.tablespace_name(+)  
 order by percent desc;  


Buradaki sorgumuzda ise database'imizdeki yıllık büyüme miktarını bulabiliriz.

 select to_char(creation_time, 'RRRR MM') "Month",    
 sum(bytes)/1024/1024/1024 "Growth in GB"    
 from sys.v_$datafile    
 where creation_time > SYSDATE-730    
 group by to_char(creation_time, 'RRRR MM')  
 order by "Month";    

Tablespacelerın ay olarak değişimlerinin toplamlarının hesaplanmış olarak görülmesi olarak düşünülebilinir. Bu değişimlerden sonra silinmiş dosyalar göz önüne alınmamıştır. Sadece aylık olarak artışlar belirtilmiştir.

Tablespace'deki Boş Blokların Bulunması:

Aşağıdaki sorguyla veritabanımızda boş olan blokların görülmesini sağlayabiliriz. Bu şekilde bir tablespace'de ne kadar boş alan olduğunu ve burada değişiklik yapılması gerekip gerekmediğini görebiliriz.

 select file_id, block_id first_block, block_id+blocks-1 last_block,   
 segment_name  
    from dba_extents  
    where tablespace_name = 'SYSTEM'  
   union all  
   select file_id, block_id, block_id+blocks-1, 'free'  
    from dba_free_space  
   where tablespace_name = 'SYSTEM'  
   order by file_id, first_block;  


Tablespace'deki Bir Kullanıcıya Ait Tabloların Büyüklüklerinin Bulunması:

Aşağıdaki sorgumuzla kullanıcılarımıza ait tablolardan büyüklüklerinin bulunması ve büyüklüklerine göre gereki tablolarda block kontrolü, bozulmuş blok gibi kontrol işlemlerini yapabilir, çok fazla büyük tablo varsa bu konuda yazılımcı uyarılabilinir. Ayrıca bulunan tablolara göre performans arttırmak için partitionlar ayrılması veya materialized view yaratılması gibi önlemler alabiliriz.

SELECT  
   owner, table_name, TRUNC(sum(bytes)/1024/1024) Meg  
 FROM  
 (SELECT segment_name table_name, owner, bytes  
  FROM dba_segments  
  WHERE segment_type = 'TABLE'  
  UNION ALL  
  SELECT i.table_name, i.owner, s.bytes  
  FROM dba_indexes i, dba_segments s  
  WHERE s.segment_name = i.index_name  
  AND  s.owner = i.owner  
  AND  s.segment_type = 'INDEX'  
  UNION ALL  
  SELECT l.table_name, l.owner, s.bytes  
  FROM dba_lobs l, dba_segments s  
  WHERE s.segment_name = l.segment_name  
  AND  s.owner = l.owner  
  AND  s.segment_type = 'LOBSEGMENT'  
  UNION ALL  
  SELECT l.table_name, l.owner, s.bytes  
  FROM dba_lobs l, dba_segments s  
  WHERE s.segment_name = l.index_name  
  AND  s.owner = l.owner  
  AND  s.segment_type = 'LOBINDEX')  
 WHERE owner in UPPER('&owner')  
 GROUP BY table_name, owner  
 HAVING SUM(bytes)/1024/1024 > 10 --Çok küçük değerleri ölçmek için  
 ORDER BY SUM(bytes) desc  
 ;  

Bütün Database'in Büyüklüğünün Bulunması 


 select  
 ( select sum(bytes)/1024/1024/1024 data_size from dba_data_files ) +  
 ( select nvl(sum(bytes),0)/1024/1024/1024 temp_size from dba_temp_files ) +  
 ( select sum(bytes)/1024/1024/1024 redo_size from sys.v_$log ) +  
 ( select sum(BLOCK_SIZE*FILE_SIZE_BLKS)/1024/1024/1024 controlfile_size from v$controlfile) "Size in GB"  
 from  
 dual;  

Referans:
http://gavinsoorma.com/2009/06/daily-dba-checklist-to-ensure-database-high-availability/

Linux / Unix Komutu: Unzip - Dosyaların Arşivden Çıkarılması

Unzip komutuyla ziplenmiş dosyaları paketlerinden çıkartabiliriz. Bu komut kısaca

 unzip {zip_dosyası_adı} -d /{içine_çıkartılacak_dosya_adı}  
 cd {içine_çıkartılacak_dosya_adı}  
 ls  

Eğer sadece "unzip {dosya_adı}" komutunu yazıp çalıştırsaydık zip dosyasının içeriği direk olarak zip dosyasının bulunduğu klasöre atılacaktı.

Eğer birden fazla dosyayı arşivden çıkarmak istiyorsak, aşağıdaki şekilde yazmamız gerekir.

 unzip '*.zip'  

Yukarıdaki komutta önemli olan linux'un wild karakterleri algılamasını sağlamak. Bunu da kısaca ' ' işaretlerini kullanarak yapabiliriz. Buradan çıkartacağımız sonuçta tırnak işaretleri içine istediğimiz regexp' yazdırabiliriz.


Oracle Veritabanı: Active Database Duplication Yapılması

Active Database Duplication'da backup'sız direk database'leri kopyalayabiliriz. Daha önceden yedekten kopyalama(Duplication işlemi) yapmıştık.  İlk olarak ana sistemimizin archivelog mod'da olması gerekir.

select log_mode from v$database; -- Archive log mode'da olup olmadığını kont- rol etmek için 


Bu kopyalama metodunda da her iki database server içinde "tnsnames.ora" dosyalarında eklemeler yapmak gerekir. Bunun için $ORACLE_HOME/network/admin dosyasına gidip tnsnames.ora dosyalarına kopyalanacak sistemin bilgileri eklenir.

LISTENER1 =   
  (DESCRIPTION =   
   (ADDRESS_LIST =   
   (ADDRESS = (PROTOCOL = TCP)(HOST = berkedup1)(PORT = 1521))   
   )   
   (CONNECT_DATA =   
   (ORACLE_SID = orcl)   
   )   
  ) 


Bu değişikliği yaptıktan sonra rman'de hem target database'e hem de auxiliary database' bağlantı yaparız.
Rman connection string'lerle ilgili daha fazla bilgiyi buradan bulabiliriz.

  rman target berke/berke@orcl auxiliary sys/manager@orcl1   


En son olarak da "DUPLICATE" komutumuzu çalıştırırız.

 duplicate database to orcl   
  from active database    
  spfile   
  nofilenamecheck;   

Oracle Veritabanı: Rman ile Database Duplicate Etmek

Rman ile bir backup'tan veya Active Database'den duplicate veya replicate oluşturabiliriz. Farklı bir sistemde aynı dosya düzeniyle var olan sistemden bir tane daha yaratabiliriz.

Şimdi vereceğimiz örnekteki senaryomuz aynı database adıyla ve aynı sistem ve dosya düzeninde bir veritabanı oluşturulması olacaktır.


Backup Bazlı Duplicate Yapılması:

İlk önce Rman'le database bağlanıp bir full backup alırız. Bu backupları orijinal sistemde alırız.

rman target /
configure controlfile autobackup on;
backup database plus archivelog;

Yukarıdaki şekilde database'i yedekledikten sonra yaratacağımız duplicate session için bir password dosyası yaratırız.

orapwd file=/u01/app/oracle/product/11.2.0/db_1/dbs/orapwDB11G password=password entries=10


Password dosyası yaratıldıktan sonra karşılıklı olarak 2 veritabanına da birbirleri arasında bağlantı sağlamak için "tnsnames.ora" dosyalarına gerekli bilgiler yazılır.

Kaynak Veritabanına Eklenecek  Bilgi

LISTENER1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = Duplicate_hostname)(PORT = 1521))
    )
    (CONNECT_DATA =
      (ORACLE_SID = orcl)
    )
  )

Kopya Veritabanına Eklenecek Bilgi

LISTENER2 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = Kaynak_hostname)(PORT = 1521))
    )
    (CONNECT_DATA =
      (ORACLE_SID = orcl)
    )
  )

"Tnsnames.ora" dosyasına gerekli değişiklikler yapıp bir pfile dosyasını oluştururuz. Bu pfile dosyasını kopya veritabanına gönderip bununla kopya veritabanını açarız.

create pfile='/home/users/oracle/Desktop/pfiledup1' from spfile;

$ scp -r berke@berkehost1:/home/users/oracle/Desktop/pfiledup1 /home/users/oracle/Desktop/

Dosya düzeni aynı olacağı için hiçbir değişiklik yapılmasına gerek yoktur.

Pfile'da gerekli değişiklikler yapılabilir. Bu değişiklikler kopya sistemdeki farklılıklara bağlıdır. Database adı aynı kalacaksa, datafile dosyalarının yerleri değişmeyecekse bir değişikliğe gerek yoktur.

Artık pfile'da yarattığımıza göre aldığımız backup'ı karşı tarafa (kopya veritabanına) atabiliriz.

$ scp -r berke@berkehost1:/u01/app/oracle/fast_recovery_area/orcl/archivelog /u01/app/oracle/fast_recovery_area/DB11G
$ scp -r berke@berkehost1:/u01/app/oracle/fast_recovery_area/orcl/backupset /u01/app/oracle/fast_recovery_area/DB11G
$ scp -r berke@berkehost1:/u01/app/oracle/fast_recovery_area/orcl/autobackup /u01/app/oracle/fast_recovery_area/DB11G

Şimdi duplicate database'e bağlanıp pfile ile açabiliriz.

export ORACLE_SID=orcl   
  sqlplus / as sysdba   
  SQL>; startup nomount pfile='/home/users/oracle/Desktop/pfiledup1'; 

Database'i başlattığımıza göre artık ana makinamızdaki rman'den kopya sistemimize  bağlanabiliriz. ,

 rman auxiliary / 

Duplicate işini aşağıdaki komutlardan birisiyle başlatabiliriz.

Duplicate target database to ORCL  


İşlem tamamlanınca database'i "alter database mount; alter database open;" ile açabiliriz.