Oracle Veritabanının Quiesce Durumuna Alınması Nedir?

Bu yazımda Oracle Veritabanının Quiesce durumuna alınmasından bahsedeceğim. Genelde prod sistemlerde kullanılmaz. Ama ne olduğunu bilmekte fayda var diye düşünüyorum.

Quiesce kelimesinin sözlük anlamı “susturmak” demektir. Gerçektende veritabanını susturuyor :)) Quiesce moduna alınan bir veritabanı DBA dışında kimsenin sorgu çalıştırmasına, PL/SQL kod çalıştırmasına izin vermez. Veritabanında sadece SYS ve SYSTEM kullanıcıları işlem yapabilir. Bu kullanıcıların şifrelerinide sadece DBA ler bildiği için dolayısıyla sadece DBA ler işlem yapabilmektedir. Şunuda hatırlatayım hemen; Bir kullanıcı DBA rolüne sahip olsa bile işlem yapamaz. Ancak SYS ve SYSTEM ile bağlanarak işlemini gerçekleştirebilir.

Peki veritabanımızı nasıl Quiesce moduna alabiliriz. SQL*Plus aracına SYS user ile bağlanıp aşağıdaki gibi yapabiliriz.

SQL> ALTER SYSTEM QUIESCE RESTRICTED;

Bu işlemden sonra Active kullanıcı işlemleri inactive oluncaya kadar devam eder. Yani var olan aktif  işlemler sonlanıncaya kadar işlemler başarılı devam eder. Inactive olan bir oturum aktif duruma geçmek isterse hung olur. Yani cevap vermez. Bu oturumlar veritabanı Quiesce modundan çıkarıldıktan sonra devam edebilir.

RAC ortamlarında bu komut çalıştırılırsa bütün instance lar etkilenir. Bunuda unutmamak gerekir. Yukarıdaki komut çalıştırıldığında veritabanı aktif olan işlemlerin bitmesini bekler. Bu durumda inactive olmasını beklediğimiz kullanıcıları aşağıdaki sorgu ile tespit edebiliriz.

SQL> select bq.sid, username, osuser, program, machine

from v$blocking_quiesce bq, v$session s

where bq.sid = s.sid;

Veritabanımızı normal haline aşağıdaki gibi geri döndürebiliriz.

SQL> ALTER SYSTEM UNQUIESCE;

Veritabanımızın Quiesce durumunu V$INSTANCE görüntüsünü (view) sorgulayarak öğrenebiliriz.

SQL> select active_state from v$instance;

3 durum görebiliriz. NORMAL – Veritabanı normal durumda. QUIESCING – Veritabanı Quiesce moduna alınmış ama henüz tamamlanmamış. Yani active oturumlar var. QUIESCED – Veritabanı Quiesce modunda çalışıyor.

Talip Hakan Öztürk

Reklamlar

Oracle UNDO Parametrelerinin Optimize Edilmesi

Merhaba Arkadaşlar,

Bu makale ile ORACLE ayrılmaz parçası UNDO muzu nasıl optimize edebiliriz sorusunun cevabını inceliyor olacağız.

Veritabanında oluşan transaction undo bilgileri commit veya rollback yapılana kadar rollback segmentlerinde tutulmaktadır. Bazen veritabanındaki uzun süren sorgularımız “ORA-01555:Snapshot Too Old” hatası ile karşılaşmaktadır. Bu UNDO parametrelerimizin doğru konfigüre edilmediğinden kaynaklanmaktadır.  UNDO_RETENTION parametresiyle, biz veritabanının commit sonrası ne kadar undo verisini tutacağına karar veririz. Bu parametre default 900 sn gelmektedir. Sonradan bu değeri yükseltmek bizim elimizdedir. 900sn(15 dk) değerini yükseltmek doğru orantılı olarak daha fazla space gerektirecektir. Rollback segmentlerini tanımlamak ve yönetmek zahmeti yerine, undo tablespace i oluşturmak ve undo yönetimini oracle a bırakmak oldukça kolaydır. UNDO_MANAGEMENT parametresini AUTO olarak set ettiğinizde ORACLE gerisini kolay bir şekilde halledecektir. “ORA-01555:Snapshot Too Old” hatasından kurtulmanın yolları UNDO_RETENTION parametresi ve UNDO Tablespace büyüklüğünün doğru konfigüre edilmesinden geçmektedir 🙂

Peki UNDO_RETENTION süremiz ne kadar olmalıdır? Bu sorunun cevabı UNDO Tablespace büyüklüğünüzle orantılıdır. UNDO Tablespace için diskinize ve verilerinizin kritikliğine göre bir alan verebilirsiniz. Bu büyüklüğe görede optimum süreyi hesaplayarak UNDO_RETENTION parametresini set etmelisiniz.

