On the Road

今回はオラクルに接続した際のシステムの状態を確認した。

概要


データベースは接続でき使用さえできれば満足してる人が多いと思うが、 この時のシステムの状態を理解しておくことはデータベースとシステムのつながりを実感を持って理解する上で必要と考える。 そういうわけで今回は基礎に立ち戻りDBに接続した場合の各種システムの状況を確認した。

環境


  • Linux : Red Hat Enterprise Linux Server release 6.5 (Santiago)
  • oracle 12c ( Single Instance )

DBへ接続した時のシステムの状況


オラクルデータベースへの接続方法はローカル接続とリモート接続の2種類ある。 ローカル接続は文字通りデータベースサーバー上からデータベースにアクセスする際の接続方法であり リモート接続はデータベースサーバーのホスト名、ポート番号、サービス名を指定して接続する方法である。

今回は以下の視点でのシステムの状況を確認する。

  • プロセスの見え方
  • リスナーログの見え方
  • 通信の状態の見え方

ローカル接続の場合


ローカル接続でデータベースに接続する。

[oracle@test1 ~]$ sqlplus testuser/testuser

SQL*Plus: Release 12.1.0.2.0 Production on 木 1月 10 22:28:46 2019

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
に接続されました。
SQL>

プロセスの見え方

この状況で別のターミナルからプロセスの状況を確認する。 サーバープロセスが生成され、以下のようにoracle$ORACLE_SIDの名前でプロセスがあることが確認できる。

