2012/12/04

CUIでOracle Databaseリファレンスマニュアルを参照する

本記事は JPOUG Advent Calendar の4日目です。3日目は Oracle Database や OS の性能統計情報と財務諸表の共通点 - ablog でした。さて、だいぶ時間が経ってしまいましたが、今年7月の JPOUG > SET EVENTS 20120721 で話してきました 内容のフォローアップです。DBA 1.0 には欠かせないコマンドラインでリファレンスマニュアルをより手軽に参照する方法をご紹介します。

オンラインマニュアルについて

Oracle Database は商用データベースとして長い間使われているだけあってマニュアルが充実しています。マニュアルについては @sora_to_umi さんが今年4月の Oracle OpenWorld Unconference presented by JPOUG で熱く語られていました。

数あるマニュアルのなかでも、初期化パラメータや静的データ・ディクショナリ・ビュー、動的パフォーマンス・ビューについて記載されているリファレンスマニュアルは各種調査ごとなど、データベースを運用・管理するうえで欠かせません。(とても覚えきれないので。。。)

リファレンスを手軽に

電子版の日本語マニュアルはリリース 10.2 から PDF 以外に HTML でも提供されており、ブラウザで手軽に参照できますのでローカル端末にダウンロードしてよく参照していました。

% wget http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19228-04/statviews_1.htm

% w3m -dump "file://$PWD/statviews_1.htm" -t 4 -S -Oe -cols $(( $COLUMNS - 2 )) \
| perl -pi -e 's/^(\s|\xA8(\xA1|\xA2|\xA7|\xA9|\xAB))+$//g' | lv

ところがリリース 11.2 から英語版と同様に項目ごとのファイルに分かれてしまったため、ざーっと関連しそうなところを斜め読みする、という使い方がしづらくなったと思います。たとえば ASM_POWER_LIMIT 初期化パラメータ。

ピンポイントに調べたい項目を確認する上で何の不足もないのですが、辞書で単語を調べるときに目に入った他の項目から得られる新たな発見の機会を奪われてしまったような気がして少し悲しいです。

見やすく加工する

なんとかリリース 10.2 と同じような感覚で手軽に参照したいなーということで、今までの延長で次のようにしていました。

% wget http://docs.oracle.com/cd/E16338_01/server.112/b56311/toc.htm

% grep -E '^<li>.*="(whatsnew|initparams|statviews|dynviews|limits|scripts|waitevents).*</a></li>' toc.htm \
| perl -pi -e 's!^.*href="([^#"]+)?.*?">([^<]+)(?:<spanclass="italic">([^<]+)?</span>)?(.*)?</a></li>!$1 $2$3$4!' \
| while read file title
do
  # リンク先ファイルを取得、加工して最終的な出力ファイルに追記
done
ただ、これをリファレンスの各章に対して行って、それを参照するために出力ファイル名をいちいち覚えていたり、シェルにエイリアスなどを定義しておくのは手間です。それに可能であればリリースを問わず同じような感覚で操作したいものです。

そこでシェルスクリプトを書きました。

これは主に2つの機能を提供します。
  1. リファレンスマニュアルを取得、加工して単一ファイルに出力する
    • toc.htmをwgetで取得する
    • toc.htmからリンクを抽出してwgetで取得、加工する
  2. 加工済みのファイルを参照する
zsh と bash で動作を確認しています。1の動作には wget、w3m、perl コマンドが必要です。

使い方(ファイルの取得、加工)

スクリプトをダウンロードしてシェルに読み込みます。

% wget https://raw.github.com/yoshikaw/oracle-cui-reference/master/oracle-cui-reference.sh