Şimdi biraz matematiksel hesap yapalım. Önce Undo tablespace büyüklüğümüzü aşağıdaki sorgu ile tespit edelim;

SELECT SUM(a.bytes) as UNDO_SIZE
  FROM v$datafile a,
       v$tablespace b,
       dba_tablespaces c
 WHERE c.contents = 'UNDO'
   AND c.status = 'ONLINE'
   AND b.name = c.tablespace_name
   AND a.ts# = b.ts#;

Sonra saniye başına undo block sayısını bulalım;

SELECT MAX(undoblks/((end_time-begin_time)*3600*24)) as UNDO_BLOCK_PER_SECOND
  FROM v$undostat;

Son olarak veritabanı block size ımızı bulalım;

SELECT TO_NUMBER(value) as DB_BLOCK_SIZE
 FROM v$parameter
WHERE name = 'db_block_size';

Şimdi elde ettiğimiz üç sonuca göre optimum UNDO_RETENTION süremizi hesaplayacağız. Kullanacağımız formül şu şekilde;

 UNDO RETENTION TIME=(UNDO SIZE)/(DB BLOCK SIZE × UNDO BLOCK PER SECOND)

 Yukarıda hesapladığımız değerleri bu formülde yerlerine yerleştirdiğimizde optimum UNDO_RETENTION süremizi bulmuş olacağız.

Şimdi olaya tersden bakalım. Yeteri kadar disk yerimiz ve kritik veritabanı işlemlerimiz varsa, commitlenmiş undo verilerimizi tutmak için  UNDO RETENTION süremizi 1 saat (3600 sn) olarak düşünüyorsak optimum UNDO büyüklüğümüzü yukarıda vermiş olduğum formülden yararlanarak hesaplayabiliriz. Bu durumda formülümüz;

UNDO SIZE=UNDO RETENTION TIME × DB BLOCK SIZE × UNDO BLOCK PER SECOND

Son olarak hepsini tek bir sorgu ile çözelim. Optimum UNDO_RETENTION süresini bulmak için;

SELECT d.undo_size/(1024*1024) as UNDO_SIZE,
       SUBSTR(e.value,1,25) as UNDO_RETENTION,
       ROUND((d.undo_size / (to_number(f.value) *
       g.undo_block_per_sec))) as OPTIMUM_UNDO_RETENTION
  FROM (
       SELECT SUM(a.bytes) undo_size
          FROM v$datafile a,
               v$tablespace b,
               dba_tablespaces c
         WHERE c.contents = 'UNDO'
           AND c.status = 'ONLINE'
           AND b.name = c.tablespace_name
           AND a.ts# = b.ts#
       ) d,
       v$parameter e,
       v$parameter f,
       (
       SELECT MAX(undoblks/((end_time-begin_time)*3600*24))
              undo_block_per_sec
         FROM v$undostat
       ) g
WHERE e.name = 'undo_retention'
  AND f.name = 'db_block_size';

Belirleyeceğimiz UNDO RETENTION süresine göre optimum UNDO büyüklüğünü bulmak için;

SELECT d.undo_size/(1024*1024) as UNDO_SIZE,
       SUBSTR(e.value,1,25) as UNDO_RETENTION,
       (TO_NUMBER(e.value) * TO_NUMBER(f.value) *
       g.undo_block_per_sec) / (1024*1024)
      as NEEDED_UNDO_SIZE"
  FROM (
       SELECT SUM(a.bytes) undo_size
         FROM v$datafile a,
              v$tablespace b,
              dba_tablespaces c
        WHERE c.contents = 'UNDO'
          AND c.status = 'ONLINE'
          AND b.name = c.tablespace_name
          AND a.ts# = b.ts#
       ) d,
      v$parameter e,
       v$parameter f,
       (
       SELECT MAX(undoblks/((end_time-begin_time)*3600*24))
         undo_block_per_sec
         FROM v$undostat
       ) g
 WHERE e.name = 'undo_retention'
  AND f.name = 'db_block_size';

Veritabanımızın son açıldığı andan itibaren kaç ORA-1555 hatası aldığını merak ediyorsanız aşağıdaki sorgu ile bulabilirsiniz.

  select '"ORA-01555 (Snapshot too old)" hata sayısı: ' 
  || sum(ssolderrcnt)
  from v$undostat;

Optimum değerlerimizle sağlıklı çalışan veritabanlarınız olması dileğiyle 🙂

Talip Hakan ÖZTÜRK

Oracle WRAP Utility

