PL/SQL のソースコードの暗号化→WRAPPERユーティリティ

お盆休み中に Oracle 10g でちょっとトラブル発生してたみたい。なんっつー bad なタイミング。休み明け出社してすぐさま解析。保守ベンダーに解析依頼しているとはいえ、自分でも見ないと気持ちが落ち着かない。

今回のトラブルの原因は、10g からの新機能の目玉の1つでもある自動パフォーマンス統計(Automatic Workload Repository 略して AWR)ってのが、ジョブ実行中に異常終了してしまい、その後に実行される新規セッションがエラーになるというもの。詳細はまだ不明。

現在も解析中なわけですが、結論から言うと AWR の停止とデータベースの再起動をすることで解決させました。

- スポンサーリンク -

今回、異常終了したジョブは、AWR の1つのジョブと思われる AUTO_SPACE_ADVISOR_JOB ってやつ。テスト環境の OEM 経由でジョブを確認してみるとこんな感じでデフォルトで登録されてるジョブ。

awr01.jpg

で、異常終了時にアラートログにはこんなエラーが。

Fri Aug 11 23:52:40 2006 ORA-12012: ジョブ8888の自動実行エラーが発生しました
Fri Aug 11 23:52:40 2006 ORA-12850: 指定したすべてのインスタンスにスレーブを割当てできません: 
                         ORA-12850: 指定したすべてのインスタンスにスレーブを割当てできません: 
                                    2が必要で、1が割当て済です
Fri Aug 11 23:52:40 2006 ORA-06512: "SYS.DBMS_SPACE", 行1219
Fri Aug 11 23:52:40 2006 ORA-06512: "SYS.DBMS_SPACE", 行1385
Fri Aug 11 23:52:40 2006 ORA-06512: "SYS.DBMS_SPACE", 行1554
Sat Aug 12 05:10:48 2006 WARNING: inbound connection timed out (ORA-3136)

このエラーの意味はまたこんど。ってことで、やっとタイトルの PL/SQL のソースコードの暗号化の話になってくるわけですが、エラーを見たら解析したくなるのは、SYS.DBMS_SPACE ですよね。で、テスト環境の OEM で調べてみると、ソースが暗号化されてて閲覧できないんですよね。

awr02.jpg

いってみれば、Oracle 10g の AWR のキモとなる SQL が格納されている訳なので、暗号化されて当たり前と言えば当たり前。ちなみに、暗号化ファイルの拡張子は、.plb なわけですが、そういえばこの拡張子、インストール時によく見かけますよね。

find $ORACLE_HOME -name *.plb

とやっても確認できます。

何年 DBA やってんの?って言われそうな雰囲気満点なのですが、今更ながら ラップ・ユーティリティってのを”ちゃんと”知りました。(※Oracle Master を受けたときに勉強してるはずだけど・・・忘れてた。。。orz)。詳細は、OTN の「Oracle Database PL/SQLユーザーズ・ガイドおよびリファレンス」(※OTNアカウントが必要です)に記述がありますが、備忘録として要約しておきます。


PL/SQL を暗号化する2つの方法

  • wrapユーティリティを使用した PL/SQL コードの暗号化

    wrap ユーティリティでは、入力SQLファイルが処理されて、パッケージ仕様部、パッケージ本体、ファンクション、プロシージャ、型仕様部、型本体など、ファイル内のPL/SQLユニットのみが暗号化される。無名ブロックの PL/SQL コンテンツ、トリガーまたは PL/SQL 以外のコードは暗号化されない。

    wrap ユーティリティを実行するには、次の構文を OS 上から入力するだけ。.plb という拡張子の暗号化ファイルが生成される。

    wrap iname=input_file [oname=output_file]

    あとは、SQL*Plusで xxxx.plb を実行した後に、通常のプロシージャ/ファンクションとして実行可能となる。

    SQL> @xxxx.plb
    SQL> CALL プロシージャ名;


  • DBMS_DDLサブプログラムを使用した PL/SQL コードの暗号化

    DBMS_DDL パッケージには、パッケージ仕様部、パッケージ本体、ファンクション、プロシージャ、型仕様部、型本体など、単一の PL/SQL ユニットを暗号化するプロシージャが含まれます。オーバーロードされるこれらのサブプログラムには、データベースに作成される動的生成 PL/SQL プログラム・ユニットを暗号化する機能がある。どうやら、こっちは Oracle 10g からの新機能。

    ネット全体でぐぐっても検索結果が 92 件。情報がとても少ないですが、「Oracle Database 10g Release 2: Top Features for DBAs」あたりが役に立ちそう。

    →ちょっと小難しいので、マニュアルを熟読して検証しながらでないとこれ以上わかりません・・・|ι´Д`|っ


当然ながら、暗号化したものは OEM の SQLの履歴とかからも PL/SQL を実行したという情報しか取得不可能で、生の SQL は隠蔽されたままです。ってことで、Oracle のコアなプロシージャが異常終了したときは、やっぱりサポートセンターでしか解析できないわけでして、とってもお高いサポート費を支払っているので、しっかいと解析してもらうつもりです。でもブラックボックスってやっぱり気持ち悪いですね。

今回お役にたった本はこんな感じ。まだまだ勉強不足。

Oracle Database 10g運用管理ガイド
篠田 典良 日本オラクル
技術評論社 (2005/02)
売り上げランキング: 23,508
Oracle Database 10g Release 2 RAC 実践管理ガイド
日本オラクル株式会社 エヌ・ティ・ティ・データ先端技術株式会社 野沢 隆 平野 健嗣
インプレス (2006/03/01)
- スポンサーリンク -