Oracle を実行している Amazon Relational Database Service (Amazon RDS) インスタンスのパフォーマンスを分析および調整したいと考えています。Oracle を実行している Amazon RDS インスタンスのパフォーマンス統計を確認するにはどうすればよいですか?
簡単な説明
Amazon RDS DB インスタンスで Oracle Statspack を使用して、パフォーマンスデータを収集、保存、表示できます。Statspack は Statspack スナップショットに基づいてレポートを生成し、これを使用して一定期間の DB インスタンスのパフォーマンスを分析できます。詳細については、Oracle Statspackの Oracle ドキュメントを参照してください。
解決策
Amazon RDS で Oracle Statspack を使用する
- Statspack がインストールされていて、PERFSTAT アカウントが Statspack に関連付けられている場合は、ステップ 3 に進んでください。Statspack がインストールされておらず、PERFSTAT アカウントが存在する場合は、次のコマンドを実行してアカウントを削除してください。
SQL> DROP USER perfstat CASCADE;
-
Statspack オプションを DB オプショングループに追加します。オプショングループがない場合は、新しいオプショングループを作成して、そのオプショングループを DB インスタンスに割り当てます。
-
Statspack オプションを追加すると、Oracle を実行している Amazon RDS インスタンスは自動的に Statspack をインストールします。これにより、データベースの統計情報を収集してレポートを生成するための perfstat ユーザーが作成されます。ただし、perfstat ユーザーはデフォルトでロックされていることに注意してください。perfstat ユーザーのロックを解除するには、Amazon RDS プライマリユーザーとして DB インスタンスにログインし、次のようなクエリを実行して perfstat ユーザーのパスワードをリセットします。
ALTER USER perfstat IDENTIFIED BY <new_password> ACCOUNT UNLOCK;
注: new\ _password は必ず自分のパスワードに置き換えてください。
- Oracle Database 12c リリース 2 (12.2) 以前を使用している場合は、この手順をスキップしてください。Oracle Database 19c 以上を使用している場合は、次のステートメントを実行して PERFSTAT アカウントに CREATE JOB 権限を付与してください。
GRANT CREATE JOB TO PERFSTAT;
- Oracle Bug 28523746 が原因で、PERFSTAT.STATS$IDLE\ _EVENT のアイドル待機イベントにデータが入力されない可能性があります。PERFSTAT.STATS$IDLE\ _EVENT テーブル内のアイドル待機イベントが確実に読み込まれるようにするには、次のステートメントを実行します。
INSERT INTO PERFSTAT.STATS$IDLE_EVENT (EVENT)
SELECT NAME FROM V$EVENT_NAME WHERE WAIT_CLASS='Idle'
MINUS
SELECT EVENT FROM PERFSTAT.STATS$IDLE_EVENT;
COMMIT;
- perfstat ユーザーとしてログインした状態で、次のコマンドを実行して Statspack のスナップショットを手動で取得します。
SQL> exec statspack.snap (i_snap_level => 7, i_modify_parameter => 'TRUE');
注: Statspack のスナップショットのキャプチャレベルを変更して、より詳細な情報を取得することもできます。このコマンド例では、レベル 7 の Statspack スナップショットを作成します。このスナップショットには、SQL の使用状況、行ロック、セグメントレベルの I/O 統計が含まれます。
- オプションで、Statspack のスナップショットを自動的に取得するように Oracle を設定します。この手順により、1 時間に 1 つの Statspack スナップショットを自動的に取得するジョブが作成されます。
SQL> set serveroutput on
SQL> variable jn number;
SQL> execute dbms_job.submit (:jn, 'statspack.snap;', sysdate, 'trunc(SYSDATE+1/24,''HH24'')');
SQL> execute dbms_output.put_line ('statspack job number:' || :jn);
SQL> commit;
- 使用可能な Statspack スナップショットを確認するには、次のコマンドを実行します。
SQL> set linesize 32767;
SQL> alter session set nls_date_format = 'YYYY/MM/DD HH24:MI:SS';
SQL> select snap_id, snap_time from stats$snapshot order by 1;
SNAP_ID SNAP_TIME
---------- -------------------
:: ::
11 2019/06/03 03:18:30
12 2019/06/03 04:18:30
:: ::
- 2 つ以上の Statspack スナップショットを作成したら、次のようなコマンドを実行して Statspack レポートを作成します。
SQL> exec RDSADMIN.RDS_RUN_SPREPORT (11,12);
注: このコマンド例では、11 と 12 の SNAP\ _ID を使用してレポートを作成します。レポート名は trace/ORCL\ _spreport に似ています
\ _
.lst.
-
レポートを表示およびダウンロードするには、Amazon RDS コンソールを開き、ナビゲーションペインから [ データベース ] を選択します。DB インスタンスを選択し、[ ログとイベント ] タブを選択します。
-
保存されている Statspack スナップショットは自動的に削除されないため、DB インスタンスのストレージ容量を消費する可能性があります。Statspack スナップショットを手動で消去するには、次のように開始 **SNAP\ _ID ** と終了 SNAP\ _ID を指定します。
SQL> execute statspack.purge(<INITIAL_SNAP_ID>, <END_SNAP_ID>);
Amazon RDS での Oracle Statspack の使用を停止する
- スナップショットの自動作成を停止するには、作成したジョブを削除します。ジョブ番号を取得するには、次のコマンドを実行します。
SQL> select job, what FROM user_jobs;
- ジョブを削除するには、次のコマンドを実行します。
SQL> execute dbms_job.remove (<job_id>);
注: job\ _id は必ず自分のジョブ ID に置き換えてください。
DB オプショングループから Statspack オプションを削除すると、perfstat ユーザーと保存されているすべての Statspack スナップショットが消去されます。
関連情報
Oracle Statspack