Bugün database’ in performansı ile ilgili belli aralıklarla alınmakta olan snapshotların, bizler için ne ifade ettiğinden, nasıl alınabileceğinden, çalışma şeklinden ve nasıl configure edileceğinden bahsetmek istiyorum.
Automatic Workload Repository (AWR), problemi tespit etmek ve self-tuning yapabilmek amacıyla istatistik toplar. Toplanan bu istastikler ise hem memoryde hem de veritabanında saklanır.
AWR istatistikleri neleri içerir, nelerden oluşur ;
* Erişim ve kullanım istatistiklerini belirlemek için Object İstatistikleri,
* Session bazında, zaman modelli istatistikleri (ki alınan bu istatistikleri V$SYS_TIME_MODEL ve V$SESS_TIME_MODEL viewlerinden görebiliriz.)
* Bazı system ve session istatistiklerini, (bu istatistikleride V$SYSSTAT and V$SESSTAT viewlerinden izleyebiliriz)
* System üzerinde çalışma süresi ve CPU kullanımında top olan sql statmentları ile ilgili istatistikleri,
* ASH istastikleri, son sesessionlara ait işlemler ile ilgili istastikleri
İçerir.
Database istatistikleri AWR aracılığıyla toplanır ve defaultunda enable olarak gelir ve bu opsiyon Statistics_level inital parametsiyle kontrol edilir. Awr’ ın çalışabilmesi için statistic_level parametresi mutlaka TYPICAL veya ALL olarak set edilmelidir. Defaultunda Typical olarak geldiği içinde AWR’ ın defaultu enable’ dır. Bu değer BASIC olarak set edildiğinde artık database’ in istatistikleri toplanmayacağı anlamına gelmektedir. (AWR disable olacağından) Bu parametrenin BASIC olması performans açısından da (tabloların zaman içerisinde structure’ ları, size’ ları, indexleri değişeceğinden, çalışan sql’ lere ait execution planları da zamanla yanlış ve yavaş çalışmaya başlayacağından) olumsuz sonuçlar doğuracaktır. Dolayısıyla bu önerilen bir durum değildir. AWR, database’ in istatistiklerini belirli periyodlarda otomatik olarak alır, eğer statistics_level parametresi BASIC ise yani AWR disable ise, manuel olarak DBMS_WORKLOAD_REPOSITORY package’ ı kullanılarak AWR istatistikleri alabilirsiniz. Ancak system istatistiklerinin büyük bir kısmı (segment istatistikleri ve memory advisor bilgileri gibi) disable olacağından anlık olarak alınmaya çalışılan istatistikler tam olmayabilir.
Ne olduğundan bahsettik, şimdi biraz da Automatic Workload Repository ile ilgili kavramlar üzerinde duralım biraz, sonrasında yönetimi ile devam edeceğiz ;
* Snapshots ;
Snapshots, ADDM tarafından performans karşılaştırmaları yapmak için kullanılan, belirli bir zaman aralığına ait verilerin history bilgisini turarlar. Oracle’ ın kurulumu ile birlikte default olarak her saat başında otomatik olarak çalışır ve saat başında alınan bu snapshot’ larıda 8 gün boyunca saklar. Saat başında otomatik olarak alınmasının yanında, istenildiği anda manuel olarak da snapshot alınabilir. AWR tarafından alınan snapshotlar, Automic Database Diagnostic Monitor (AADDM) tarafında da otomatik olarak incelenmektedir.
AWR raporları, iki dönem arasındaki performansı karşılaştırarak, performans kaybına yol açan sql statementlarının tespit edilmesine yardımcı olur. Oracle 10g ile birlikte tanışmış olduğumuz AWR ve ADDM, kullanıcılardan performans ile ilgili şikayetlerin arttığı zamanlarda sorunun tespiti açısından ciddi rol oynamaktadırlar.
* Baselines ;
Baseline, belli bir zaman aralığındaki performans ile ilgili dataları içerir.
* Adaptive Thresholds
Adaptive thresholds’ lar performans ile ilgili sorunları tespit ve monitor etmeye yardımcı olur. Bunu, tanımlayacağınız thresholdlar da otomatik olarak warning/critical alert seviyeleri bazında yapabiliriz.
Atomatic Workload Repository Yönetimi
* Snapshot Yönetimi
Oracle database kurulumu ile birlikte default olarak her saat başı otomatik olarak snaphot’ ların alınmaktadır. Alınan bu snapshotların saklanmasıda default olarak 8 gün dür. İhtiyaç halinde DBMS_WORKLOAD_REPOSITORY package’ı ile manuel olarak snapshot create, drop veya edit edebiliriz. Bu package kullanabilmek için user’ ın DBA yetkisine sahip olmalıdır. Manuel olarak snapshot create – drop edilmesi işlemi özellikle enterprise manager konsolu kullanamadığımız durumlarda (ki kimiz zaman sistemde yaşanan problemlerden dolayı zaman zaman konsolu kullanamayabiliyoruz) ciddi önemli olduğu durumlarla karşılaşabiliriz. Dolayısıyla sadece bu işlem için değil, database seviyesinde yapacağımız tüm işlemlerin sql komutları ile nasıl yapıldıklarını bilmemiz zaman zaman hayati önem taşıyabiliyor.
Manuel olarak bahsettiğimiz bu işlemleri şimdi sırası ile nasıl yapabileceğimize bakalım;
(aşağıda belirtilen işlemlerin aynısı konsol üzerinden de yapılabilir ben burada sadece konsolu kullanmadan nasıl yapabileceğimiz üzerinde duracağım)
Manuel Snapshot create etmeye çalışalım;
BEGIN
DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT ();
END;
/
PL/SQL procedure successfully completed
Yukarıdaki scriptte snapshot kısmında sonraki “()” alanı doldurmadan direk çalıştırdık. Buraya TYPICAL veya ALL da yazabilirdik. Null olarak gönderdiğimizde statistic_level parametreniz ne olarak set etmişseniz onu dikkate alıyor.
Şimdi almış olduğum son snapshot’ ı drop etmek isteyelim ;
BEGIN
DBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE (low_snap_id => 6495,
high_snap_id => 6495, dbid => 2656835042);
END;
/
PL/SQL procedure successfully completed
Bu şekilde sadece seçmiş olduğunuz snapshotı drop edebileceğiniz gibi bir aralık içerisindeki tüm snapshotlarıda drop edebilirsiniz.
Snapshot ayarlarını modify etmeye çalışalım ;
BEGIN
DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS( retention => 43200,
interval => 30, topnsql => 100, dbid => 3310949047);
END;
/
PL/SQL procedure successfully completed
Yapılan bu değişikliği şöyle tanımlayabiliriz; retention parametresi ile alınan snapshotların saklanma süresi 43200 dakikaya yani 30 güne, interval 30 ile snapshot alınma sıklığı 30 dak’ ya, topnsql 100 ile snapshotlara dikkate alınanacak top sql sayısı 100’ e set edilmektedir. Dbid parametresi ise üzerinde işlem yapmakta olduğunuz database’ in dbis’ sini ifade etmektedir. (select dbid from v$database ile bulunabilir)
Snapshot ayarları ile ilgili yapmış olduğunuz bu değişiliklerin history’ si neDBA_HIST_WR_CONTROL view’ ini select ederek görebilirsiniz.
select * from sys.DBA_HIST_WR_CONTROL
DBID SNAP_INTERVAL RETENTION TOPNSQL
2040370613 +00 01:00:00.000000 +07 00:00:00.000000 DEFAULT
AWR ile tüm testleri 11gR2 ortamında yaptığımdan dolayı farklı versiyonlarda bu selectin sonuçu farklı çıkacaktır. (örneğin 10gR2 de topnsql alanı olmayacaktır)
* Baseline Yönetimi
Baseline’ lar sistemin optimum olarak çalıştığı bir dönemde create edilip problem oluştuğu dönemde nelerin problem teşkil ettiğini yani iki dönem arasındaki farkı ne olarak görebilmek için alınır. (veya yoğun dönemlerde oluşturulup başka bir aralık ile karşılaştırmamıza olanak sağlar) Baseline’ da iki şekilde create edebiliriz. Konsol üzerinden ve DBMS_WORKLOAD_REPOSITORY package’ ını kullanarak. Package ile nasıl create, drop veya modify baseline yapabiliriz bunlara bakalım kısaca;
create etmek için ;
öncelikle hangi aralığa ait snapshotları kullanarak baseline create edeceğiz buna kara veriyoruz. Aşağıdaki sql’ den mevcut snapshotlara bakabiliriz;
select * from DBA_HIST_SNAPSHOT ;
sonra ;
BEGIN
DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE (start_snap_id => 6517,
end_snap_id => 6518, baseline_name => ‘deneme baseline’,
dbid => 2656835042, expiration => 30);
END;
PL/SQL procedure successfully completed
Artık oluşturmuş olduğumuz yeni baseline’ nıda ;
select * from DBA_HIST_BASELINE
view’ inde görebiliyoruz.
Create scriptinde expiration parametresini null gönderirseniz asla expire olmayacak demiş olursunuz.bizim bu örneğimizde 30 olarak set etmiş olduk.
Drop etmek için ;
Aynı mantıkda, hangi baseline’ i drop etmek istediğimize DBA_HIST_BASELINEtablosundan bakıp karar veriyoruz. (tabi eğer bilmiyorsak)
Sonra;
BEGIN
DBMS_WORKLOAD_REPOSITORY.DROP_BASELINE (baseline_name => ‘deneme baseline’,
cascade => FALSE, dbid => 2656835042);
END;
PL/SQL procedure successfully completed
Ile drop edebiliriz.
Daha önce alınmış olan bir baseline’ nın adını rename etmek için ;
BEGIN
DBMS_WORKLOAD_REPOSITORY.RENAME_BASELINE (
old_baseline_name => ‘deneme baseline’,
new_baseline_name => ‘dene baseline’,
dbid => 2656835042);
END;
PL/SQL procedure successfully completed
Ile yapabiliriz.
İşinize yarayacağını düşündüğüm bazı Automatic Workload Repository ile ilgili wievler ;
V$ACTIVE_SESSION_HISTORY = Database’ deki active sessionlara ait bilgilerin turulduğu view,
DBA_HIST_ACTIVE_SESS_HISTORY = memorydeki en son system aktivitelerine ait bilgileri içerir,
DBA_HIST_BASELINE = database’ deki baseline’ leri listeler,
DBA_HIST_BASELINE_DETAILS = baseline’ lar hakkında detaylı bilgileri içerir,
DBA_HIST_BASELINE_TEMPLATE = system tarafından generate edilen baseline template’ leri hakkında bilgiler içerir,
DBA_HIST_DATABASE_INSTANCE = database environment’ ları hakkında bilgileri içeir,
DBA_HIST_SNAPSHOT = database’deki snapshotlar hakkında bilgileri içerir,
DBA_HIST_WR_CONTROL = AWR’ ın kontrol ayarları ile ilgili bilgileri içerir.
AWR raporu create etmek için ;
Yine konsolu kullanmadan awr raporu create etmek için aşağıdaki adımları izleyebiliriz. Tabi bunları yapan kullanıcının dba yetkisine sahip olması gerektiğini de unutmayalım.
Sql komut satırıdan aşağıdaki sql dosyasını çağırıyoruz;
@$ORACLE_HOME/rdbms/admin/awrrpt.sql
[oracle@tester1 admin]$ sqlplus “/as sysdba”
SQL*Plus: Release 11.2.0.1.0 Production on Wed Feb 23 14:43:32 2011
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 – 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL>
SQL>
SQL> @$ORACLE_HOME/rdbms/admin/awrrpt.sql;
Current Instance
~~~~~~~~~~~~~~~~
DB Id DB Name Inst Num Instance
———– ———— ——– ————
2656835042 TEST 1 TEST
Specify the Report Type
~~~~~~~~~~~~~~~~~~~~~~~
Would you like an HTML report, or a plain text report?
Enter ‘html’ for an HTML report, or ‘text’ for plain text
Defaults to ‘html’
Enter value for report_type: html
Type Specified: html
Instances in this Workload Repository schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DB Id Inst Num DB Name Instance Host
———— ——– ———— ———— ————
* 2656835042 1 TEST TEST tester1
Using 2656835042 for database Id
Using 1 for instance number
Specify the number of days of snapshots to choose from
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Entering the number of days (n) will result in the most recent
(n) days of snapshots being listed. Pressing without
specifying a number lists all completed snapshots.
Enter value for num_days: 1
Listing the last day’s Completed Snapshots
Snap
Instance DB Name Snap Id Snap Started Level
———— ———— ——— —————— —–
TEST TEST 6506 23 Feb 2011 00:00 1
6507 23 Feb 2011 01:00 1
6508 23 Feb 2011 02:00 1
6509 23 Feb 2011 03:00 1
6510 23 Feb 2011 04:00 1
6511 23 Feb 2011 05:00 1
6512 23 Feb 2011 06:00 1
6513 23 Feb 2011 07:00 1
6514 23 Feb 2011 08:00 1
6515 23 Feb 2011 09:00 1
6516 23 Feb 2011 10:00 1
6517 23 Feb 2011 11:00 1
6518 23 Feb 2011 12:00 1
6519 23 Feb 2011 13:00 1
6520 23 Feb 2011 14:00 1
Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for begin_snap: 6519
Begin Snapshot Id specified: 6519
Enter value for end_snap: 6520
End Snapshot Id specified: 6520
Specify the Report Name
~~~~~~~~~~~~~~~~~~~~~~~
The default report file name is awrrpt_1_6519_6520.html. To use this name,
press to continue, otherwise enter an alternative.
Enter value for report_name: deneme_awr
Using the report name deneme_awr
…
…
…
…
…
Report written to deneme_awr
SQL>
awrrpt.sql’ i komut satırından başlatııkdan sonra sırası ile istenilen bilgileri giriyoruz. Bu bilgileri sırasıyla açıklayalım ;
Enter value for report_type: html
(rapor çıktısının formatını belirliyoruz, text veya html giriyoruz)
Enter value for num_days: 1
(snapshot id’ si seçmek için kaç günlük snapshotları görmek istediğimizi söylüyoruz)
Enter value for begin_snap: 6519
Enter value for end_snap: 6520
(alacağımız raporun hangi snapshotları dikkate alması gerektiğini söylüyoruz)
Enter value for report_name: deneme_awr
(raporun ismini set ediyoruz. Hangi dizinde çalıştırdıysanız o dizin altına belirlediğiniz isimle dosyayı create ediyor)
RAC kullanıyorsanız çalıştıracağınız file’ in ismi awrgrpt.sql olacaktır. (@$ORACLE_HOME/rdbms/admin/awrgrpt.sql)
Spesifik bir instance için AWR raporu create etmek için çalıştırılması gereken file awrrpti.sql olacaktır.
(@$ORACLE_HOME/rdbms/admin/awrrpti.sql)
Bu awrrpti.sql çalıştırıldığından yukarıdakinden farklı olarak sizden hangi instance için almanız gerekiyor ise o instance ait dbis bilgisini girmenizi isteyecektir.
Instances in this Workload Repository schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DB Id Inst Num DB Name Instance Host
———– ——– ———— ———— ————
3309173529 1 MAIN main examp1690
3309173529 1 TINT251 tint251 samp251
Rac kullanıpda, spesifik bir instance için AWR raporu create etmek için çalıştırılması gereken file awrgrpti.sql olacaktır.
(@$ORACLE_HOME/rdbms/admin/awrgrpti.sql)
Burada da istenilen bilgiler yukarıdaki örnekdeki gibi girilmesi gerekmektedir.
Şimdi işi biraz daha detaylandırıp snapshot içerisinde bizim için problemli olduğunu düşündüğümüz sadece bir sql için awr raporu almaya çalışalım. Bunun için kendi test ortamımda şöyle bir case oluşturdum. 06y3gf61vurz7 id’ li bir sql’ im var ve sabah 08 – 09 arasında sistemde kaynaklanan yoğunluğun bu sql’ den kaynaklandığını düşünelim ve araştıralım ;
Yaptığım işleme ait log ;
[oracle@tester1 admin]$ sqlplus “/as sysdba”
SQL*Plus: Release 11.2.0.1.0 Production on Wed Feb 23 15:20:14 2011
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 – 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> @$ORACLE_HOME/rdbms/admin/awrsqrpt.sql
Current Instance
~~~~~~~~~~~~~~~~
DB Id DB Name Inst Num Instance
———– ———— ——– ————
2656835042 TEST 1 TEST
Specify the Report Type
~~~~~~~~~~~~~~~~~~~~~~~
Would you like an HTML report, or a plain text report?
Enter ‘html’ for an HTML report, or ‘text’ for plain text
Defaults to ‘html’
Enter value for report_type: text
Type Specified: text
Instances in this Workload Repository schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DB Id Inst Num DB Name Instance Host
———— ——– ———— ———— ————
* 2656835042 1 TEST TEST tester1
Using 2656835042 for database Id
Using 1 for instance number
Specify the number of days of snapshots to choose from
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Entering the number of days (n) will result in the most recent
(n) days of snapshots being listed. Pressing without
specifying a number lists all completed snapshots.
Enter value for num_days: 1
Listing the last day’s Completed Snapshots
Snap
Instance DB Name Snap Id Snap Started Level
———— ———— ——— —————— —–
TEST TEST 6506 23 Feb 2011 00:00 1
6507 23 Feb 2011 01:00 1
6508 23 Feb 2011 02:00 1
6509 23 Feb 2011 03:00 1
6510 23 Feb 2011 04:00 1
6511 23 Feb 2011 05:00 1
6512 23 Feb 2011 06:00 1
6513 23 Feb 2011 07:00 1
6514 23 Feb 2011 08:00 1
6515 23 Feb 2011 09:00 1
6516 23 Feb 2011 10:00 1
6517 23 Feb 2011 11:00 1
6518 23 Feb 2011 12:00 1
6519 23 Feb 2011 13:00 1
6520 23 Feb 2011 14:00 1
6521 23 Feb 2011 15:00 1
Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for begin_snap: 6514
Begin Snapshot Id specified: 6514
Enter value for end_snap: 6515
End Snapshot Id specified: 6515
Specify the SQL Id
~~~~~~~~~~~~~~~~~~
Enter value for sql_id: 06y3gf61vurz7
SQL ID specified: 06y3gf61vurz7
Specify the Report Name
~~~~~~~~~~~~~~~~~~~~~~~
The default report file name is awrsqlrpt_1_6514_6515.txt. To use this name,
press to continue, otherwise enter an alternative.
Enter value for report_name: 06y3gf61vurz7_awr_report
Using the report name 06y3gf61vurz7_awr_report
WORKLOAD REPOSITORY SQL Report
Snapshot Period Summary
..
..
..
..
Report written to 06y3gf61vurz7_awr_report
SQL>
Bu bize şunu veriyor aslında, spesifik olarak bu şekilde bir tespitiniz var ise tüm AWR raporu içerisinde bir sürü veriye bakmaktansa, hızlı bir tespitte bulunabilmek adına bu şekilde alabilirsiniz. Ben rapor çıktısını yazıyı çok uzatmamak adına eklemedim. Sizler test ettiğinizde zaten görüyor olacaksınız.
AWR’ ın farklı diğer özellikleri ile devam ediyor olacağım.
Şimdilik görüşmek üzere.
Çok güzel anlatmışsınız, hocam.. Teşekkürler