IBM Support

[Db2] SED が有効な AIX システムで Java ルーチンが SQL1131N で失敗する

Question & Answer


Question

特定の AIX システムで Java ルーチンを実行すると、すべて SQL1131N で失敗します。 新しい Java ルーチンをデプロイしようと sqlj.install_jar を実行しても、やはり SQL1131N もしくは SQL1042C で失敗します。

Cause

すべての Java ルーチンは db2fmp (Java) プロセスによって実行されます。
db2fmp (Java) は DB2 インスタンス起動後、初めて Java ルーチンを実行すると自動的に起動しますが、このとき JNI_CreateJavaVM() を呼び出してプロセス内に Java VM をロードします。
しかし JNI_CreateJavaVM() が JIT コードを呼び出すと、SED が有効な AIX システムでは Java VM のロードは失敗します。

お使いの AIX システムで SED が有効かどうかは、以下のように sedmgr コマンドで確認できます。
$ sedmgr
Stack Execution Disable (SED) mode: select
SED configured in kernel: select

SED モードが 'setidfiles' もしくは 'all' に設定されている場合、すべての Java ルーチンの呼び出しは SQL1131N で失敗します。
「関連情報」にある Java のマニュアルに記述されているように、JIT を有効にする場合、Java VM をロードするプロセス (今回のケースでは db2fmp) を SED の対象から除外する必要があります。

注: SED のデフォルトは 'select' なので、多くのシステムではこの問題に該当しません。
ただし、PowerSC によって提供されるスクリプトによって、SED 設定が変更される可能性があります。
  • IBM PowerSC
    PowerSC は、セキュリティー・コンプライアンスを自動化して、コンプライアンスの評価と監査に関するレポートを作成します。セキュリティー・コンプライアンスの自動化は、企業においてセキュリティー・コンプライアンスにかかるコストを削減する上でも役立ちます。

Answer

この問題に遭遇した場合、以下のいずれかの方法で問題を回避できます。
 
  1. SED から db2fmp を除外する
    1. AIX システムに root としてログインします。
    2. db2fmp 実行ファイルを SED から除外するため、 sedmgr コマンドを実行します。
      # sedmgr -c exempt <db2fmp のパス>
      実行例:
      # sedmgr -c exempt /home/db2inst1/sqllib/adm/db2fmp
      # dump -X64 -ov /home/db2inst1/sqllib/adm/db2fmp
      
                              ***Object Module Header***
      # Sections      Symbol Ptr      # Symbols       Opt Hdr Len     Flags
               4      0x00006a08            673               120     0x1082
      Flags=( EXEC DYNLOAD DEP_EXEMPT )
      Timestamp = "Mar 31 16:29:22 2011"
      Magic = 0x1f7  (64-bit XCOFF)
  2. システム全体の SED 設定を、より緩い設定に変更する
    1. AIX システムに root としてログインします。
    2. システム全体の SED 設定を変更するため、sedmgr コマンドを実行します。変更を反映させるには AIX の再起動が必要です。
      # sedmgr -m select
      # shutdown -Fr
  3. Java ルーチンで JIT コンパイラーを使用不可にする
    1. Db2 のインスタンス所有者としてシステムにログインします。
    2. JIT コンパイラーを使用不可にするため、環境変数を設定します。
      $ export JAVA_COMPILER=none
      $ db2set DB2ENVLIST=JAVA_COMPILER
      $ db2stop
      $ db2start
      注: JIT を使用不可にすると、Java ルーチンのパフォーマンスが低下する可能性があります。
 
お問合せ先
技術的な内容に関して、パスポート・アドバンテージの契約のもと Db2 テクニカル・サポートへお問い合わせください。
Db2 テクニカル・サポート

[{"Type":"MASTER","Line of Business":{"code":"LOB10","label":"Data and AI"},"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"ARM Category":[{"code":"a8m500000008PmVAAU","label":"Programming Interface-\u003EJDBC"},{"code":"a8m500000008PmjAAE","label":"Routines - Stored Procedures and UDF-\u003EJava\/Non-SQL Routines"}],"ARM Case Number":"","Platform":[{"code":"PF002","label":"AIX"}],"Version":"All Versions"}]

Document Information

Modified date:
24 August 2023

UID

swg21596992