Oracle Statspackインストールスクリプト

# 概要
プロンプト入力なしで、StatspackをインストールするSQLスクリプト。
大量のマシンにStatspackをインストールする場合に便利。
以下の設定をスクリプトに直接記載しているので注意。

- PERFSTATユーザのパスワード
- 表領域
- 一時表領域
- スナップショット取得間隔
- スナップショットレベル

# 手順

以下のsqlファイルを作成後、`sqlplus -S / as sysdba @spinstall.sql   && echo '正常に終了しました。'`と実行すると、インストールが開始される。
アンインストールする場合は、`sqlplus -S / as sysdba @spuninstall.sql && echo '正常に終了しました。'`

**StatspackインストールSQLスクリプト**

```sql:spinstall.sql
REM === ユーザ設定 START ===========================
REM perfstatユーザの設定
REM ・perfstat_password 
REM   perfstatユーザのログインパスワード
REM ・default_tablespace='SYSAUX'
REM   perfstatユーザが使用する表領域。
REM ・temporary_tablespace='TEMP'
REM   perfstatユーザが使用する一時表領域。
define perfstat_password='oracle'
define default_tablespace='SYSAUX'
define temporary_tablespace='TEMP'

REM スナップショットの起動タイミング
REM ・1日毎   -> SYSDATE+1
REM ・1時間毎 -> SYSDATE+1/24
REM ・30分毎  -> SYSDATE+1/(24*2)
REM ・1分毎   -> SYSDATE+1/(24*60) 
define snap_interval='SYSDATE+1/(24*60)'

REM スナップショットレベル
define snap_level=7
REM === ユーザ設定 END =============================

set echo off
set feedback off
whenever sqlerror exit 1
whenever oserror exit 1
alter session set nls_date_format='yyyy/mm/dd hh24:mi:ss';

prompt ======================================================================
prompt 実行ユーザ権限チェック
declare -- DBAチェック
    isDBA VARCHAR2(5);
begin
    select sys_context('USERENV','ISDBA') into isdba from dual;
    if (isDBA = 'FALSE') then
        RAISE_APPLICATION_ERROR(-20002, 'DBA権限を所有しているユーザで実行してください。');
    end if;
end;
/
prompt -> OK

prompt ======================================================================
prompt statspackインストールチェック
declare -- statspackインストールチェック
    cnt NUMBER;
begin
    select count(*) into cnt from dba_users where username ='PERFSTAT' ;
    if (cnt > 0) then
        RAISE_APPLICATION_ERROR(-20001, 'statspackは既にインストールされています。');
    end if;
end;
/
prompt -> OK

prompt ======================================================================
prompt statspackインストール
@?/rdbms/admin/spcreate.sql

prompt ======================================================================
prompt 定期起動設定
variable snap_jobno number;
exec dbms_job.submit(:snap_jobno, 'statspack.snap;', sysdate, '&snap_interval');
prompt 登録したjobのjobno
print snap_jobno
prompt 次のスナップショット実行時間
select next_date from user_jobs where job = :snap_jobno;

prompt ======================================================================
prompt snapshot取得レベルの設定
execute statspack.modify_statspack_parameter(i_snap_level=>&snap_level)

prompt 設定したsnapshot取得レベル
select snap_level from stats$statspack_parameter;

prompt ======================================================================
exit;
```

**StatspackアンインストールSQLスクリプト**

```sql:spuninstall.sql
set echo off
set feedback off
whenever sqlerror exit 1
whenever oserror exit 1
alter session set nls_date_format='yyyy/mm/dd hh24:mi:ss';

prompt ======================================================================
prompt 実行ユーザ権限チェック
declare -- DBAチェック
    isDBA VARCHAR2(5);
begin
    select sys_context('USERENV','ISDBA') into isdba from dual;
    if (isDBA = 'FALSE') then
        RAISE_APPLICATION_ERROR(-20002, 'DBA権限を所有しているユーザで実行してください。');
    end if;
end;
/
prompt -> OK

prompt ======================================================================
prompt statspackインストールチェック
declare -- statspackインストールチェック
    cnt NUMBER;
begin
    select count(*) into cnt from dba_users where username ='PERFSTAT' ;
    if (cnt = 0) then
        RAISE_APPLICATION_ERROR(-20001, 'statspackはインストールされていません。');
    end if;
end;
/
prompt -> OK

prompt ======================================================================
prompt statspack削除
@?/rdbms/admin/spdrop.sql
exit;
```