% source ./oracle-cui-reference.sh
つぎにデータを取得、加工する関数 omkdata を実行します。引数に対象とするリリース番号を指定します。ファイルをダウンロードしますのでインターネット接続が必要です。プロキシが必要な場合は実行前に wget で参照するHTTP_PROXY 環境変数を指定してください。
% omkdata
Usage: omkdata { 102 | 111 | 112 | all }
ここでは例として全てを指定します。端末には処理中のファイルが表示されます。ファイルのダウンロードと加工に少し時間がかかりますが、初回のみですので気長に待ってください。手元の環境では6分ほどでした。
% omkdata all
(102 ja) whatsnew        |  1124 whatsnew.htm         | Oracle Databaseリファレンスの新機
(102 ja) statviewspart   |    17 statviews_part.htm   | 第II部&nbsp; 静的データ・ディクショナリ・ビュー
(102 ja) statviews       |  2378 statviews_1.htm      | 静的データ・ディクショナリ・ビュー: ALL_ALL_TABLES〜ALL_MVIEWS
(102 ja) statviews       |  3086 statviews_2.htm      | 静的データ・ディクショナリ・ビュー: ALL_NESTED_TABLE_COLS〜DATABASE_PROPERTIES
(102 ja) statviews       |  3575 statviews_3.htm      | 静的データ・ディクショナリ・ビュー: DBA_2PC_NEIGHBORS〜
(102 ja) statviews       |  3225 statviews_4.htm      | 静的データ・ディクショナリ・ビュー: DBA_NESTED_TABLE_COLS〜
(102 ja) dynviewspart    |    11 dynviews_part.htm    | 第III部&nbsp; 動的パフォーマンス・ビュー
(102 ja) dynviews        |  3995 dynviews_1.htm       | 動的パフォーマンス(V$)・ビュー
(102 ja) dynviews        |  3973 dynviews_2.htm       | 動的パフォーマンス(V$)・ビュー: V$NLS_PARAMETERS〜
(102 ja) limits          |   142 limits.htm           | データベースの制限事項
(102 ja) scripts         |   116 scripts.htm          | SQLスクリプト
(102 ja) waitevents      |  1144 waitevents.htm       | Oracle待機イベント
(102 ja) enqueues        |    75 enqueues.htm         | Oracleエンキュー名
(102 ja) stats           |   353 stats.htm            | 統計情報の説明
(111 ja) whatsnew        |   290 whatsnew.htm         | Oracle Databaseリファレンスの新機
(111 ja) statviewspart   |    18 statviews_part.htm   | 第II部&nbsp; 静的データ・ディクショナリ・ビュー
...
(112 ja) dynviews        |    41 dynviews_3132.htm    | V$XSTREAM_TRANSACTION
(112 ja) limits          |    17 limits.htm           | データベースの制限事項
(112 ja) limits          |    35 limits001.htm        | データ型の制限
(112 ja) limits          |    36 limits002.htm        | 物理データベースの制限
(112 ja) limits          |    38 limits003.htm        | 論理データベースの制限
(112 ja) limits          |    25 limits004.htm        | プロセスおよびランタイムの制限
(112 ja) scripts         |    18 scripts.htm          | SQLスクリプト
(112 ja) scripts         |    24 scripts001.htm       | データ・ディクショナリの作成
(112 ja) scripts         |    47 scripts002.htm       | その他のデータ・ディクショナリ構造体の作成
(112 ja) scripts         |    22 scripts003.htm       | NOスクリプト
(112 ja) scripts         |    20 scripts004.htm       | アップグレードおよびダウングレード・スクリプト
(112 ja) scripts         |    19 scripts005.htm       | JavaScript
(112 ja) waitevents      |    22 waitevents.htm       | Oracle待機イベント
(112 ja) waitevents      |    34 waitevents001.htm    | 待機イベントのクラス
(112 ja) waitevents      |    73 waitevents002.htm    | 一般的な待機イベント・パラメータの説明
(112 ja) waitevents      |  1183 waitevents003.htm    | 待機イベントの説明
(112 ja) enqueues        |    78 enqueues.htm         | Oracleエンキュー名
(112 ja) stats           |    11 stats.htm            | 統計情報の説明
(112 ja) stats           |    14 stats001.htm         | 統計情報の表示
(112 ja) stats           |   372 stats002.htm         | 統計情報の説明
(112 ja) bgprocesses     |   324 bgprocesses.htm      | バックグラウンド・プロセス
ちなみに出力の意味は左から、リリース番号、言語、対象カテゴリ、コンテンツ行数、ファイル名、タイトルです。今のところ言語は日本語(ja)と英語(en)に対応しています。英語を対象とする場合は ODOC_LANG 変数を指定して実行します。
% ODOC_LANG=en omkdata all
(102 en) whatsnew        |  1124 whatsnew.htm         | What's New in Oracle Database Reference?
(102 en) initparamspart  |    10 initparams_part.htm  | Part I Initialization Parameters
(102 en) initparams      |    15 initparams.htm       | Initialization Parameters
(102 en) initparams      |    38 initparams001.htm    | Uses of Initialization Parameters
(102 en) initparams      |    38 initparams002.htm    | Basic Initialization Parameters
(102 en) initparams      |    81 initparams003.htm    | Parameter Files
(102 en) initparams      |   456 initparams004.htm    | Changing Parameter Values in a Parameter File
(102 en) initparams      |    27 initparams005.htm    | Reading the Parameter Descriptions
(102 en) initparams      |    13 initparams006.htm    | Initialization Parameter Descriptions
(102 en) initparams      |    24 initparams007.htm    | ACTIVE_INSTANCE_COUNT
...
(112 en) waitevents      |  1174 waitevents003.htm    | Descriptions of Wait Events
(112 en) enqueues        |    73 enqueues.htm         | Oracle Enqueue Names
(112 en) stats           |    11 stats.htm            | Statistics Descriptions
(112 en) stats           |    12 stats001.htm         | Displaying Statistics
(112 en) stats           |   402 stats002.htm         | Statistics Descriptions
(112 en) bgprocesses     |   313 bgprocesses.htm      | Background Processes
ファイルは全て ODOC_CACHE_DIR 変数で指定した場所に出力されます。デフォルトは $HOME/.odoc_cache です。このディレクトリ以下をそのまま別の環境に持っていけばインターネット接続なしでも参照できます。
% find $ODOC_CACHE_DIR -type d
/Users/yoshikaw/.odoc_cache
/Users/yoshikaw/.odoc_cache/docs.oracle.com
/Users/yoshikaw/.odoc_cache/docs.oracle.com/cd
/Users/yoshikaw/.odoc_cache/docs.oracle.com/cd/B19306_01
/Users/yoshikaw/.odoc_cache/docs.oracle.com/cd/B19306_01/server.102
/Users/yoshikaw/.odoc_cache/docs.oracle.com/cd/B19306_01/server.102/b14237
/Users/yoshikaw/.odoc_cache/docs.oracle.com/cd/B28359_01
/Users/yoshikaw/.odoc_cache/docs.oracle.com/cd/B28359_01/server.111
/Users/yoshikaw/.odoc_cache/docs.oracle.com/cd/B28359_01/server.111/b28320
/Users/yoshikaw/.odoc_cache/docs.oracle.com/cd/E11882_01
/Users/yoshikaw/.odoc_cache/docs.oracle.com/cd/E11882_01/server.112
/Users/yoshikaw/.odoc_cache/docs.oracle.com/cd/E11882_01/server.112/e25513
/Users/yoshikaw/.odoc_cache/docs.oracle.com/cd/E16338_01
/Users/yoshikaw/.odoc_cache/docs.oracle.com/cd/E16338_01/server.112
/Users/yoshikaw/.odoc_cache/docs.oracle.com/cd/E16338_01/server.112/b56311
/Users/yoshikaw/.odoc_cache/otndnld.oracle.co.jp
/Users/yoshikaw/.odoc_cache/otndnld.oracle.co.jp/document
/Users/yoshikaw/.odoc_cache/otndnld.oracle.co.jp/document/products
/Users/yoshikaw/.odoc_cache/otndnld.oracle.co.jp/document/products/oracle10g
/Users/yoshikaw/.odoc_cache/otndnld.oracle.co.jp/document/products/oracle10g/102
/Users/yoshikaw/.odoc_cache/otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd
/Users/yoshikaw/.odoc_cache/otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102
/Users/yoshikaw/.odoc_cache/otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19228-04
/Users/yoshikaw/.odoc_cache/otndnld.oracle.co.jp/document/products/oracle11g
/Users/yoshikaw/.odoc_cache/otndnld.oracle.co.jp/document/products/oracle11g/111
/Users/yoshikaw/.odoc_cache/otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd
/Users/yoshikaw/.odoc_cache/otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111
/Users/yoshikaw/.odoc_cache/otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05771-04