[oracle@test1 ~]$ ps -ef | grep oracletestdb
oracle    9357  9356  4 22:28 ?        00:00:00 oracletestdb (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
oracle    9383  8638  0 22:28 pts/2    00:00:00 grep oracletestdb
[oracle@test1 ~]$

また、LOCAL=YESと書かれており、ローカル接続であることが分かる。

リスナーログの見え方

ローカル接続のためリスナーは経由していないため、当然ながらリスナーログには何も書かれない。

リモート接続の場合

続いてリモート接続の場合について。

まずはじめにリスナーを起動する。

[oracle@test1 ~]$ lsnrctl start

netstatの結果を見るとリスナーが受付状態になっていることが分かる。

[root@test1 ~]# netstat -an | grep 1521
tcp        0      0 192.168.56.109:1521         0.0.0.0:*                   LISTEN  <-- これ
tcp        0      0 192.168.56.109:25574        192.168.56.109:1521         ESTABLISHED
tcp        0      0 192.168.56.109:1521         192.168.56.109:25574        ESTABLISHED
[root@test1 ~]#

また、リモート接続(リスナー経由での接続)の情報は以下のリスナーログから確認できる。

oracle$ less $ORACLE_BASE/diag/tnslsnr/testdb/listener/trace/listener.log

この状況で他ホストからリモート接続する。今回はホストtest2からホストtest1上のDBへリモート接続をする。 ちなみに接続記述子testdbはホスト名:test1、ポート番号:1521、サービス名:testdbである。

[oracle@test2 ~]$ sqlplus testuser/testuser@testdb

# ちなみに上記ローカル接続ネーミングは簡易接続ネーミングでは以下の記述に等しい
[oracle@test2 ~]$ sqlplus testuser/testuser@test1:1521/testdb

プロセスの見え方

[oracle@test1 ~]$ ps -ef | grep oracletestdb
oracle   11312     1  0 22:44 ?        00:00:00 oracletestdb (LOCAL=NO)
oracle   11394 11163  0 22:45 pts/2    00:00:00 grep oracletestdb
[oracle@test1 ~]$

今度はLOCAL=NOと書かれており、リモート接続であることが分かる。

リスナーログの見え方

10-1月 -2019 22:44:31 * (CONNECT_DATA=(SERVICE_NAME=testdb)(CID=(PROGRAM=sqlplus@test2)(HOST=test2)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.110)(PORT=61444)) * establish * testdb * 0
10-1月 -2019 22:44:31 * service_update * testdb * 0

上記の情報から、接続元ホストの情報が書かれていることが確認できる。

通信の状態の見え方

[root@test1 ~]# netstat -an | grep 1521
tcp        0      0 192.168.56.109:1521         0.0.0.0:*                   LISTEN
tcp        0      0 192.168.56.109:25574        192.168.56.109:1521         ESTABLISHED
tcp        0      0 192.168.56.109:1521         192.168.56.109:25574        ESTABLISHED
tcp        0      0 192.168.56.109:1521         192.168.56.110:61444        ESTABLISHED  <-- これ
[root@test1 ~]#

接続が確立していることが確認できる。

リモート接続の場合 ( ローカルマシン上 )

リスナーの死活監視のためにローカルマシン上でリモート接続を行うことはあると思う。 というわけでデータベースサーバー上からローカル接続ではなくリモート接続を行った際の状況は以下の通り。

プロセスの見え方 ( ローカルマシン上からリモート接続した場合 )

[oracle@test1 ~]$ ps -ef | grep oracletestdb
oracle   11776     1  0 22:48 ?        00:00:00 oracletestdb (LOCAL=NO) <-- これ
oracle   11852 11163  0 22:48 pts/2    00:00:00 grep oracletestdb
[oracle@test1 ~]$

特に代わり映えなし。

リスナーログの見え方 ( ローカルマシン上からリモート接続した場合 )

Thu Jan 10 22:48:19 2019
10-1月 -2019 22:48:19 * (CONNECT_DATA=(SERVICE_NAME=testdb)(CID=(PROGRAM=sqlplus@test1)(HOST=test1)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.109)(PORT=25681)) * establish * testdb * 0
10-1月 -2019 22:48:21 * service_update * testdb * 0

特に代わり映えなし。

通信の状態の見え方 ( ローカルマシン上からリモート接続した場合 )

[root@test1 ~]# netstat -an | grep 1521
tcp        0      0 192.168.56.109:1521         0.0.0.0:*                   LISTEN
tcp        0      0 192.168.56.109:25574        192.168.56.109:1521         ESTABLISHED
tcp        0      0 192.168.56.109:1521         192.168.56.109:25574        ESTABLISHED
tcp        0      0 192.168.56.109:25681        192.168.56.109:1521         ESTABLISHED  <-- これ ( 接続元ホストでの情報 )
tcp        0      0 192.168.56.109:1521         192.168.56.109:25681        ESTABLISHED  <-- これ ( 接続先ホストでの情報 )
[root@test1 ~]#

ローカルマシン上からリモート接続しているため、当然ながら接続元、接続先ホスト両方の情報が見られる。

まとめ


今回はオラクルデータベースに接続した際のシステムの状況を確認した。 プロセス上ではローカル接続の場合はLOCAL=YES、リモート接続の場合はLOCAL=NOと表示される。
接続元ホストの状態などを知りたい場合はnetstatやリスナーログを確認すると接続元ホストのポート番号などの情報も得られる。

蛇足:接続元ポート番号の割り当て


リモート接続の際には通信のために 接続先ホストだけでなく、接続元ホストのポート番号が必要になるがその割り当てはランダムかと思いきや 下記のように、なにやら順番に割り当てられているように見えた。

[root@test1 ~]# netstat -an | grep 1521
tcp        0      0 192.168.56.109:1521         0.0.0.0:*                   LISTEN
tcp        0      0 192.168.56.109:25574        192.168.56.109:1521         ESTABLISHED
tcp        0      0 192.168.56.109:1521         192.168.56.110:61445        ESTABLISHED  <-- 一つ目の接続
tcp        0      0 192.168.56.109:1521         192.168.56.109:25574        ESTABLISHED
tcp        0      0 192.168.56.109:1521         192.168.56.110:61446        ESTABLISHED  <-- 二つ目の接続
[root@test1 ~]#

ちなみにここで割り当てられるポートの範囲はnet.ipv4.ip_local_port_rangeパラメータで確認、変更が可能である。

[root@test2 ~]# cat /etc/sysctl.conf | grep net.ipv4.ip_local_port_range
# oracle-rdbms-server-11gR2-preinstall setting for net.ipv4.ip_local_port_range is 9000 65500
net.ipv4.ip_local_port_range = 9000 65500
[root@test2 ~]#