ADRCIを使ったログ管理に役立つ便利機能の紹介

みなさん、こんにちは！

Oracle DBにはアラート・ログやトレース・ファイルを簡単に管理するためのADRCIというツールが標準搭載されています。

ADRCI を使うと以下のようなことができます。
 * アラート・ログの表示
 * トレース・ファイルの検索
 * インシデントの表示
 * インシデントのパッケージ化 etc...

OSコマンドを使った煩わしいファイル操作をせずとも、ADRCIの1つプロンプト内で以下のような操作が完結します。

当記事ではADRCIの機能の基本的な使い方をいくつか紹介します。

### そもそもADRCIとは
自動診断リポジトリ・コマンド・インタプリタ (ADRCI)は、自動診断リポジトリ(ADR)に格納されたログファイルを管理することが可能なCLI形式のツールです。

自動診断リポジトリ(ADR)というのは、Oracle11g以降に実装されたアラートログやバックグラウンドトレースファイルなどを集中管理する場所を指します。

その実体はあるディレクトリ配下にあるデータベースやASMといった製品のログファイルの集合体です。

## 1. ADRCIを起動する
ADRCIはOracle DBに同梱されているツールになるため、Oracle DBが入っている環境であれば使用可能です。

**ADRCI起動**
```ruby:qiita.rb
$adrci
```

**起動するとADRCI専用のプロンプトに切り替わります。**
```ruby:qiita.rb
[oracle@ol79n1 ~]$ adrci

ADRCI: Release 19.0.0.0.0 - Production on 木 11月 9 23:35:05 2023

Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.

ADR base = "/u01/app/oracle"

adrci>
```

## 2. ADRCIでOracle DBのアラートログを確認する
ADRCIを起動後、DBのアラートログを確認するまでの手順を紹介します。
**show alertコマンドを実行するとオプション選択画面に切り替わります。**

```ruby:qiita.rb
adrci> show alert

Choose the home from which to view the alert log:

1: diag/rdbms/orcl/orcl

2: diag/tnslsnr/ol79n1/listener

Q: to quit

Please select option:
```

**表示されたオプションから今回はDBのアラートログを確認するため、「1」と入力しEnterを押下します。**
"diag/rdbms/orcl/orcl" DBのアラートログが選択されます。
```ruby:qiita.rb
adrci> show alert

Choose the home from which to view the alert log:

1: diag/rdbms/orcl/orcl

2: diag/tnslsnr/ol79n1/listener

Q: to quit

Please select option: 1
```

**エディタ表示に切り替わり、アラートログを確認可能です。**
エディタ表示切替後は、通常のエディタ操作が可能です。
```ruby:qiita.rb
2021-10-12 10:43:32.496000 +09:00

Starting ORACLE instance (normal) (OS id: 3753)

****************************************************

/dev/shm will be used for creating SGA

Large pages will not be used. Only standard 4K pages will be used

****************************************************

**********************************************************************

Dump of system resources acquired for SHARED GLOBAL AREA (SGA)

Per process system memlock (soft) limit = 128G

Expected per process system memlock (soft) limit to lock

instance MAX SHARED GLOBAL AREA (SGA) into memory: 680M

Available system pagesizes:

4K, 2048K

Supported system pagesize(s):

PAGESIZE AVAILABLE_PAGES EXPECTED_PAGES ALLOCATED_PAGES ERROR(s)

4K Configured 174085 174085 NONE

Reason for not supporting certain system pagesizes:

2048K - Dynamic allocate and free memory regions

**********************************************************************

LICENSE_MAX_SESSION = 0

LICENSE_SESSIONS_WARNING = 0
```

**エディタ表示の状態で[:q]を入力すると元のADRCI画面に戻ります。**
```ruby:qiita.rb
adrci> show alert

Choose the home from which to view the alert log:

1: diag/rdbms/orcl/orcl

2: diag/tnslsnr/ol79n1/listener

Q: to quit

Please select option: 1

Output the results to file: /tmp/alert_3291_14002_orcl_1.ado

Please select option:
```