Oracle WRAP UTility

Merhaba Arkadaşlar,

Bu yazımda sizelere “WRAP” aracının ne olduğunu? PL/SQL kodlarımızı bu araç ile nasıl gizleyebileceğimizi anlatacağım. Oracle, yazdığı paketlerin (internal packages olarak bilinir) içeriğini wrap ile gizlemektedir. Mesela DBMS ile başlayan DBMS_JOB, DBMS_SCHEDULE, v.s paketlerin body kısmını görmek istediğimizde aşağıdaki gibi gizlenmiş olarak görmekteyiz.

CREATE OR REPLACE PACKAGE BODY SYS.dbms_job wrapped
a000000
1
abcd
abcd
abcd
abcd
abcd
abcd
21a3 b16
lo1iuGKabyEptQ7AYEgtdK75BmEwg5Wr3l4FYKAPamS0YVj3PRYchH0hld1fVjvwrMuAW69P
IRpr66AU9anSde7G/s0SEqGnRq1lMtPIv5oS+LkLjWMsdviZ/8mTU+AsGapF4qqdz3JR4PZt
fzqcP2JOVo84jcefz+RAsEnvMxsTLRYBAxaBTlykY2wPpW6+XqZvj/lmCFhU18E/3TEWpRQb
5qZckusO2rpG787GwuV+s2zCeeXxFg4vs4uaQo05AYljfhxjOKSSbLg3TUk/VlckCE6PhXK/
...
/

Bizde Oracle kurulumu ile gelen “WRAP” aracını kullanarak yazdığımız procedure, function veya paketleri gizleyebiliriz. Oracle 10g R2 ile birlikte DBMS_DDL paketi yardımı ile de dinamik kod gizleme işlemi yapabiliriz. WRAP komutu işletim sistemi üzerinde çalışan bir araçtır. Kullanım prototipi aşağıdaki gibidir.

wrap iname=input_file  oname=output_file

Burada iname, bizim içeriğini gizleyeceğimiz PL/SQL kod bloğudur. Oname ise gizlenmiş kod bloğunun kaydedileceği dosya adıdır. Oname belirtmeyebiliriz. Bu durumda source kodun bulunduğu dosya adı(input_file) “.plb” uzantısıyla kaydedilir. Aşağıdaki gibi bir prosedürümüz olsun. Ve “WRAP” aracını kullanarak içeriğini gizleyelim.

CREATE OR REPLACE PROCEDURE talip_test AS
BEGIN
  DBMS_OUTPUT.PUT_LINE('Test proseduru');
END;
/

Yukarıdaki prosedürü talip_test.sql adıyla işletim sistemi üzerine kayıt edelim. “WRAP” ile içeriğini aşağıdaki gibi gizleyelim.

$ wrap iname= talip_test.sql
PL/SQL Wrapper: Release 11.2.0.1.0- Production on Thu Mar 10 13:50:13 2011
Copyright (c) 1993, 2009, Oracle.  All rights reserved.
Processing talip_test.sql to talip_test.plb

talip_test.plb isimli gizlenmiş kod bloğumuz oluştu. Bir editör ile baktığımızda içeriği aşağıdaki gibidir.

CREATE OR REPLACE PROCEDURE talip_test wrapped
a000000
1
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
7
4d 89
BnIWMXkTu2kwu8RXi1DM+jgMrZUwg5nnm7+fMr2ywFwWoUf6VuOWoWLRzLh0i8DAMv7Shglp
uFKbskr+KLK957KzHQYwLK4k6rKBL8jlrFHkBneJJVEJMi720eokH/Y5pqcyH4I=
/

Gizlenmiş yukarıdaki kodu veritabanına direk deploy edebiliriz. Deploy ettikten sonrada problemsiz kodumuzu aşağıdaki gibi çalıştırabiliriz.

SQL>exec talip_test;

Talip Hakan ÖZTÜRK

Oracle Database 11g R2 Kurulumu

