ablog

不器用で落着きのない技術者のメモ

メッセージ・ゲートウェイ・エージェント起動時の ORA-28575

Oracle Messaging Gateway のおはなし。

現象

--エージェントを起動する
SQL> conn mgwadmin/oracle
SQL> exec dbms_mgwadm.startup
--エージェントが起動していることを確認する。
SQL> set linesize 160
SQL> col last_error_msg for a60
SQL> select agent_status,agent_ping,last_error_msg from mgw_gateway;
AGENT_STATUS    AGENT_PING  LAST_ERROR_MSG
--------------- ----------- ------------------------------------------------------------
START_SCHEDULED                 ORA-28575: 外部プロシージャ・エージェントへのRPC接続をオープンできません。

原因

  • sqlplus から実行した場合、sqlplus のプロセスとサーバープロセスがプロセス間通信し、サーバープロセスとリスナープロセスがプロセス間通信し、リスナーが extproc を fork する。
  • サーバープロセスとリスナープロセスの間のプロセス間通信が正常にできていないのが原因。
  • 従って、チェックポイントは、リスナーが起動しているか、listener.ora、tnsnames.ora の設定が正しいかといったあたりになる。Oracle のバージョンにもよるが 文字数・スペース・改行などが原因になることがある。

解決策

  • リスナーを起動する。
    • listener.ora を変更した場合は、再起動する必要がある。
  • tnsnames.ora、listener.ora の設定を修正する。
    • tnsnames.ora に MGW_AGENTというネット・サービス名エントリを記述する。
    • tnsnames.ora->MGW_AGENT->CONNECT_DATA->SID が、listener.ora->SID_DESC->SID_NAME と一致させる。
    • tnsnames.ora と listener.ora の ADDRESS->KEY を一致させる。*1
    • ドメイン名が tnsnames.ora->MGW_AGENT に追加する。*2

チェックポイントいろいろ

  • $ORACLE_HOME/mgw/admin/mgw.ora の 「set CLASSPATH=」で指定しているクラスパスは正しいか?
    • 例えば、クラスパスに /opt/mqm/java/lib を指定しているが、WebSphereMQ は /usr/mqm 以下にインストールされているとか。
  • 環境変数 LD_LIBRARY_PATH に $ORACLE_HOME/lib が指定されているか?
  • mgw_gateway.last_error_msg を確認して、ORA-06520 が発生している場合は、listener.ora の「ENVS="LD_LIBRARY_PATH=..."」にライブラリへのパスを追加する。
    • ある環境でこのエラーが出てたので、「find $ORACLE_HOME -name <ライブラリ名>」で検索して、listener.ora に追記してやったら解決した。
  • listener.ora の記述ミス
誤)
(ENVS="LD_LIBRARY_PATH="..."")
正)
(ENVS="LD_LIBRARY_PATH=...")
  • インスタンス、リスナー、メッセージ・ゲートウェイ・エージェントを再起動してみる。
  • チャネル名・キュー名などがMQ Server と Oracle に作成したシステム・リンクで一致しているか?プラットフォームに依存するかもしれないが、ケース・センシティブな模様。

*1:MGW_AGENTネット・サービス名がプロセス間通信(IPC)接続用に設定されている場合

*2:sqlnet.oraのnames.default_domainパラメータを使用してデフォルト・ドメインを設定した場合