## 3. ADRCIでトレース・ファイルを検索する
**現在のADRホームに存在する全てのトレース・ファイルの名前が表示します。**
```ruby:qiita.rb
adrci> show tracefile
diag/clients/user_oracle/host_1136030596_110/trace/sqlnet.log
diag/clients/user_oracle/host_1136030596_82/trace/sqlnet.log
diag/rdbms/orcl/orcl1/trace/orcl1_w007_8179.trc
diag/rdbms/orcl/orcl1/trace/orcl1_w006_8173.trc
diag/rdbms/orcl/orcl1/trace/orcl1_vktm_9929.trc
diag/rdbms/orcl/orcl1/trace/orcl1_vktm_5725.trc
diag/rdbms/orcl/orcl1/trace/orcl1_vktm_3180.trc
diag/rdbms/orcl/orcl1/trace/orcl1_vkrm_9958.trc
diag/rdbms/orcl/orcl1/trace/orcl1_vkrm_5753.trc
~ 省略 ~
diag/rdbms/orcl/orcl1/trace/orcl1_aqpc_2052.trc
diag/clients/user_oracle/host_1136030596_110/trace/ora_9228_140101461273216.trc
diag/clients/user_oracle/host_1136030596_110/trace/ora_6552_140401664195840.trc
diag/clients/user_oracle/host_1136030596_110/trace/ora_15258_140561713769088.trc
diag/tnslsnr/pslgnode01/dg_listener/trace/dg_listener.log
diag/rdbms/orcl/orcl1/trace/alert_orcl1.log
adrci>
```

**特定のバックグラウンドプロセスのトレース・ファイルを検索して、表示します。**
"%"はワイルドカード文字として使用されます。
検索文字列内の大文字・小文字は区別されます。
```ruby:qiita.rb
adrci> show tracefile %mmon%
diag/rdbms/orcl/orcl1/trace/orcl1_mmon_5844.trc
diag/rdbms/orcl/orcl1/trace/orcl1_mmon_3298.trc
diag/rdbms/orcl/orcl1/trace/orcl1_mmon_1874.trc
diag/rdbms/orcl/orcl1/trace/orcl1_mmon_10047.trc
adrci>
adrci>
大/小文字区別のため表示されない
adrci> show tracefile %MMON%
adrci>
```

**直近変更されたトレース・ファイルを最初に表示します。** (例 確認日 2023/11/30)
```ruby:qiita.rb
adrci> show tracefile -RT 30-NOV-23 16:18:51 diag/rdbms/orcl/orcl1/trace/orcl1_lgwr_10003.trc 30-NOV-23 16:18:46 diag/rdbms/orcl/orcl1/trace/orcl1_dia0_9973_base_1.trc 30-NOV-23 16:17:15 diag/rdbms/orcl/orcl1/trace/orcl1_ipc0_9925.trc 30-NOV-23 16:15:46 diag/rdbms/orcl/orcl1/trace/orcl1_dbrm_9954.trc 30-NOV-23 15:37:36 diag/rdbms/orcl/orcl1/trace/orcl1_vkrm_9958.trc 30-NOV-23 14:00:30 diag/rdbms/orcl/orcl1/trace/orcl1_lms0_9982_9984.trc 30-NOV-23 13:51:02 diag/rdbms/orcl/orcl1/trace/orcl1_lmhb_9992.trc ~ 省略 ~ 14-OCT-23 23:09:03 diag/rdbms/orcl/orcl1/trace/orcl1_mz00_23816.trc 14-OCT-23 22:58:59 diag/rdbms/orcl/orcl1/trace/orcl1_mz00_21748.trc 16-MAR-23 13:49:50 diag/rdbms/orcl/orcl1/incident/incdir_209582/orcl1_ora_30409_i209582.trc 16-MAR-23 13:49:20 diag/rdbms/orcl/orcl1/incident/incdir_209581/orcl1_ora_30409_i209581.trc 16-MAR-23 13:49:16 diag/rdbms/orcl/orcl1/incident/incdir_209580/orcl1_ora_30409_i209580.trc 16-MAR-23 13:49:15 diag/rdbms/orcl/orcl1/incident/incdir_209579/orcl1_ora_30409_i209579.trc 16-MAR-23 13:49:10 diag/rdbms/orcl/orcl1/incident/incdir_209578/orcl1_ora_30409_i209578.trc 11-OCT-22 02:52:57 diag/clients/user_oracle/host_1136030596_110/trace/ora_15258_140561713769088.trc 19-JUL-22 03:03:02 diag/clients/user_oracle/host_1136030596_110/trace/sqlnet.log 28-JUN-22 15:21:12 diag/clients/user_oracle/host_1136030596_110/trace/ora_9228_140101461273216.trc 20-APR-22 19:30:53 diag/tnslsnr/pslgnode01/dg_listener/trace/dg_listener.log 22-JUN-21 16:33:11 diag/clients/user_oracle/host_1136030596_110/trace/ora_6552_14040166419
```

**インシデントID 209578に関連付けられている全てのトレース・ファイルを表示します。**

