ablog

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

Oracle Database on UNIX でBEQプロトコルでLOCAL接続する場合はパイプを使ってプロセス間通信している

Oracle Database で「sqlplus / as sysdba」とかしてBEQプロトコルでLOCAL接続する場合はプロセス間通信しているんだろうなとなんとなく思っていて、プロセス間通信って共有メモリとかセマフォとかパイプとかあるけど、パイプあたりを使っているのかなと思ってぐぐってみたら、渡部さんのすばらしい記事を発見!パイプを使ってプロセス間通信しているんですね。

このとき、pstreeコマンドを使用して、プロセスの親子関係を確認してみます。

[o11106@hp1 ~]$ pstree -p -a o11106
bash(9438)
 ()
sshd,9667
  `-bash,9668
      `-sqlplus,9694
          `-oracle,9697 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

SQL*Plus(コマンド名:sqlplus, プロセスID:9694)と、 サーバープロセス(コマンド名:oracle, プロセスID:9697)が親子関係にあることが 確認できます。
次に、サーバープロセスとSQL*Plusの間に存在するパイプを確認してみましょう。

[o11106@hp1 ~]$ sudo /usr/sbin/lsof -u o11106  |head -1
COMMAND  PID   USER   FD   TYPE     DEVICE      SIZE     NODE NAME
[o11106@hp1 ~]$ sudo /usr/sbin/lsof -u o11106  |grep pipe
 ()
sqlplus 9694 o11106   14w  FIFO        0,7              75491 pipe
sqlplus 9694 o11106   15r  FIFO        0,7              75492 pipe
oracle  9697 o11106   13r  FIFO        0,7              75491 pipe
oracle  9697 o11106   16w  FIFO        0,7              75492 pipe
 ()

SQL*Plus(コマンド名:sqlplus, プロセスID:9694)と、 サーバープロセス(コマンド名:oracle, プロセスID:9697) の間に2つのパイプ(NODE:75491,75492) が存在することがわかるでしょう。 図式すると以下のようになります。

           w                       r
SQL*Plus   ----<PIPE NODE:75491>---> サーバープロセス
(PID:9694) r                       w (PID:9697)
           <---<PIPE NODE:75492>----

このようなfork(), exec()システムコール、pipeを使った子プロセスの生成、親子プロセス間の 通信はUNIX系プラットフォームにおいてはごくごく一般的な方法です。 Oracleにおいても、このような一般的な方法を用いて、ローカル接続を実現しています。

CHAPTER 02 クライアントアプリケーションとサーバープロセス – プロとしてのOracleアーキテクチャ入門 « WR blog

少し探してみたところ、マニュアルにも Bequeath protocol についての記述を見つけました。

Overview of the Bequeath Protocol
The Bequeath protocol

  • Does not use a network listener (therefore, no listener configuration is required).
  • Automatically spawns a dedicated server
  • Used for local connections where an Oracle Database client application (such as SQL*Plus) communicates with an Oracle Database instance running on the same computer.
  • Only works in Dedicated Server mode. It cannot be used in a Shared Server mode.
Oracle Net Services