ORACLE DATABASE 11G R2 KURULUMU
Oracle Enterprise Linux 5 Kurulumu makalesiyle OEL 5 kurulumunu adım adım birlikte öğrenmiştik. Sonraki makalemizde sunucumuzu Oracle DB 11gR2 kurulumuna hazırlamak için set etmemiz gereken parametreleri öğrendik. Artık Oracle DB 11gR2 kurulumuna geçip veritabanımızı oluşturma vakti geldi. Bu makalemizde Oracle DB 11gR2 kurulumunu yine adım adım numaralandırarak sizlere anlatacağım. Aksi belirtilmedikçe aşağıdaki işlemleri oluşturduğumuz oracle kullanıcısı ile yapacağız.
1. http://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-linuxsoft-085393.html adresinden Linux 32 bit için indirdiğimiz iki adet zip dosyasını sunucu üzerinde owner ı oracle kullanıcısı olan bir dizine WinSCP programı ile kopyalayalım. Ve Linux a oracle kullanıcısı ile login olduktan sonra dosyaları aynı dizinde unzip ile extract ediyoruz.
$ unzip linux_11gR2_database_1of2.zip
$ unzip linux_11gR2_database_2of2.zip
2. Unzip yaptığımız installation klasöründe oluşan database klasörüne gidiyoruz. Ve runInstaller ile setup işlemimizi başlatıyoruz.
$ cd /installation/database/
$ ./runInstaller
3. Email adresinizi ve security update leri indirebilmek için oracle support şifrenizi isteyen ilk ekran sizi karşılayacaktır. Burayı boş geçiyoruz. Sonradan da bu bilgileri girebiliriz.

4. Boş bıraktığımız için bir uyarı penceresi gelecektir. YES diyerek devam ediyoruz.

5. Next ile devam ettiğimizde 3 seçenek karşımıza çıkacaktır. Birincisi RDBMS software kurulumunu ve veritabanını oluşturur. İkincisi sadece RDBMS software i kurar (Sonradan DBCA ile veritbanını oluşturmamız gerekir). Üçüncüsü varolan veritabanını upgrade etmek içindir. Biz birinci seçeneği işaretleyip devam ediyoruz. Upgrade ve DBCA yı sonraki makalelerimizde ayrıca inceleyeceğiz.

6. Kurulumun hangi class üzerinde olacağını soran aşağıdaki ekranda, Server Class seçeneğini işaretliyoruz. Şayet kendi desktop pc nize veya laptop a kurulum yapacaksanız birinci seçeneği seçmelisiniz. Aradaki farklılık sadece konfigürasyon farklılığıdır. Server Class da daha gelişmiş konfigürasyon seçenekleri mevcuttur.

7. Kurulumun Single Instance olduğunu belirtiyoruz ve devam ediyoruz. (İleride RAC kurulumunuda yapacağız)

8. 2 seçenek karşımıza çıkıyor. Typical install basit konfigürasyon seçeneklerini bize sunar. Biz Advanced install seçeneğini seçip ilerleyeceğiz.

9. 8. Adımda Typical install seçecek olursak aşağıdaki gibi bir ekran bizi karşılar.
Oracle base dizini seçilir (Önceki makalemizde bu dizini oluşturmuştuk).
Software location seçilir. (Oracle home dizini olarak bilinir)
Storage tipi olarak “File System” seçiyoruz.
Veritabanı dosyalarının bulunacağı “database file location” dizinini belirtiyoruz
Database edition olarak “Enterprise Edition” seçiyoruz
OSDBA Group olarak önceki makalemizde oluşturduğumuz dba grubunu seçiyoruz.
Global Database Name olarak veritabanımızın adını giriyoruz.
Son olarak bir yönetim şifresi giriyoruz

10. 8. Adımda Advanced install seçeneğini işaretlersek (bizim tercihimiz) ürün dilini seçeceğimiz aşağıdaki ekran gelir. Burada değişiklik yapmadan English ile devam ediyoruz.

11. Enterprise Edition ı seçiyoruz. Sağ alt köşede bulunan “Select Options” ile ek özellikleride seçebiliriz. Next ile devam ediyoruz.

12. Oracle base ve software location (oracle home dizini) klasörlerimizi seçiyoruz.

13. Oracle home dizininin boş olmadığını belirten aşağıdaki gibi bir uyarı verebilir. Bu önceki makalemizde oluşturduğumuz bash_profile dosyasından dolayıdır. YES diyerek devam edebiliriz.

14. Oracle inventory bilgilerinin tutulduğu klasör dizinini seçiyoruz. Grup olarak daha önceki makalede oluşturduğumuz oinstall grubu seçiyoruz.

15. Veritabanının ne amaçla kullanılacağını seçiyoruz. OLTP veritabanı için ilk seçeneği veri ambari için ikinci seçeneği işaretlemeliyiz. Biz OLTP oluşturacağımız için ilk seçenekle devam ediyoruz.

16. Veritabanı adını ve SID i giriyoruz. DB adı ve SID aynı isim olabileceği gibi farklıda olabilir.

17. Automatic Memory management ı enable edip etmeyeceğimizi belirtiyoruz.

18. İkinci tabda kullanacağınız karakter seti seçmelisiniz. Ben karakter set olarak Turkish WEISO8859P9 seçeceğini seçiyorum.

