Oracle 11g ADRに関する検証 その2

<Oracle 11g ADRに関する検証 その2>
ペンネーム: ミラニスタ

自動診断リポジトリ(ADR:Automatic Diagnostic Repository)の検証を行っ
ています。

▼ 前回のおさらい

前回は、ログファイル等を一元管理する ADR の概要について簡単に説明し
ルート・ディレクトリとなる「ADRベース」を変更してみました。(データ
ベースのみ)

▼ リスナーの ADRベースを変更してみる

11gからは、リスナーの診断データもデフォルトでADRに出力されます。
デフォルトのADRベースってどこでしたっけ?そうです、$ORACLE_BASE でし
たね。

インストール時に、データベース、リスナーあるいはASMのような製品は特
に指定しない限り同じ環境変数 ORACLE_BASE を参照してADRベースを設定しま
す。
例えば ADR_BASE のような環境変数があって、各製品が $ORACLE_BASE とは
別のディレクトリを共通のADRベースとできるような仕様となっていてもよさ
そうですが、実際はそうではないようです。理由は???です。
従って、一括でADRベースを変更することはできなくて、各製品ごとに変更
しなければなりません。

前回データベースのADRベースを動的に変更してみました。今回はリスナー
のADRベースを変更しますが、結論から言うとリスナーの再起動が必要で動的
に変更することはできません。

つまり、データベースのようにADRベースを動的に変更可能な製品があるた
め、ADRベースを環境変数で特定(固定化)するような仕様になっていないの
かもしれません。

デフォルトではリスナー・ログも $ORACLE_BASE 以下に出力されます。この
リスナー・ログというのは意外と曲者で、定期的に圧縮や削除をしないと知ら
ない間に数GBにもなってしまったというようなことがあります。
そこで、リスナーの診断データも /var/oracle 以下に出力されるように設
定を変更してみましょう。

1. 変更前確認

  $ lsnrctl status
  
  LSNRCTL for Linux: Version 11.1.0.6.0 - Production on xx-x x -2008 xx:xx:xx
  
  Copyright (c) 1991, 2007, Oracle.  All rights reserved.
  
  (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))に接続中
  リスナーのステータス
  ------------------------
  別名                      LISTENER
  バージョン                TNSLSNR for Linux: Version 11.1.0.6.0 - Production
  開始日                    xx-x月 -2008 xx:xx:xx
  稼働時間                  x 日 x 時間 x 分 xx 秒
  トレース・レベル          off
  セキュリティ              ON: Local OS Authentication
  SNMP                      OFF
  パラメータ・ファイル      /opt/oracle/ora111d/product/11.1.0/db_1/network/admin/listener.ora
  ログ・ファイル            /opt/oracle/diag/tnslsnr/hostname/listener/alert/log.xml
                            ^^^^^^^^^^^
                             ↑ADRベースはORACLE_BASEになっている
  ...................................................................
  
2. LISTERNER.ORA 変更
  
  $ cd $ORACLE_HOME/network/admin
  $ vi listener.ora
  .....................
  LISTENER =
    (DESCRIPTION_LIST =
  .....................
  ADR_BASE_LISTENER=/var/oracle   ←この行を追加
  
  (保存して終了)
  
  追加する行の書式は、ADR_BASE_(リスナー名)=(ADRベースのパス名)
  注意点は、''(シングルクォーテーション)で囲まないことです。

3. 設定反映(リスナー再起動)

  $ lsnrctl stop
  
  LSNRCTL for Linux: Version 11.1.0.6.0 - Production on xx-x x -2008 xx:xx:xx
  
  Copyright (c) 1991, 2007, Oracle.  All rights reserved.
  
  (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))に接続中
  コマンドは正常に終了しました。
  
  $ lsnrctl start
  
  LSNRCTL for Linux: Version 11.1.0.6.0 - Production on xx-x x -2008 xx:xx:xx
  ....................................................................
  
  ログ・ファイル            /var/oracle/diag/tnslsnr/hostname/listener/alert/log.xml
                            ^^^^^^^^^^^
                               ↑ADRベースが変更された
  ...................................................................


4. 参考(動的変更は可能か?)
   2. の状態から、リスナーの再起動(stop/start)ではなく、listener.ora
   の再読込み(reload)で設定が動的に変更可能か検証

  LSNRCTL> reload
  Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
  The command completed successfully
  ....................................................................
  LSNRCTL> status
  Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
  ....................................................................
  Listener Log File         /opt/oracle/diag/tnslsnr/hostname/listener/alert/log.xml
                            ^^^^^^^^^^^
                               ↑ADRベースは変更されない

