Updates from Şubat, 2016 Toggle Comment Threads | Tuş takımı kısayolları

  • dutali 12:52 am on 2016-02-22 Kalıcı Bağlantı | Cevapla
    Tags: OFA, Optimal Flexible Architecture, oracle_base, oracle_home, oui   

    Oracle’ı nereye kuralım – Optimal Flexible Architecture (OFA) 

    Linux üzerinde Oracle veritabanı kuracaksanız kurulumu nereye yaparsınız? Kök dizinde bir klasör mü yaratırsınız yoksa kullanıcı klasörünü mü seçersiniz? Kurulumu ayrı bir partition’a mı kurarsınız kullanıcıların dosyalarının veya sistem dosyalarının olduğu partition’a mı? Kurulum için seçtiğiniz yol ve partition ne kadar önemli? Diski nasıl parçaladığınız performansı ne kadar etkiler?

    OFA (Optimal Flexible Architecture.Türkçesi ile : En uygun esnek mimari ) Oracle veritabanı kurulumu için Oracle’ın takip edilmesini önerdiği birtakım standartlar bütünüdür. Standartlar, oracle kurulum klasörlerini isimlendirilmesi, veritabanı dosyalarını isimlendirilmesi, disk partition yapısının belirlenmesi gibi konularda kurallar içerir.

    Peki ne işe yarar?

    Veritabanının ve sistemin bakım işlemlerini kolaylaştırır ve maliyetlerini düşürür
    Performansının yüksek olmasına yardım eder
    Gerektiğinde aynı mimaride genişletilebilmesi imkanını verir

    Oracle universal installer (OUI) sistem üzerinde işlemler yaparken öncelikle OFA standartlarına uygun klasör yapısı olup olmadığına bakar. Var ise ne ala. OUI tarafından yaratılacak olan diğer klasör yolları OFA standartlarına uygun olacaktır. Yoksa atanan çevre değişkenlerine de bağlı olarak yaratacağı dosya-klasör yollarına karar verir.

    İdeal durumda OUI, kök dizinde u01,u02 gibi isimlendirilmiş ve mount point olan klasörler bekler. Kurulumun ayrı bir disk birimi üstünde olması önemlidir. Bu şekilde oracle dosyaları sistem dosyalarından ve kullanıcıların dosyalarından ayrık bir halde durur . Bu, hem sistem performansı ve disk kapasitelerinin karşılıklıetkilememesi için önemlidir hem de bakım-yedekleme ve geri yükleme prosesleri için hayati değerdedir
    İsimlendirme standart olduğundan ve kuralları, unix sistemlerdeki FSH ( Filesystem Hierarchy Standard ) standartlarına benzediğinden, sistem kullanıcıları klasör yollarına ve ihtiyaç duydukları dosyalara daha kolay erişirler

    OFA ‘ya uygun kurulumda;

      • Dosya sistemindeki bütün bağlantı noktaları (mount point) /pm sentaksına göre adlandırılmalı.

    Burada;
    p :herhangi bir metin ,
    m : numaralandırmak maksatlı sayı.

    Mesela /part01, /part02 gibi veya varsayılan olarak /u01, /u02 gibi olmalı

    • Oracle base klasörü /pm/h/u sentaksına göre isimlendirilmeli. Dikkat! Oracle Base klasörü birden çok oracle uygulamasına ev sahipliği yapabilir

    Burada;

    pm :bağlanma noktası ( mount point).
    h :standart klasör ismi ( app gibi)
    u : kurulumu gerçekleştiren işletim sistemi kullanıcısıdır.

    Oracle kullanıcısı ile kurulum yaptı iseniz Oracle base şu şekilde olacak: /u01/app/oracle .

    • Oracle home klasörü, birden fazla oracle ürünü veya sürümünün kurulumunda şu desene göre verilmeli
      /pm/h/u/product/v/type_[n].

    Burada;

    pm : bağlanma noktası
    h : standart klasör ismi (app gibi)
    u : kurulumu gerçekleştiren işletim sistemi kullanıcısı
    v :uygulamanın versiyonu
    type: kurulan uygulamanın tipi, n ise aynı uygulama birden fazla kurulabileceği için verilen numaradır. Ör: veritabanı ise db_1, db_2, client için client_1, client_2

    • Veritabanı performansını ve güvenilirliğini artırmak için bileşenler farklı disklere dağıtılmalı. Bunun için şeritli birimlerden (striped volume) ve aynalanan birimlerden (mirrored volume) oluşan diskler kullanılabilir.
      ASM kullanıyorsanız bu şartlar zaten sağlanıyordur.

     

    Şimdi OFA standartlarına uygun olarak ve oracle kullanıcısı ile gerçekleştirilen standart kurulumda oluşan örnek klasör yollarına bakalım

      • Oracle Base klasörü

    /u01/app/oracle

      • Birden fazla uygulama varsa bu uygulamaların home dizinleri

    /u01/app/oracle/product/11.1.0/db_1
    /u01/app/oracle/product/11.2.3/db_2
    /u01/app/oracle/product/11.2.3/crs

      • Veri dosyaları diğer bağlanma noktalarına dağıtıldığında veri dosyalarının yolu ( veri dosyalarını dağıtmak tercih edilir ise)

    u02/app/oracle/oradata
    /u03/app/oracle/oradata
    /u04/app/oracle/oradata

      • Başka kullanıcılar tarafından kurulan başka oracle uygualamaları için Oracle Base klasörü

    /u01/app/diger_kullanici/

      • Orainventory dosyasının konumu;

    /u01/app/oraInventory

    şeklinde olur.

     
  • dutali 1:51 am on 2016-02-10 Kalıcı Bağlantı | Cevapla  

    Oracle DB- Şemadaki objelere toptan yetki vermek 

    Özelikle veriambarı projelerinde şemalar arasında yetki-erişim sorunu sık sık yaşanır. Bazı işlemler sık sık temp tablo yaratılması ve düşürülmesi gerektirir. Bazen de veritabanında birbiri ardına gelen uzun projeler nedeniyle her daim yeni objeler yaratılır ya da objeler üzerindeki yetkiler kaybedilerek tekrar yaratılır.

    Peki bu sorun nasıl aşılabilir?

    Başka bazı veritabanlarında bir şema başka bir şemanın tüm yetkilerine ,sonradan yaratılan objeler de dahil, otomatik olarak sahip olabiliyor. Maalesef oracle bu konuyu çözebilmiş değil . Ya da çözmeye çalışmıyor.

    Sistem yöneticisinin telefonunu hızlı aramalara eklemek bir çözüm olabilir. Prosedürlerle uğraşmayı sevmeyen kültürümüz buna kolay bir çözüm bulmuş durumda: Sık sık yetki ihtiyacı olan şemayı DBA yetkisi ile donatmak. Bu en çok kullanılan yöntem olsa gerek ki normal kullanıcılara DBA yetkisi verilmeyen veritabanı daha görmedim.

    Sistematik çözüm uygulayanlar her yeni yaratılan obje sonrası çalışmak üzere gerekli yetkileri atayan prosedürler kullanırlar. Bu da ancak canlı ortamda düşürülüp yaratılabilen temp tablolar için bir çözüm. Diğer durumlar için gene kullanıcının sadece prosedürü çağırmak şeklinde olsa da müdahalesi gerekli olur.

    Disiplin gerektirmeyen bir yöntem olarak da her akşam çalışacak ve belirli bir şemadaki tüm objeler için başka bir şemaya belli başlı yetkileri veren bir prosedür yazılabilir. Her ne kadar amaca yönelik ve çok kesin çözüm sağlamasa da gene de işe yarar ve sistemde DBA enflasyonunu azaltır.

    Yazmak için zaman ayırmak istemeyenler için aşağıda belli başlı hakları belli başlı objeler için toptan veren prosedür. Sistem ihtiyaçlarına uygun olarak değişiklik yapılabilir

    Prosedürün invoker right ile çalışacak şekilde yazıldığına ve user_object yerine all_object tablosuna sorgu atıldığına dikkat edin. Prosedürü ya objelerin sahibi olan şema, ya da DBA yetkisine sahip olan şema kullanabilecektir.

     

    CREATE OR REPLACE PROCEDURE grant_all_scheme_to_scheme (
    owner_scheme_in   IN VARCHAR2
    , scheme_in         IN VARCHAR2)
    AUTHID CURRENT_USER IS
    l_owner_check   NUMBER := 0;
    l_scheme_check         NUMBER := 0;
    CURSOR objects_cur (owner_in VARCHAR2) IS
    SELECT object_name, object_type
    FROM all_objects
    WHERE     1 = 1
    AND object_type IN (‘FUNCTION’
    , ‘PROCEDURE’
    , ‘PACKAGE’
    , ‘TABLE’
    , ‘VIEW’
    , ‘SEQUENCE’)
    AND owner = owner_in;
    /*Ebubekir Çelik-2014
    Parametreler:
    SCHEME_IN: yetki verilecek şema
    OWNER_SCHEME_IN: içinde bulunan tablo,prosedür vs objelere erişilmesi istenen şema
    SCHEME_IN ile verilen şema için , OWNER_SCHEME_IN şemasındaki TABLE, VIEW ,FUNCTION, PROCEDURE, PACKAGE, SEQUENCE türündeki
    objelere (obje türlerine bağlı olarak) çalıştırma,seçme, kayıt ekleme yetkisi verir.

      ÖR:
    BEGIN
    grant_all_scheme_to_scheme( ‘HR’,’OE’)
    END;

    */
    BEGIN
    SELECT COUNT (*)
    INTO l_owner_check
    FROM all_users
    WHERE username = owner_scheme_in;

       IF l_owner_check <> 1 THEN
    raise_application_error (-20002
    , ‘ Kaynak şema bulunamadı : ‘ ||
    owner_scheme_in);
    END IF;

       SELECT COUNT (*)
    INTO l_scheme_check
    FROM all_users
    WHERE username = scheme_in;

       IF l_scheme_check <> 1 THEN
    raise_application_error (-20003
    , ‘ Yetki verilecek şema bulunamadı : ‘ ||
    scheme_in);
    END IF;

       FOR rec IN objects_cur (OWNER_SCHEME_IN) LOOP
    IF rec.object_type IN (‘FUNCTION’, ‘PROCEDURE’, ‘PACKAGE’) THEN
    EXECUTE IMMEDIATE
    ‘GRANT EXECUTE ON ‘ || OWNER_SCHEME_IN || ‘.’ || rec.object_name || ‘ TO ‘ || scheme_in;
    ELSIF rec.object_type IN (‘TABLE’) THEN
    EXECUTE IMMEDIATE
    ‘GRANT SELECT ON ‘ || OWNER_SCHEME_IN || ‘.’ || rec.object_name || ‘ TO ‘ || scheme_in;
    EXECUTE IMMEDIATE
    ‘GRANT INSERT ON ‘ || OWNER_SCHEME_IN || ‘.’ || rec.object_name || ‘ TO ‘ || scheme_in;
    ELSIF rec.object_type IN ( ‘VIEW’) THEN
    EXECUTE IMMEDIATE
    ‘GRANT SELECT ON ‘ || OWNER_SCHEME_IN || ‘.’ || rec.object_name || ‘ TO ‘ || scheme_in;
    ELSIF rec.object_type IN (‘SEQUENCE’) THEN
    EXECUTE IMMEDIATE
    ‘GRANT SELECT ON ‘ || OWNER_SCHEME_IN || ‘.’ || rec.object_name || ‘ TO ‘ || scheme_in;
    ELSE
    NULL;
    END IF;
    END LOOP;
    DBMS_OUTPUT.put_line (‘İşlem başarılı’);
    EXCEPTION
    WHEN OTHERS THEN
    RAISE;
    END;


     

     

    Görüşmek üzere

     
  • dutali 4:38 am on 2016-02-07 Kalıcı Bağlantı | Cevapla
    Tags: bulk collect fetch forall oracle   

    Büyük hacimli verileri yükleme – Bulk insert 

    Çok büyük hacimli tablolardan veri çekme ve yükleme, eğer kaynak tablo doğru partition yapısında ve doğru şekilde indekslenmemiş ise makinanın gücüne göre çok yavaş olabilir

     

    Böyle bir durumda PL-SQL in çok önemli bir özelliği olan BULK COLLECT ifadesi kullanılarak yükleme yapılabilir. Bu  ifade ile birlikte INSET, UPDATE, MERGE ve DELETE ifadeleri kullanılabilir. Birçok başka kullanım şekli ve amacı da var ama biz kısıtlı olarak nasıl büyük hacimli verilerde performans sağladığıyla ilgileneceğiz

     

    Tabii ki başka yollarla da performans artışı şağlanabilir. Mesela kaynak tablo üzerinde uygun şekilde  partition oluşturma ve indeksleme yapmak, sorguyu (mümkün ise) daha verimli hale getirmek, PL-SQL döngüsü ile veriyi parça parça çekmek, sorguya uygun hint yazmak , pipelined table functions ( türkçe önerisi olan?) veya bunları birlikte yapmak.

    Fakat kaynak tablonun hacmi fiziksel hafızadan çok daha büyük olduğu bir durum düşünün. Veriyi tek bir set halinde çekmek ve işlemek diğer çalışanları da zor durumda bırakacaktır. BULK COLLECT ifadesi bu durum için iyi bir çözüm. Çünkü veriyi LIMIT ifadesi ile sınırlanan birden parçalar halinde çeker ve işler. Buna alternatif olarak kaynak tabloya partition eklenip gene PL-SQL döngüsü ile veriyi parça parça yükleyebilirsiniz. Fakat gene de her seferinde devasa bir tabloya filtre uygulamak zorunda kalırsınız.

    Peki her seferinde veriyi filtrelemeden parçalar halinde işlemenin yolu yok mu? rownum kullanılamaz mı? Hayır.  Oracle, rownum değerini veri setini ürettikten sonra koyar. MySQL bilenler için garip bir eksiklik olarak görülebilir

     

    Şimdi örneğimize geçelim. Örneğimiz oe.orders tablosundan dw.fct_orders tablosuna 10.000 er parçalar halinde veri yükleyecek

     

    DECLARE
    TYPE t_order_raw_data IS TABLE OF dw.fct_orders%ROWTYPE
    INDEX BY BINARY_INTEGER;
    l_order_raw_arr   t_order_raw_data;
    l_chunk_size      NUMBER := 20000;
    CURSOR order_raw_cur  IS
    SELECT /*+ PARALLEL(f 16)*/
    FROM oe.orders f;
    BEGIN
    OPEN order_raw_cur;  LOOP
    FETCH order_raw_cur
    BULK COLLECT INTO l_order_raw_arr
    LIMIT l_chunk_size;
    EXIT WHEN order_raw_cur%NOTFOUND;
    FORALL i IN INDICES OF l_order_raw_arr SAVE EXCEPTIONS
    INSERT INTO dw.fct_orders
    VALUES l_order_raw_arr (i);

    END LOOP;

       CLOSE order_raw_cur;
    END;

     
  • dutali 1:49 am on 2016-02-07 Kalıcı Bağlantı | Cevapla
    Tags: oracle manually_delete linux centos uninstall deinstall elle_kaldırma manuel_kaldırma   

    Linux makinada Oracle ‘ı manuel olarak tamamen kaldırma 

    Oracle veritabanını kurmak kadar kaldırmak ta bir problem olabilir. Eğer oracle veritabanını kaldırmanın kolay olduğunu düşünen birini görürseniz ya çok mütevazidir ya da daha kaldırma gereği duymamıştır.

    Özellikle sistemde birden fazla oracle ürünü kuruluysa ve de kurulumlar standart klasör yolları ve en uygun ayarlar ile yapılmamış ise risk katlanılmaz olabilir.  Daha da kötüsü veritabanı ciddi hasar görmüş ise  deinstall scriptleri çalışmıyor ise ..

    Böyle bir durumda tercih edilebilecek yok veritabanı uygulamasını ve instanceları  elle kaldırmak olacaktır.

    Örnek olarak Centos 6.5 üzerinde standart klasör yapısı ile kurulmuş bir oracle veritabanı uygulamasının ve buna bağlı instanceların kaldırılmasını inceleyelim.

    Öncelikle

    • Klasik yollarla kaldırmayı deneyin  ( deinstall script).Başarılı olursanız bu reçeteyi çöpleri temizlemek için takip edin.
    • Kaldırma işlemine başlamadan önce usr/local/bin/oraenv  dosyasını, etc/oraInst.loc dosyasını , /u01/app/oracle/oraInventory dosyası gibi kritik dosyaları ve veritabanından kurtarabileceğiniz verileri ( ya da veri dosyalarını) yedekleyin
    • Bazı dosyaları silebilmek için root yetkisine ihtiyacınız olacak. root yetkisine sahip olduğunuzan emin olun.
    • Herhangi bir dosyayı silmeden önce o dosyanın ilgili klasörde olduğuna emin olun! Bazı kurulumlarda dosya yolları farklı olabilir, dosya isimleri değişik olabilir.!  Toplu silme işlemi yapmadan önce dosyaları listeleyip neyi sildiğinizden emin olun!
    • Her yaptığınız işlemi kaydedin
    • Birden fazla reçeteyi takip ederek yaptığınız işlemden emin olun
    • Her ne kadar aşağıdaki işlemler defalarca denemiş olsa da her durumu karşılamayabilir.
    • Dikkatli olun!

    Dikkat! Sistemde kurulu başka oracle uygulaması var mı? Diğer uygulamalara zarar vermemek için yazıyı dikkatle okumadan komutları çalıştırmayın. Oracle veritabanı uygulamasını değil de sadece tek bir oracle instance ‘ı kaldıracaksanız bu reçete size göre değil!!

     

    • Öncelikle çalışan oracle veritabanı instance  ve listener var ise durdurun. Eğer durduramıyor iseniz proseslerden oracle instance ı bulun ve kill komutu ile öldürün. Bunun için isteme root yetkileri ile girmenizde fayda var.

    ! Başka oracle uygulamaları da var ise komutu daha dikkatli kullanın. Diğer prosesleri öldürmeyin!

      Örnek:

    Oracle instanceları ve listenerları bulup öldürmek için  ps komutu ve öldürmek içik kill komutu ..  Oracle kullanıcısı ile kurulum yapıldığı için instanceları rahatlıkla ayırabiliyoruz

    #ps -aef | grep lsnr

    oracle 17935 1     0 2013  /u01/app/11.1.0.7/.. LISTENER

    root   97983 81338 0 2013 grep lsnr

    kill –9 17935

    #ps –ef | grep  ora_

    oracle   111345    1  0 2013   ora_pmon

    oracle   135789    1  0 2013   ora_smon

    ..

    #kill –9 111345 135789

    ! Proses isimleri kurulumdan kuruluma farklılık gösterebilir. Kendi kurulumunuza ait proses isimlerini ve desenini öğrenin

    • ORACLE_HOME dizinini ve altındaki her şeyi silin

    Burada ORACLE_HOME oracle veritabanının home dizinidir. Başka oracle uygulamaları kurulu ise ORACLE_HOME çevre değişkeni değiştirilmiş olabilir.

    Genel olarak oracle veritabanı için ORACLE_HOME

    /u01/app/oracle/product/11.2.0/dbhome

    veya daha kötü bir kurulumda

    /oracle/ora_apps/oradb/product/11.1.0/dbhome

     

    gibi bir klasör yolundadır

    Örnek:

    # rm -rf /u01/app/oracle/product/11.1.0/dbhome_1

    • Oracle veritabanının zamanlanmış görevlerini (cron job) kaldırın .

    var/spool/oracle

    dosyasında oracle uygulamalarının zamanlanmış görevleri bulunur.  Önce içinde ne var bakın

    Ör:

    [root@localhost cron]# cat oracle
    0,15,30,45 * * * * /u01/app/oracle/product/11.1.0/dbhome/.. -cron -silent start

    0,15,30,45 * * * * /u01_apps/oracle/odi/ … 

    Başka oracle uygulaması yüklü değilse bu dosyayı silin!! 

    # rm -rf /var/spool/oracle

    Fakat yukarıdaki örnekte ikinci satırda oracle veritabanı değil ODI için zamanlanmış görev de var.

    Bu durumda yapmamız bu dosyayı açarak sadece veritabanı zamanlanmış görevi bulunan satırları silmek

    • /etc klasörüne girin. Bu klasörde oracle ile ilgili iki tane dosya göreceksiniz . Bu  dosyalar ora ile başlar !

    [root@localhost /]# ls -l /etc/ora*
    -rw-r–r– 1 root root 32 Jan 9 2014 /etc/oracle-release
    -rw-rw-r– 1 oracle oracle 734 Jan 2 08:53 /etc/oratab
     

      oracle-release dosya işletim sisteminin oracle-linux versiyonunu gösterir ( oracle linux a çevirdi iseniz). Bu dosyaya dokunmayın!
      oratab dosyasında sistemdeki oracle veritabanı uygulamalarını ve bunlara bağlı veritabanı instanceları bulunur. Biz şimdi tüm veritabanı ve uygulamalarını kaldırmak istediğimizden bu dosyayı sileceğiz.

    #rm -rf etc/oratab

    ! Bu dosyayı kaldırmak için root yetkisi gereklidir!

    ! Bazı kurulumlarda bu dosya /var/opt/oracle altında olabilir

    • Oracle çevre değişkeni dosyalarını silin </LI>

    #rm -f /usr/local/bin/coraenv
    #rm -f /usr/local/bin/oraenv
     

    • Eğer tüm oracle uygulamalarını kaldıracaksanız tüm oracle uygulamaları tarafından kullanılan şu dosyayı silin

    # rm -rf /etc/oraInst.loc

    ! Bu dosyayı kaldırmak için root yetkisi gereklidir!

    • OraInventory dosyasını silin

    # rm –rf  /u01/app/oracle/oraInventory

    Bu dosya ne işe yarar? http://gerardnico.com/wiki/database/oracle/orainventory

    Bu dosya temiz kurulum yapmak için çok kritik. tek bir kurulum olan makinada dbhome_2 gibi isimlerin sorumlusu işte bu dosya.Önceki kurulumun nerede izi kaldı diye arıyorsanız ilk bakmanız gereken yer burası!!

        Tertemiz makinamız hazır.

     
c
Compose new post
j
Next post/Next comment
k
Previous post/Previous comment
r
Cevapla
e
Düzenle
o
Show/Hide comments
t
En üste git
l
Go to login
h
Show/Hide help
shift + esc
Vazgeç
%d blogcu bunu beğendi: