oracle DBとリスナーの挙動調査<!-- --> | <!-- -->塩焼き太郎のブログ♪
塩焼き太郎のブログ♪

oracle DBとリスナーの挙動調査

Posted: December 3, 2014

状況
リスナーは動的設定とする。

以下、調査結果。

1:DBインスタンスも起動されていない状態でリスナーを起動したらどうなるか

結果

[oracle@localhost]$ lsnrctl services LISTENER_1 LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 03-DEC-2014 01:51:13 Copyright (c) 1991, 2009, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1524))) The listener supports no services The command completed successfully

DBインスタンスを起動していなくてもリスナーは起動できる。
ただ、サービス名は登録されない模様(って当たり前か)

2:インスタンスを起動したらどうか

#インスタンスの起動 [oracle@localhost ~]$ sqlplus /nolog SQL*Plus: Release 11.2.0.1.0 Production on Wed Dec 3 02:00:20 2014 Copyright (c) 1982, 2009, Oracle. All rights reserved. idle> connect / as sysdba Connected to an idle instance. idle> startup nomount ORACLE instance started. Total System Global Area 1085640704 bytes Fixed Size 2212536 bytes Variable Size 838864200 bytes Database Buffers 234881024 bytes Redo Buffers 9682944 bytes

さて、結果は

[oracle@localhost]$ lsnrctl services LISTENER_1 LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 03-DEC-2014 02:01:24 Copyright (c) 1991, 2009, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1524))) Services Summary... Service "SALES" has 1 instance(s). Instance "sales", status BLOCKED, has 1 handler(s) for this service... Handler(s): "DEDICATED" established:0 refused:0 state:ready LOCAL SERVER The command completed successfully

お、サービス名が登録されている。インスタンスの起動により、
初期かパラメータに書かれてあるサービス名が動的に登録されているのが見て取れる。

status : BLOCKED
これは接続不可能であることを示している。
DBインスタンスを起動した時点ではまだリスナーを通して接続はできないみたい
(まあローカルからの接続でさえDBがオープンしないと一般ユーザでは接続できないので当然といえば当然なのかも。。。)

3:DBをマウントしたらどうか

#マウントする SQL> alter database mount; Database altered.

さて結果は。。。

[oracle@localhost]$ lsnrctl services LISTENER_1 LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 03-DEC-2014 02:11:02 Copyright (c) 1991, 2009, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1524))) Services Summary... Service "SALES" has 1 instance(s). Instance "sales", status READY, has 1 handler(s) for this service... Handler(s): "DEDICATED" established:0 refused:0 state:ready LOCAL SERVER

おお、READYになった。ということはリスナー経由で接続可能なのか?

[oracle@localhost]$ sqlplus system@sales SQL*Plus: Release 11.2.0.1.0 Production on Wed Dec 3 02:15:24 2014 Copyright (c) 1982, 2009, Oracle. All rights reserved. Enter password: ERROR: ORA-01033: ORACLE initialization or shutdown in progress Process ID: 0 Session ID: 0 Serial number: 0

やはりDBがオープンしていないから失敗した。となるとマウントした状態でREADYになっても嬉しくないような。。。

4:DBをオープンしたらどうか

ってこれは大丈夫だと思うが確認の意味を込めて。

SQL> alter database open; Database altered.

リスナーの状態はというと

[oracle@localhost]$ lsnrctl services LISTENER_1 LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 03-DEC-2014 02:19:43 Copyright (c) 1991, 2009, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1524))) Services Summary... Service "SALES" has 1 instance(s). Instance "sales", status READY, has 1 handler(s) for this service... Handler(s): "DEDICATED" established:1 refused:0 state:ready LOCAL SERVER

お。さっきと比べるとestablishedが0から1になっている。

リスナー経由で無事に接続できた。

[oracle@localhost]$ sqlplus system@sales SQL*Plus: Release 11.2.0.1.0 Production on Wed Dec 3 02:22:27 2014 Copyright (c) 1982, 2009, Oracle. All rights reserved. Enter password: Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL>

establishedにはリスナーが接続を確立した累計が表示されているらしい。

なるほど。これは例えば複数サービス名登録しておくとサービス名ごとの累計接続数を確認できるということか。

とまあこんなところで。
結論は、
DBがオープンしてないとリスナー経由でのDB接続はできないという
至極当たり前な挙動でした。