Oracle

  (最終更新日:2015.02.26)

Statspackレポートを定期的(1日1回)に自動で作成する方法

OracleのStatspackレポートを、自動で1日1回、1時間間隔のレポート23個を定期処理で作成したいなぁと思いましたのでシェルを作成してみました。

全く改善させていないショボいスクリプトで申し訳ないですが、せっかくなので共有してみたいと思います。(同じようなことをしたい人がきっといるはずだと思いますので‥)

改善案などありましたらぜひアドバイスいただけると嬉しいです。

要件

要件として、下記のような状況の中で自動作成を目指しました。

  • 1時間間隔(自動)でスナップショットを作成
  • 前日のレポートを作成
  • レポートは1時間間隔の24時間分におけるStatspackレポート23個
  • OS oracleユーザーのCronで実施
  • インスタント名はORCL

構成

構成は下記のような感じです。 ディレクトリ(tmp)の中にスナップショットリストのファイルを一時的に作成します。

  • get_sptext.sh ➡ 本体
  • [ディレクトリ(sql)] REPORT1.sql ➡ スナップショットリストを取得するSQLファイル
  • [ディレクトリ(sql)]REPORT2.sql ➡ Statspackレポートを作成するSQLファイル
  • [ディレクトリ(tmp)]

仕組み・スクリプト

REPORT1.sql で前日のスナップショットリストを取得してきます。取得したリストをもとにぐるぐるまわしてStatspackレポートを作成します。

本体となるシェルスクリプト(get_sptext.sh)は下記の通りです。

#!/bin/sh
#-----------------------------------------------------------------------------
#
# Statspackレポートの定期作成
#
#-----------------------------------------------------------------------------

#ORACLE環境変数
export ORACLE_HOME=/opt/oracle/app/oracle/product/11.2.0/dbhome_1
export LD_LIBRARY_PATH=/opt/oracle/app/oracle/product/11.2.0/dbhome_1/lib:
export NLS_LANG=japanese_japan.UTF8
export ORACLE_SID=ORCL
export NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS"

#Oracle BIN
ORACLEBIN="${ORACLE_HOME}/bin"

#スクリプトディレクトリ
SYSDIR=/home/oracle/Cron/createSPreport
SQL_DIR=$SYSDIR/sql
TMP_DIR=$SYSDIR/tmp
MONTH=$(date -d "1 days ago" '+%Y-%m')
REPORT_DIR=/mnt/backup/$MONTH
#保存先のディレクトリが無ければ作成
if [ ! -d $REPORT_DIR ]
then
    mkdir $REPORT_DIR
fi


### 前日分のスナップショットのリストを作成
${ORACLEBIN}/sqlplus -s / as sysdba @${SQL_DIR}/REPORT1.sql ${TMP_DIR}/REPORT.lst
if [ $? != 0 ] ; then
    echo "スナップIDの取得に失敗しました。"
    exit 99
fi

### Statspackレポートの作成
cat ${TMP_DIR}/REPORT.lst | while read SNAP_START SNAP_END DBID INSTANCE_NAME INSTANCE_NUMBER SNAP_TIME SNAP_LEVEL
do
    REPORT_NAME="${REPORT_DIR}/${INSTANCE_NAME}_${SNAP_TIME}"
    echo "${REPORT_NAME}.txt BEGIN_TIME[ ${SNAP_TIME} ]"
    ${ORACLEBIN}/sqlplus -s / as sysdba @${SQL_DIR}/REPORT2.sql "${SNAP_START}" "${SNAP_END}" "${REPORT_NAME}.txt" > /dev/null
    if [ $? != 0 ] ; then
        echo  "Statspackレポートの作成に失敗しました。"
        exit 99
    fi
done

exit 0

スナップショットリストを取得するSQL(REPORT1.sql)は下記の通りです。

set linesize 1000
set pagesize 0
set tab off
set echo off
set head off
set feedback off
set verify off
set trimspool on
set arraysize 5000
set term off

whenever oserror exit 99
whenever sqlerror exit 99

spool &1

SELECT
    a.snap_id as snap_start,
    a.snap_id + 1 as snap_end,
    a.dbid,
    b.instance_name,
    a.instance_number,
    to_char(a.snap_time,'YYYYMMDD_HH24MISS') as snap_time,
    a.snap_level
FROM
    stats$snapshot a,
    v$instance b
WHERE
    a.instance_number = b.instance_number  AND
    to_char(snap_time,'YYYY-MM-DD') = TO_CHAR(SYSDATE-1,'YYYY-MM-DD')  AND
    b.instance_name = 'ORCL'
ORDER BY
    a.snap_time;

spool off
exit

Statspackレポートを作成するSQL(REPORT2.sql)は下記の通りです。

set linesize 200
set pagesize 0
set tab off
set echo off
set head off
set feedback off
set verify off
set trimspool on
set arraysize 5000
set term off

whenever oserror exit 99
whenever sqlerror exit 99

define begin_snap="&1"
define end_snap="&2"
define report_name="&3"

@?/rdbms/admin/spreport
exit

以上で完了です。
あとはCronに get_sptext.sh を指定すれば、指定したバックアップディレクトリにレポートが定期的に作成されていきます。

スポンサーリンク
スポンサーリンク

関連記事

  1. Oracle

    【Oracle】DataPumpの対話式コマンドモードを抜ける方法

    Oracle DataPump(impdp, expdp)では、 at…

  2. Oracle

    長時間動いているセッション(SQL)の情報を取得するSQL

    Oracleで長時間稼働している処理(SQL)の情報を取得するSQLが…

  3. Oracle

    Oracleのプロファイルを参照作成(コピー)するなら類似作成が便利

    Oracleでパスワードの有効期限などを独自に設定したプロファイルを作…

  4. Oracle

    Impdp時にtablesを使うとファンクションやストアドは作成されない

    OracleのDataPumpコマンド『impdp』の利用時に tab…

  5. Oracle

    アーカイブログを削除する方法

    アーカイブログ・モードの時にガンガン作成されるアーカイブログ・…

  6. Oracle

    【Oracle】テーブル指定で統計情報をバックアップ、インポートする方法とポイント

    Oracle Databaseで、テーブルを指定して統計情報をバックア…

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

最近の記事

  1. さくらのVPSにCentOS 5をインストールする方法
  2. PHP PhantomJSでFatal error: Unc…
  3. 【Oracle】DataPumpの対話式コマンドモードを抜け…
  4. CentOS7のPHP5.6にPhpSpreadsheetを…
  5. Azure仮想マシン(CentOS 7)のStandardデ…
PAGE TOP