素朴な調査:オラクルに接続した際のプロセスについて<!-- --> | <!-- -->塩焼き太郎のブログ♪
塩焼き太郎のブログ♪

素朴な調査:オラクルに接続した際のプロセスについて

Posted: November 21, 2017

今回はオラクルのセッションのプロセスについて見てみる。ずばり、ローカル接続とリスナー経由接続の違いについて。

環境:2 node RAC

1. ローカル接続の場合

DBに対しローカル接続をする。

[oracle@node1 ~]$ sqlplus scott/tiger SQL*Plus: Release 12.1.0.2.0 Production on 火 11月 21 18:42:14 2017 Copyright (c) 1982, 2014, Oracle. All rights reserved. 最終正常ログイン時間: 火 11月 21 2017 18:41:35 +09:00 Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP, Advanced Analytics and Real Application Testing options に接続されました。 SQL>

OS上のプロセスは以下で検索できる。

ps -ef | grep oracle$ORACLE_SID

まずは該当のプロセスを探す。

[oracle@node1 ~]$ ps -ef | grep oracleorcl_1 oracle 10375 1 0 18:32 ? 00:00:01 oracleorcl_1 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq))) oracle 10385 1 0 18:32 ? 00:00:00 oracleorcl_1 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq))) oracle 14892 14891 0 18:43 ? 00:00:00 oracleorcl_1(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq))) <-- これ oracle 15314 14473 0 18:47 pts/2 00:00:00 grep oracleorcl_1

続いてプロセスの親をたどっていく。

[oracle@node1 ~]$ ps -ef | grep 14891 oracle 14891 14240 0 18:43 pts/1 00:00:00 sqlplus oracle 14892 14891 0 18:43 ? 00:00:00 oracleorcl_1 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq))) oracle 15366 14473 0 18:48 pts/2 00:00:00 grep 14891 [oracle@node1 ~]$ ps -ef | grep 14240 oracle 14240 14226 0 18:39 pts/1 00:00:00 -bash oracle 14891 14240 0 18:43 pts/1 00:00:00 sqlplus oracle 14917 14473 0 18:43 pts/2 00:00:00 grep 14240 [oracle@node1 ~]$ ps -ef | grep 14226 oracle 14226 14174 0 18:39 ? 00:00:00 sshd: oracle@pts/1 oracle 14240 14226 0 18:39 pts/1 00:00:00 -bash oracle 14934 14473 0 18:43 pts/2 00:00:00 grep 14226 [oracle@node1 ~]$ ps -ef | grep 14174 root 14174 2558 0 18:39 ? 00:00:00 sshd: oracle [priv] oracle 14226 14174 0 18:39 ? 00:00:00 sshd: oracle@pts/1 oracle 14992 14473 0 18:44 pts/2 00:00:00 grep 14174 [oracle@node1 ~]$ ps -ef | grep 2558 root 2558 1 0 18:22 ? 00:00:00 /usr/sbin/sshd root 14174 2558 0 18:39 ? 00:00:00 sshd: oracle [priv] root 14411 2558 0 18:39 ? 00:00:00 sshd: root@pts/2 oracle 15017 14473 0 18:44 pts/2 00:00:00 grep 2558

これを見る通り、ローカルの場合、sqlplusからプロセスがforkされていることが分かる。
プロセスがsqlplusだけだったのが意外。

ちなみにPROTOCOL=beqとはなんぞやと思い調べてみると

https://docs.oracle.com/cd/E49329_01/network.121/b71288/concepts.htm#sthref128

クライアントとデータベースが同じコンピュータ上に存在する場合、クライアント接続は、リスナーを経由せずに専用サーバー・プロセスに直接渡すことができます。これは、bequeathプロトコルとして知られています。セッションを開始するアプリケーションは、接続要求に対する専用サーバー・プロセスを生成します。データベースの起動に使用されるアプリケーションがデータベースと同じコンピュータ上にある場合、この処理は自動的に実行されます。

とのこと。ローカル接続を意味しているってことかな。

2. リスナー経由の接続の場合

[oracle@node1 ~]$ sqlplus scott/tiger@node1-vip.oracle12c.jp:1522/orcl SQL*Plus: Release 12.1.0.2.0 Production on 火 11月 21 18:54:35 2017 Copyright (c) 1982, 2014, Oracle. All rights reserved. 最終正常ログイン時間: 火 11月 21 2017 18:54:12 +09:00 Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP, Advanced Analytics and Real Application Testing options に接続されました。 SQL> [oracle@node1 ~]$ ps -ef | grep oracleorcl oracle 10375 1 0 18:32 ? 00:00:01 oracleorcl_1 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq))) oracle 10385 1 0 18:32 ? 00:00:00 oracleorcl_1 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq))) oracle 15859 1 0 18:54 ? 00:00:00 oracleorcl_1 (LOCAL=NO) <-- これ oracle 15904 15526 0 18:55 pts/1 00:00:00 grep oracleorcl

親プロセスが1なのでこれより先に親はいない。

ちなみにリスナーのプロセスも確認したが他に親子関係を持つプロセスもないことがわかる。

[oracle@node1 ~]$ ps -ef | grep tns root 23 2 0 18:20 ? 00:00:00 [netns] grid 4787 1 0 18:25 ? 00:00:00 /u01/app/12.1.0/grid/bin/tnslsnr ASMNET1LSNR_ASM -no_crs_notify -inherit grid 4789 1 0 18:25 ? 00:00:00 /u01/app/12.1.0/grid/bin/tnslsnr ASMNET2LSNR_ASM -no_crs_notify -inherit grid 4791 1 0 18:25 ? 00:00:00 /u01/app/12.1.0/grid/bin/tnslsnr MGMTLSNR -no_crs_notify -inherit grid 4846 1 0 18:25 ? 00:00:00 /u01/app/12.1.0/grid/bin/tnslsnr LISTENER -no_crs_notify -inherit grid 4870 1 0 18:25 ? 00:00:00 /u01/app/12.1.0/grid/bin/tnslsnr LISTENER_SCAN2 -no_crs_notify -inherit grid 4884 1 0 18:25 ? 00:00:00 /u01/app/12.1.0/grid/bin/tnslsnr LISTENER_SCAN3 -no_crs_notify -inherit oracle 15825 1 0 18:54 ? 00:00:00 /u01/app/oracle/product/12.1.0/homeDB/bin/tnslsnr LISTENER_TEST -inherit oracle 16291 15526 0 19:00 pts/1 00:00:00 grep tns [oracle@node1 ~]$ ps -ef | grep 15825 oracle 15825 1 0 18:54 ? 00:00:00 /u01/app/oracle/product/12.1.0/homeDB/bin/tnslsnr LISTENER_TEST -inherit oracle 16344 15526 0 19:00 pts/1 00:00:00 grep 15825 [oracle@node1 ~]$

まとめ

ローカル接続とリスナー経由接続でのプロセスの違いについて調査した。
ローカル接続、リスナー経由の接続ともに独立してプロセスが立てられる。って当たり前か。
ローカル接続の場合のprotocolはbeqになり、リスナー経由の場合はLOCAL=NOという情報のみになる。