レック・テクノロジー・コンサルティング株式会社TECH BLOG

STATSPACK導入と設定、スナップショット取得について

この記事でOracle DBSTATSPACKの導入と設定、スナップショット取得をする際のポイントをご紹介いたします。

はじめに~STATSPACKの概要~

STATSPACKを利用すると、ある期間で行われた処理の統計情報を取得できます。

└トランザクションの傾向

└メモリのヒット率

└データベースの待機状況

ある2時点で取得したOracle DBのスナップショットの差分をもとに、その間のパフォーマンス統計データを結果レポートに出力します。

 ※スナップショット:ある時点に収集されたパフォーマンス統計データの集合です。

スナップショットレベルはデフォルトでは5であり、より詳しい情報が必要な場合はレベルを上げます。

レベル5:基本統計情報、アドバイス情報、SQL統計情報

レベル6:レベル5で取得可能な情報+SQL詳細情報

レベル7:レベル6で取得可能な情報+セグメント統計情報

STATSPACKの導入と基本的な設定~

 STATSPACKのインストールと設定について以下に簡単にまとめました。

STATSPACK情報格納用の表領域を作成

 STATSPACKで取得した情報の格納用の表領域を用意することがOracleに推奨されています。

1 既存表領域を指定してインストールすることも可能。(SYSTEM表領域以外)

2 最低約64MBの領域が必要。まずは300MB500MB程度を用意しておくことがOracleの推奨。

STATSPACKインストールスクリプトを実行

 STATSPACKインストールにはOracle DBに初めから含まれているスクリプトを実行します。

1.SYSDBA権限を持つユーザでSQL*Plusにログイン

2.インストールスクリプト"spcreate.sql"を実行します。

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

3.スクリプトを実行すると自動的に「PERFSTAT」ユーザが作成されるのでPERFSTATユーザへ以下項目を入力します。(以下、例)

perfstat_passwordに値を入力してください: <設定したいパスワード> 

default_tablespaceに値を入力してください: <1で作成した表領域>1

temporary_tablespaceに値を入力してください:<設定したい一時表領域>2

1 SYSTEM以外の既存表領域でもOK

2 デフォルトのTEMPOK

PERFSTATCREATE JOB権限をつける

spauto.sqlでスナップショットの自動取得ジョブ作成をする場合はPERFSTATユーザにCREATE JOB権限を付与します。

詳細はMy Oracle Support Doc ID 2636448.1をご覧ください。

SQL> GRANT CREATE JOB TO PERFSTAT;

権限付与が成功しました。

SQL> select * from dba_sys_privs where GRANTEE='PERFSTAT';

GRANTEE PRIVILEGE ADM COM INH

-------- ---------------------------------------- --- --- ---

PERFSTAT DROP PUBLIC SYNONYM NO NO NO

PERFSTAT CREATE TABLE NO NO NO

PERFSTAT CREATE JOB NO NO NO

PERFSTAT ALTER SESSION NO NO NO

PERFSTAT CREATE VIEW NO NO NO

PERFSTAT CREATE PUBLIC SYNONYM NO NO NO

PERFSTAT CREATE PROCEDURE NO NO NO

PERFSTAT CREATE SESSION NO NO NO

PERFSTAT CREATE SEQUENCE NO NO NO

9行が選択されました。

4スナップショットレベルの設定

デフォルトではレベル5であるため、以下のコマンドでレベル設定をします。

1.スナップショットレベルを設定します。(ここではレベル7に設定しています。)

SQL> execute statspack.modify_statspack_parameter(i_snap_level=> 7)

PL/SQLプロシージャが正常に完了しました。

2.設定されたことを確認します。

select snap_level from stats$statspack_parameter;

SNAP_LEVEL

----------

7

STATSPACKのバグ修正

Oracle DB 12.2以降のバージョンで新しく追加されたアイドル待機イベントが「Top 5 Timed Events」セクションに誤って含まれるバグを修正します。

詳細はMy Oracle Support Doc ID 2453074.1をご覧ください。

1.PERFSTATユーザに接続します。

SQL> connect PERFSTAT/<PASSWORD>

2,バグ修正の手順を実施します。

SQL> insert into stats$idle_event

2 select name from v$event_name where wait_class='Idle'