インシデントID については後述します。
```ruby:qiita.rb
show tracefile -i 209578
```

## 4.ADRCIでインシデントを表示する
**show incidentコマンドを使用して、現在選択しているADRホームで発生しているインシデントを一覧表示できます。**
```ruby:qiita.rb
adrci> show incident

ADR Home = /u01/app/oracle/diag/rdbms/orcl/orcl1:
*************************************************************************
INCIDENT_ID PROBLEM_KEY CREATE_TIME
-------------------- ----------------------------------------------------------- ----------------------------------------
209578 ORA 600 [kdddgb:clsviol_kcbgcur_9] 2023-03-16 13:49:08.751000 +09:00
209579 ORA 600 [kdddgb:clsviol_kcbgcur_9] 2023-03-16 13:49:14.202000 +09:00
209580 ORA 600 [kdddgb:clsviol_kcbgcur_9] 2023-03-16 13:49:15.755000 +09:00
209581 ORA 600 [kdddgb:clsviol_kcbgcur_9] 2023-03-16 13:49:19.693000 +09:00
209582 ORA 600 [kdddgb:clsviol_kcbgcur_9] 2023-03-16 13:49:49.696000 +09:00
5 rows fetched
```

**特定のインシデントを指定して、詳細情報を表示します。**
インシデントの状態、エラーの引数、エラーを出したコンポーネント、紐づくインシデントファイルのパス等確認できます。

例) インシデントID 269578の詳細なインシデント・レポートを表示させます。
```ruby:qiita.rb
adrci> show incident -mode detail -p "INCIDENT_ID=209578"

ADR Home = /u01/app/oracle/diag/rdbms/orcl/orcl1:
*************************************************************************

**********************************************************
INCIDENT INFO RECORD 1
**********************************************************
INCIDENT_ID 209578
STATUS ready
CREATE_TIME 2023-03-16 13:49:08.751000 +09:00
PROBLEM_ID 4
CLOSE_TIME <NULL>
FLOOD_CONTROLLED none
ERROR_FACILITY ORA
ERROR_NUMBER 600
ERROR_ARG1 kdddgb:clsviol_kcbgcur_9
ERROR_ARG2 0
ERROR_ARG3 4299649
ERROR_ARG4 1
ERROR_ARG5 4294967250
ERROR_ARG6 131072
ERROR_ARG7 <NULL>
ERROR_ARG8 <NULL>
ERROR_ARG9 <NULL>
ERROR_ARG10 <NULL>
ERROR_ARG11 <NULL>
ERROR_ARG12 <NULL>
SIGNALLING_COMPONENT CACHE_RCV
SIGNALLING_SUBCOMPONENT <NULL>
SUSPECT_COMPONENT <NULL>
SUSPECT_SUBCOMPONENT <NULL>
ECID <NULL>
IMPACTS 0
CON_UID 0
PROBLEM_KEY ORA 600 [kdddgb:clsviol_kcbgcur_9]
FIRST_INCIDENT 209578
FIRSTINC_TIME 2023-03-16 13:49:08.751000 +09:00
LAST_INCIDENT 209582
LASTINC_TIME 2023-03-16 13:49:49.696000 +09:00
IMPACT1 0
IMPACT2 0
IMPACT3 0
IMPACT4 0
KEY_NAME Service
KEY_VALUE SYS$USERS
KEY_NAME Module
KEY_VALUE APP$CDB$DATAPATCH APPLICATION
KEY_NAME ProcId
KEY_VALUE 96.4
KEY_NAME Action
KEY_VALUE non-CDB::install1.sql
KEY_NAME Client ProcId
KEY_VALUE oracle@pslgnode01 (TNS V1-V3).30409_139852063503360
KEY_NAME PQ
KEY_VALUE (16778358, 1678942148)
KEY_NAME SID
KEY_VALUE 68.50284
OWNER_ID 1
INCIDENT_FILE /u01/app/oracle/diag/rdbms/orcl/orcl1/trace/orcl1_ora_30409.trc
OWNER_ID 1
INCIDENT_FILE /u01/app/oracle/diag/rdbms/orcl/orcl1/incident/incdir_209578/orcl1_ora_30409_i209578.trc
1 row fetched

adrci>
```
アラートログの記載内容からエラー関連のトレースファイルの場所は確認することができますが、この機能を使えば簡単に対象のファイル場所が探せます。

## 5.ADRCIでインシデントをパッケージ化する
Oracleサポートにエラー調査のために関連ログを連携する際に役立ちます。
最終的に物理ファイル (zip形式)として出力するまでの流れを示します。