使い方(ファイルの参照)

参照したい章ごとの関数を実行します。

  • owhat 新機能
  • oinit 初期化パラメータ
  • ostat 静的データ・ディクショナリ・ビュー
  • odyn 動的パフォーマンス・ビュー
  • olimits データベースの制限事項
  • oscripts SQLスクリプト
  • owait Oracle待機イベント
  • oenq Oracleエンキュー名
  • ostats 統計情報の説明
  • obg バックグラウンド・プロセス
該当するファイルを ODOC_VIEWER 変数または PAGER 環境変数で指定されているコマンド、指定されていなければ more コマンドで開きます。more コマンドだと文字コード変換があてに出来ないので lv を推奨しますが、私は後述する理由で view(vim -R) を使います。関数名が気に入らなければ alias で適当に替えてください。

複数リリースのデータを作成している場合は、表示したいリリース番号を ODOC_RELVER 変数または第一引数で指定します。デフォルトは 112 です。

% ODOC_RELVER=102 oinit

% oinit 102
英語版を表示する場合は ODOC_LANG 変数を指定します。デフォルトは ja です。
% ODOC_LANG=en oinit

% ODOC_LANG=en oinit 111

制限事項

  • 作成時の端末幅($COLUMNS)で出力ファイルの幅が決まります。作成時と異なる幅の端末で参照する可能性がある場合、ODOC_COLUMNS=80 omkdata などと小さい方のサイズを指定して作成してください。
  • 参照時にデータを動的に変換する仕組み(ODOC_DYN)を書きかけていましたが、パフォーマンスがイマイチなので途中で力尽きました。
  • 単一ページとして参照するために各ページで重複しているヘッダ、フッタを取り除いていますが、英語版で端末幅が狭いときにナビゲーションリンクの位置が変わって上手くいかないところがあります。