3 minus

4 select event from stats$idle_event;

30行が作成されました。

SQL> commit;

コミットが完了しました。

6スナップショット取得時のエラー防止

STATSPACK のスナップショット取得時に ORA-12899 が発生するため以下の手順を実施します。

この事象はSTATS$LATCH_MISSES_SUMMARYWHERE_IN_CODE列長が短いため発生します。

詳細はMy Oracle Support Doc ID 2893226.1をご覧ください。

1.デフォルトではWHERE_IN_CODEの列長がVARCHAR2(64)です。

SQL> desc STATS$LATCH_MISSES_SUMMARY

名前 NULL?

----------------------------------------- -------- ----------------------------

SNAP_ID NOT NULL NUMBER

DBID NOT NULL NUMBER

INSTANCE_NUMBER NOT NULL NUMBER

PARENT_NAME NOT NULL VARCHAR2(50)

WHERE_IN_CODE NOT NULL VARCHAR2(64)

NWFAIL_COUNT NUMBER

SLEEP_COUNT NUMBER

WTR_SLP_COUNT NUMBER

2.WHERE_IN_CODEの列長をVARCHAR2(80)に変更します。

SQL> alter table STATS$LATCH_MISSES_SUMMARY modify (WHERE_IN_CODE VARCHAR2(80));

表が変更されました。

3.WHERE_IN_CODEの列長をVARCHAR2(80)になっていることを確認します。

SQL> desc STATS$LATCH_MISSES_SUMMARY

名前 NULL?

----------------------------------------- -------- ----------------------------

SNAP_ID NOT NULL NUMBER

DBID NOT NULL NUMBER

INSTANCE_NUMBER NOT NULL NUMBER

PARENT_NAME NOT NULL VARCHAR2(50)

WHERE_IN_CODE NOT NULL VARCHAR2(80)

NWFAIL_COU NUMBER

SLEEP_COUNT NUMBER

WTR_SLP_COUNT NUMBER

以上が、STATSPACK導入と基本的な設定の手順です。

~スナップショット取得~

続いてスナップショットの取得についてです。

「手動取得」と「自動取得」の2通りです。

1手動取得

1.PERFSTATユーザで接続し、以下コマンドで取得します。

SQL> connect PERFSTAT/<PASSWORD>

SQL> execute statspack.snap

PL/SQLプロシージャが正常に完了しました。

2.スナップショットが取得されていることを確認します。

SQL> select

2 snap_id, to_char(snap_time, 'yyyy-mm-dd hh24:mi:ss') snap_time,snap_level

3 from stats$snapshot order by snap_id;

SNAP_ID SNAP_TIME SNAP_LEVEL

---------- -------------------------- ----------

1 2022-09-14 16:37:51 7

2自動取得

1.自動取得用のSQLを実行します。

SQL> @?/rdbms/admin/spauto

PL/SQLプロシージャが正常に完了しました。

2.自動取得ジョブが作成されていることを確認します。(デフォルトでは1時間毎)

SQL> select JOB,NEXT_DATE,INTERVAL,WHAT from dba_jobs;

JOB NEXT_DATE INTERVAL WHAT

---------- -------------------- -------------------------------------- ------------------------------

1 22-09-14 trunc(SYSDATE+1/24,'HH') statspack.snap;

3.取得間隔を変更する場合は以下のコマンドを実行します。

  ※ジョブIDは手順2で確認した番号を入れてください

SQL> execute dbms_job.interval(<ジョブID, 'sysdate+(1/12)');

(2時間毎)

SQL> execute dbms_job.interval(<ジョブID, 'sysdate+(1/48)');

(30分間毎)

以上、STATSPACK機能によるスナップショット取得方法です。

今回紹介しました内容がお役に立てれば幸いです。

引用①:https://www.oracle.com/assets/how-to-get-statspack-3232083-ja.pdf

引用②:My Oracle Support Doc ID 2636448.1

引用③:My Oracle Support Doc ID 2453074.1

引用④:My Oracle Support Doc ID 2893226.1

この記事をシェアする

  • Facebook
  • X
  • Pocket
  • Line
  • Hatena
  • Linkedin

資料請求・お問い合わせはこちら

ページトップへ戻る