19. Veritabanı yönetimi için Database control (Enterprise manager olarakta bilinir) ün yükleneceği belirtiliyor. Email notifikasyonu için istenirse SMTP sunucusu burada belirtilebildiği gibi kurulum sonrasında da set edilebilir.

20. File system kullanacağımızı ve veritabanı dosyalarımızın bulunacağı dizini belirtiyoruz. ASM (Automatic Storage management) opsiyonunu daha detaylı başka bir makalede inceleyeceğiz.

21. Automated backup kullanıp kullanmayacağımızı belirtiyoruz. Kullanacak isek FRA (Flash Recovery Area) dizinini belirtiyoruz. Kurulum sonrasıda konfigürasyon yapabiliriz. Ben enable etmeden devam ediyorum.

22. SYS,SYSTEM,SYSMAN ve DBSNMP kullanıcıları için şifre belirliyoruz. Her kullanıcı için ayrı şifre girebileceğimiz gibi hepsinde ortak aynı şifreyi de verebiliriz.

23. İşletim sistemi seviyesinde daha önceki makalede oluşturduğumuz dba grubunu seçiyoruz. OSDBA ve OSOPER için aynı grubu seçiyorum. (Aynıda olabilir,farklıda. Ben aynı seçiyorum)

24. Kurulum öncesi tüm konfigürasyonları ve önceki makalede set ettiğimiz parametreleri check ediyor. Bir parametreyi bile eksik yazdığımızda bu aşamada Fail hatası verecektir. Fail verdiğinde ekranın aşağısındaki açıklama kısmında Expected Value (Beklenen değer) ve Actual Value (Şimdiki değer-Bizim girdiğimiz) değerlerini inceleyip gerekli düzeltmeyi yapıp tekrar üst tarafta bulunan “Fix&Check Again” butonu ile tekrar kontrol yapmasını sağlayabiliriz. Fail olan parametrenin gerçekten önemsiz olduğunu düşünüyorsak “Ignore All” kutucuğunu işaretleyip Finish diyebiliriz.(Çok dikkatli olmalıyız. En ufak eksik parametre sonradan kurulumun yarıda kesilmesine sebep olabilir)

25. Ve nihayetinde kurulum başlıyor.


26. 5. Adımda Software kurulumunun ardından veritabanını oluştur seçeneğini işaretlemiştik (1. seçenek). Kurulum tamamlandığında aşağıdaki gibi veritabanını oluşturan DBCA (Database Configuration Assistant) otomatik başlayacaktır.(DBCA yı ayrıca detaylı inceleyeceğiz)

27. Kurulum tamamlandığında aşağıdaki gibi bir uyarı penceresi gelecektir. “Root” kullanıcısı ile iki script sırasıyla çalıştırılmalıdır. Scriptler çalıştırılmadan bu pencereye OK denilmemelidir.
Ayrı bir console açılır ve root kullanıcısı ile login olduktan sonra scriptleri aşağıdaki gibi çalıştırabiliriz.

Birinci script(oraInventory yetkileri düzenlenir)
$/u01/app/oraInventory/orainstRoot.sh
Changing permissions of /u01/app/oraInventory.
Adding read,write permissions for group.
Removing read,write,execute permissions for world.
Changing groupname of /u01/app/oraInventory to oinstall.
The execution of the script is complete.
İkinci script (ortam değişkenleri set edilir. Bize dizin sorduğunda ENTER ile devam edebiliriz.)
$/u01/app/oracle/product/11.2.0/db_1/root.sh
Running Oracle 11g root.sh script…
The following environment variables are set as:
ORACLE_OWNER= oracle
ORACLE_HOME= /u01/app/oracle/product/11.2.0/db_1
Enter the full pathname of the local bin directory: [/usr/local/bin]:
Copying dbhome to /usr/local/bin …
Copying oraenv to /usr/local/bin …
Copying coraenv to /usr/local/bin …
Creating /etc/oratab file…
Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root.sh script.
Now product-specific root actions will be performed.
Finished product-specific root actions.
28. Scriptleri çalıştırdıktan ve yukarıdaki çıktıları elde ettikden sonra uyarı penceresine OK diyebiliriz. Son olarak aşağıdaki ekran gelecektir. Close ile çıkabiliriz.

29. Oracle DB 11gR2 kurulumumuz tamamlanmıştır. Şimdi console da sqlplus ile veritabanımıza bağlanabiliriz.

İlgili Makaleler:
Oracle Database 11G R2 Kurulumu için Enterprise Linux Üzerinde Yapılması Gerekenler
Oracle Enterprise Linux 5 Kurulumu

Talip Hakan ÖZTÜRK