私の使い方

参照に view コマンドを使っている理由は、検索に使用した文字列を端末タイトルに表示するよう vim を設定しているからです。

" Display search word on terminal title. {{{2
if has('title')
  let &titlestring = "%t%( %M%) %((%{expand(\"%:~:h\")})%)%(%a%) "
        \ . "%{strlen(@/) ? '/ ' . @/"
        \ . "             : '- ' . (strlen(v:servername) ? v:servername : 'VIM')}"
  nnoremap <silent> <Esc><Esc> :nohlsearch<CR>:let @/ = ''<CR>
endif "}}}
こうしておくと GNU Screen で複数の端末(=ウィンドウ)を開いているときに、どのマニュアルを何て単語で見ていた(=検索していた)かというのが windowlist で一覧できて便利だからです。ちなみに GNU Screen 内で参照コマンドを実行したときにはウィンドウのタイトルを変更する俺得機能も入れてたりします。

おわりに

はじめは単純なコマンドの組合せとして書き始めましたが、結局スクレイピング作業の多くを perl に頼っているため、何度か perl で書き直したい欲求に駆られましたがシェルスクリプトとして仕上げました。私は端末での作業には常に GNU Screen を使っていますので、ここで紹介したマニュアル表示用のウィンドウを複数立ち上げていて、sqlplus 等の操作で確認が必要なときにわざわざブラウザを開くことなくウィンドウを切り替えて vim の検索で素早く調べられて便利です。

そういえば先日、リリース 11.2 の日本語マニュアルの ePub/Mobi 版 が提供されましたね。ブラウザ、端末、電子書籍リーダなど各種デバイスを使い分けて、Oracle Database に対する知見を広めてゆきたいものです。

明日は charade_oo4o さんです。Windows でのミドルウェアのお話しでしょうか。楽しみですね。

0 件のコメント:

コメントを投稿