ablog

不器用で落着きのない技術者のメモ

STATSPACK を使ってみる

STATSPACK の使い方を簡単にまとめてみた。
STATSPACK 用に表領域を作成する。

$ sqlplus / as sysdba
SQL> CREATE TABLESPACE STATSPACK
  DATAFILE '/dev/raw/raw15' SIZE 100M  AUTOEXTEND ON
  SEGMENT SPACE MANAGEMENT AUTO;

STATSPACK をインストールする。

SQL> @?/rdbms/admin/spcreate.sql
Enter value for perfstat_password: perfstat
Enter value for default_tablespace: STATSPACK
Enter value for temporary_tablespace: TEMP
SQL> exit
$ grep -i error *.lis

自動的にスナップショットを取得するよう設定する(デフォルトで1時間毎)。

$ sqlplus perfstat/perfstat
SQL> @?/rdbms/admin/spauto.sql

スナップショットの自動取得を停止する。

$ sqlplus perfstat/perfstat
SQL> col job for 999
SQL> col what for a30
--JOB番号を確認する。
SQL> select job, what from dba_jobs; 
 JOB WHAT
---- ------------------------------
   1 statspack.snap;
--上記で確認したジョブ番号を指定する。
SQL> execute dbms_job.remove(ジョブ番号); 
--削除したジョブが表示されないことを確認する。
SQL> seleE3??(デフォルトで1時間毎)。
>|sql|
$ sqlplus perfstat/perfstat
SQL> @?/rdbms/admin/spauto.sql

スナップショットの自動取得を停止する。

$ sqlplus perfstat/perfstat
SQL> col job for 999
SQL> col what for a30
--JOB番号を確認する。
SQL> select job, what from dba_jobs; 
 JOB WHAT
---- ------------------------------
   1 statspack.snap;
--上記で確認したジョブ番号を指定する。
SQL> execute dbms_job.remove(ジョブ番号); 
--削除したジョブが表示されないことを確認する。
SQL> select job, what from dba_jobs; 

スナップショット取得間隔を30分毎に変更する。

$ sqlplus perfstat/perfstat
SQL> execute dbms_job.interval(1, 'SYSDATE+(1/48)');

レポートを出力する。RAC環境の場合はそれぞれのインスタンスで出力する。

$ sqlplus perfstat/perfstat
SQL> @?/rdbms/admin/spreport.sql
...
Completed Snapshots

                               Snap                    Snap
Instance     DB Name             Id   Snap Started    Level Comment
------------ ------------ --------- ----------------- ----- --------------------
orcl         ORCL                 1 10 Aug 2009 09:44     7
                                  2 10 Aug 2009 09:44     7
...

Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for begin_snap: 1<RETURN>

Enter value for end_snap: 2<RETURN>

...

Specify the Report Name
~~~~~~~~~~~~~~~~~~~~~~~
The default report file name is sp_1_2.  To use this name,
press <return> to continue, otherwise enter an alternative.
Enter value for report_name:<RETURN>

...

不要になったスナップショットを削除する(8日より前のスナップショットを削除する)。

$ sqlplus perfstat/perfstat
SQL> exec statspack.purge(8);

レベルを変更する。

$ sqlplus perfstat/perfstat
SQL> exec statspack.modify_statspack_parameter (i_snap_level=>7)
SQL> select snap_level from stats$statspack_parameter;

スナップショットデータを全て切り捨てる。

$ sqlplus perfstat/perfstat
SQL> @?/rdbms/admin/sptrunc.sql


追記(2009/03/30):
RAC の場合の注意点。
[J06248-02]Oracle9i データベース・パフォーマンス・チューニング・ガイドおよびリファレンス リリース2(9.2)
P.603

注意: Oracle Real Application Clusters 環境でSPAUTO.SQL を使用する場合、
SPAUTO.SQL スクリプトクラスタ内の各インスタンスで1 回実行する必要があります。
同様に、各インスタンスにJOB_QUEUE_PROCESSES パラメータを設定する必要があります。

http://www.oracle.com/technology/global/jp/documentation/products/oracle9i/920/general.html#performance


追記(2009/08/04):
http://oracome.blog.shinobi.jp/Entry/22/ で知ったけど、デフォルトレベルを変更しなくても引数でレベルを指定できるみたい。

SQL> exec statspack.snap(7);

追記(2009/08/10):
statspack をアンインストールする手順。

$ sqlplus / as sysdba
SQL> @?/rdbms/admin/spdrop.sql
SQL> exit
$ grep -i error *.lis


追記(2010/07/28):
statspack のスナップショットが取得されなくなっていたので、ジョブを調べてみると、

SQL> col last for a10
SQL> col next for a10
SQL> col what for a30
SQL> select job, what, to_char(last_date,'YYYY-MM-DD') last, to_char(next_date,'YYYY-MM-DD') next from dba_jobs; 

       JOB WHAT                           LAST       NEXT
---------- ------------------------------ ---------- ----------
        41 statspack.snap;                2010-07-13 4000-01-01

4000年て。。。
一旦、ジョブを削除して、

SQL> execute dbms_job.remove(41); 

作り直せば、

SQL> @?/rdbms/admin/spauto.sql

おk


[参考]
STATSPACKをアンインストールする - tipsを掻き集めてknowledgeを目指す日記
http://www9.plala.or.jp/okuman/oracle/statspack.html

statspackを定期的にとっていると、情報がDBにどんどん溜まります。sppurge.sqlを使って、負荷の低く、かつ、スナップを取っていない時間に定期的に削除しましょう。削除処理は重いためです。

削除しても、stats$sqltext などの周辺テーブルの情報が増えていく場合、10g以降では、i_extended_purge パラメータを TRUE に設定して削除しましょう。9i以前では、サポートに問い合わせ(もしくはKROWN情報から調査)してみましょう。

データベースコンサルタントのノウハウちょい見せ