**①論理インシデント・パッケージを作成します。**
例)インシデントID 209578のパッケージを作成します。
```ruby:qiita.rb
adrci> IPS CREATE PACKAGE INCIDENT 209578
Created package 4 based on incident id 209578, correlation level typical
adrci>
```
出力内容より、この論理パッケージに割り当てられた番号は "4"になります。
以後、物理パッケージを作成する際にこちらの番号を使いますので、メモしておいてください。

**②作成した既存論理パッケージに診断情報を追加します。**
診断情報を追加すると、以下がパッケージに含まれます。
・特定のインシデントに関する全ての診断情報
・自動診断リポジトリ(ADR)内の名前付きファイル

※注意※
ADRホームが複数ある場合には、対象としたいエラーがどのADRホーム上のものであるかを再度確認して、正確なディレクトリを指定して下さい。
例) 一覧の中から「diag/rdbms/orcl/orcl1」ディレクトリをホームパスとして指定しています。

```ruby:qiita.rb
adrci> show home
ADR Homes:
diag/rdbms/orcl/orcl1
diag/clients/user_oracle/host_1136030596_110
diag/clients/user_oracle/host_1136030596_82
diag/tnslsnr/pslgnode01/dg_listener
diag/asmcmd/user_oracle/pslgnode01
diag/kfod/pslgnode01/kfod
adrci>
adrci> set homepath diag/rdbms/orcl/orcl1
adrci>
adrci> show home
ADR Homes:
diag/rdbms/orcl/orcl1
adrci>
```

**診断情報を追加します。**
例) インシデントID 209578の診断情報を 、パッケージ番号 4に追加します。
```ruby:qiita.rb
adrci> ips add incident 209578 package 4

Added incident 209578 to package 4

adrci>
```

**ADR内のファイルを追加します。**
例) インシデントID 209578に紐づくインシデントファイルを確認後、該当ファイルをパッケージ番号 4に追加します。
```ruby:qiita.rb
adrci> show tracefile -i 209578
diag/rdbms/orcl/orcl1/incident/incdir_209578/orcl1_ora_30409_i209578.trc
adrci>
adrci>
adrci> ips add file /u01/app/oracle/diag/rdbms/orcl/orcl1/incident/incdir_209578/orcl1_ora_30409_i209578.trc package 4
Added file /u01/app/oracle/diag/rdbms/orcl/orcl1/incident/incdir_209578/orcl1_ora_30409_i209578.trc to package 4
```

**③既存の論理パッケージから、物理パッケージ(ZIPファイル)を作成します。**
例) 論理パッケージ番号4から物理パッケージを/home/oracleディレクトリに作成します。
```ruby:qiita.rb
adrci> ips generate package 4 in /home/oracle
Generated package 4 in file /home/oracle/ORA600kdd_20231130164343_COM_1.zip, mode complete
```

指定したディレクトリに物理パッケージ(ZIPファイル)が作成されています。
こちらをそのまま調査用ファイルとして連携することができます。
```ruby:qiita.rb
[oracle@pslgnode01 ~]$ ls -l /home/oracle/ORA600kdd_20231130164343_COM_1.zip
-rw-r--r-- 1 oracle oinstall 19357653 11月 30 17:14 /home/oracle/ORA600kdd_20231130164343_COM_1.zip
```
取得したファイルの中身を確認してみると、アラート・ログ、トレースファイルはもちろんのこと
パッチ情報のファイルなども入っているのがわかります。
調査の初動として連携するファイルとしては必要なものがそろえられてるといった形です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/018c668e-c09f-4355-9103-bdd4641e7638.png)

## 6. ADRCIを終了する
```ruby:qiita.rb
adrci> exit
```

## まとめ
ADRCIを使ったアラートログ、トレースファイルの管理方法を紹介しましたが、いかがだったでしょうか。

ADRCIを使用せず、アラートログを確認しようとすると "$ORACLE_BASE/diag/rdbms/{DB_NAME}/{ORACLE_SID}/trace/"配下の"alert_{ORACLE_SID}.log"をOSのファイル管理コマンドやテキストエディタなどで参照するかと思います。

ただ同一ホストマシン上に複数のインスタンスがある場合にはディレクトリを都度切り替えるなどしていると手間です。
そういった場合にADRCIを使えばわざわざでディレクトリを移動したりしなくても確認することが可能となり、とても重宝します。
また、調査用のファイルを収集する際にも紹介した方法を使用すれば手早くログファイルが回収できます。

ADRCIには紹介した機能以外にもいろいろな機能があるので、それらもまたの機会に紹介したいと思います。