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 protocolOracle Net Services
- 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.