▼ ADRコマンド・インタプリタ(ADRCI)

データベースとリスナーのADRベースを変更するだけで、メルマガ1回半分
を費やしてしまいました。やっと1合目にたどり着きました。ふうっ!

鋭い読者の皆さんはお気づきかもしれませんが、リスナー・ログ(・ファイ
ル)は、XML形式で出力されています。(拡張子に注目)実はアラート・ログ
も同様です。(ファイル名はどちらも log.xml です。)

論より証拠、実際のファイルの中身は以下のようになっています。
……………………..

Completed: ALTER DATABASE OPEN

……………………..

従来は時刻と「Completed: ALTER DATABASE OPEN」というテキストが各1行
出力されるだけでしたが、msgタグの中にいろいろな情報が含まれているのが
わかります。つまり従来と比べて情報が多い分出力サイズが大きくなります。
(従来型のアラート・ログは下位互換性のため background_dump_dest に出力
されています。)

なぜこのような形式になっているのかというと、Oracle Enterprise Manager
(OEM)で診断データを管理するためです。具体的には ORA-600 のようなクリ
ティカルなエラーが発生した場合、同時に出力されるトレース・ファイルやコ
ア・ダンプのような診断データとの紐付けをすることで問題解決までの効率化
を図るためです。(これについては別途検証します。)

ただし、OEMを使っていない環境や、アラート・ログの中身をちょこっと確
認したいという場合に便利なのが、ADRコマンド・インタプリタ(ADRCI)です。

○ ADRCI 起動方法

  $ adrci
  
  ADRCI: Release 11.1.0.6.0 - Beta on x x月 xx xx:xx:xx 2008
  
  Copyright (c) 1982, 2007, Oracle.  All rights reserved.
  
  ADR base = "/var/oracle"
  adrci>

○ アラート・ログ(データベース)を確認しよう

  adrci> show alert
  
  Choose the alert log from the following homes to view:
  
  1: diag/rdbms/ora111d/ora111d
  2: diag/tnslsnr/hostname/listener
  Q: to quit
  
  Please select option: 1   ←入力して Enter!

  ここが、ADRの一番いいところですね!アラート・ログもリスナー・ログも
同じADRベースに格納されているので、どちらを見たいか選択するだけです。

(表示結果)
  2008-xx-xx 16:20:10.701000 +09:00
  ALTER SYSTEM SET diagnostic_dest='/var/oracle' SCOPE=BOTH;
  2008-xx-xx 16:21:13.872000 +09:00
  Thread 1 advanced to log sequence 1359
    Current log# 3 seq# 1359 mem# 0: /opt/oracle/oradata/ora111d/redo03.log
  2008-xx-xx 16:29:09.418000 +09:00
  Thread 1 advanced to log sequence 1360
    Current log# 1 seq# 1360 mem# 0: /opt/oracle/oradata/ora111d/redo01.log
  ..................................................................

○ 表示を終了させるには

(表示状態)
  Escキー
  : (コロン)
  
  Please select option: q   ←入力して Enter!
  adrci>                    ←プロンプトに戻る

○ 表示用インターフェース

  $ env | grep EDITOR
  EDITOR=vi

環境変数EDITORに設定されているエディタソフトが、表示用インターフェー
スとして起動されます。(デフォルトはvi)
指定行にジャンプしたり、文字列を検索したりviを使ったことのある方だっ
たら、大体の感じはわかっていただけると思います。(使ったことのない方
。。。すみません、わかる方に聞いてください。)

ADRCIの詳細は「11g ユーティリティ」のマニュアルを参照してください。

○ 応用編

更新されるアラート・ログの内容を連続的に確認したい場合は、以下の手順
で行います。

  adrci> show alert
  
  Choose the alert log from the following homes to view:
  
  1: diag/rdbms/ora111d/ora111d
  2: diag/tnslsnr/hostname/listener
  Q: to quit
  
  Please select option: q    ← ADRホームパスを確認し、いったん終了させる
  adrci> set home diag/rdbms/ora111d/ora111d    ← ホームパスの設定
  adrci> show alert -tail -f

表示終了は[Ctrl]を押しながら[C]を押します。

次回は、クリティカル・エラーをわざと発生させて遊んでみましょう。

今日はここまで。

今日は素晴らしく天気がいい!!
恵比寿より