5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Oracle 共有サーバ接続関連

Last updated at Posted at 2015-04-27

内容

共有サーバ接続に関する以下の項目を記載。

  • 共有サーバ接続の設定
  • XMLDB導入時の注意事項

共有サーバ接続の設定

1. 初期パラメータの確認

以下の初期化パラメータを確認する。

  • SHARED_SERVERSに"1"以上の値が設定されていること。
  • DISPATCHERSに正しい値が設定されていること。デフォルト値は"(PROTOCOL=TCP)"。

以下のSQLで確認。

SQL> col name for a30
SQL> col value for a50
SQL> select name,value from v$parameter where name in ('dispatchers','shared_servers');

 NAME                           VALUE
------------------------------ --------------------------------------------------
dispatchers                    (PROTOCOL=TCP)
shared_servers                 1

必要があれば変更。

SQL> alter system set shared_servers=5 scope=both;

システムが変更されました。

SQL> alter system set DISPATCHERS='(PROTOCOL=TCP)(DISPATCHERS=5)' scope=both;

システムが変更されました。

SQL> select name,value from v$parameter where name in ('dispatchers','shared_servers');

NAME                           VALUE
------------------------------ --------------------------------------------------
dispatchers                    (PROTOCOL=TCP)(DISPATCHERS=5)
shared_servers                 5

2. 各設定ファイルを確認

  • tnsnames.ora
    "(DESCRIPTIN="内に"(SERVER=DEDICATED)"が指定されていないこと。
    → この設定を削除 or "(SERVER=SHARED)"を設定

  • sqlnet.ora
    "USE_DEDICATED_SERVER=ON"が指定されていないこと。
    → この設定を削除 or "USE_DEDICATED_SERVER=OFF"を設定

3. リスナー登録状況を確認

"lsnrctl service"コマンドを実行。ハンドラ"D000〜"が登録されていること。

  • 設定の再読み込み
$ lsnrctl reload
  • 登録状況確認
$ lsnrctl service

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 25-4月 -2015 21:13:18

Copyright (c) 1991, 2013, Oracle.  All rights reserved.

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=rhel01)(PORT=1521)))に接続中
サービスのサマリー...
サービス"TESTDB01"には、1件のインスタンスがあります。
インスタンス"TESTDB01"、状態READYには、このサービスに対する6件のハンドラがあります...
  ハンドラ:
    "D004" 確立:0 拒否:0 現行:0 最大:1022 状態:ready
       DISPATCHER <machine: rhel01, pid: 5362>
       (ADDRESS=(PROTOCOL=tcp)(HOST=rhel01)(PORT=40818))
    "D003" 確立:0 拒否:0 現行:0 最大:1022 状態:ready
       DISPATCHER <machine: rhel01, pid: 5360>
       (ADDRESS=(PROTOCOL=tcp)(HOST=rhel01)(PORT=45898))
    "D002" 確立:0 拒否:0 現行:0 最大:1022 状態:ready
       DISPATCHER <machine: rhel01, pid: 5358>
       (ADDRESS=(PROTOCOL=tcp)(HOST=rhel01)(PORT=34725))
    "D001" 確立:0 拒否:0 現行:0 最大:1022 状態:ready
       DISPATCHER <machine: rhel01, pid: 5356>
       (ADDRESS=(PROTOCOL=tcp)(HOST=rhel01)(PORT=9412))
    "D000" 確立:0 拒否:0 現行:8 最大:1022 状態:ready
       DISPATCHER <machine: rhel01, pid: 1639>
       (ADDRESS=(PROTOCOL=tcp)(HOST=rhel01)(PORT=55424))
    "DEDICATED" 確立:0 拒否:0 状態:ready
       LOCAL SERVER
コマンドは正常に終了しました。

4. 共有サーバ接続の確認

V$SESSIONビューのSERVER列で確認する。
SERVER列の内容は以下の通り。

  • DEDICATED
    → 専用サーバ接続
  • SHARED
    → 共有サーバ接続
  • NONE
    → 共有サーバ接続(アイドル状態)

確認方法は以下の通り。

  • 接続別セッション数
SQL> SELECT SERVER, COUNT(*) FROM V$SESSION GROUP BY SERVER;

SERVER                        COUNT(*)
--------------------------- ----------
DEDICATED                           29
SHARED                               1
NONE                                 1
  • 現セッションの接続種別
SQL> SELECT SERVER FROM V$SESSION WHERE SID = USERENV('SID') ;

SERVER
---------------------------
SHARED
  • セッションに対応するディスパッチャープロセス(D000〜)
SQL> COL PROCESS FOR A20
SQL> COL PROGRAM FOR A40
SQL> COL USERNAME FOR A10
SQL> COL PID FOR A5
SQL> SELECT P.PNAME PNAME, P.SPID PID,S.SID,S.SERIAL#,S.USERNAME,S.PROGRAM PROGRAM
     FROM V$PROCESS P, V$SESSION S
     WHERE P.ADDR = S.PADDR AND P.PNAME LIKE '%D00%';

PNAME           PID          SID    SERIAL# USERNAME   PROGRAM
--------------- ----- ---------- ---------- ---------- ----------------------------------------
D001            5356          44        567 SYSTEM     sqlplus@rhel01 (TNS V1-V3)
D002            5358          30         13 SYSTEM     sqlplus@rhel01 (TNS V1-V3)
D002            5358          52        575 SYSTEM     sqlplus@rhel01 (TNS V1-V3)
D003            5360          39        609 SYSTEM     sqlplus@rhel01 (TNS V1-V3)
D003            5360          46         83 SYSTEM     sqlplus@rhel01 (TNS V1-V3)
D004            5362          28        859 SYSTEM     sqlplus@rhel01 (TNS V1-V3)
D004            5362          47        571 SYSTEM     sqlplus@rhel01 (TNS V1-V3)

SQL> -- P.SPID列は、"lstener service"で表示されるpidと同じ
SQL> --   DISPATCHER <machine: rhel01, pid: 5358>
SQL> --                                     ~~~~

XMLDB導入時の注意事項

内容

XMLDBインストール後、今まで使用していた共有サーバ接続が接続できなくなるという事象が発生。
その時の原因と対応を以下に記載する。

事象

XMLDBインストール後、今まで使用していた共有サーバ接続を実施したところ、以下のエラーが発生。

$ sqlplus system/oracle@TESTDB01

SQL*Plus: Release 11.2.0.4.0 Production on  4 25 22:17:31 2015

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

ERROR:
ORA-12520: TNS:
リスナーは、リクエストしたサーバー・タイプに使用可能なハンドラを検出できませんで
した。

今まで使用していたサービス"TESTDB01"にDISPATCHERがリスナーに登録されていないことを確認。

SQL> !lsnrctl service
…(省略)…

サービスのサマリー...
サービス"TESTDB01"には、1件のインスタンスがあります。
  インスタンス"TESTDB01"、状態READYには、このサービスに対する1件のハンドラがあります...
    ハンドラ:
      "DEDICATED" 確立:0 拒否:0 状態:ready
         LOCAL SERVER
サービス"TESTDB01XDB"には、1件のインスタンスがあります。
  インスタンス"TESTDB01"、状態READYには、このサービスに対する1件のハンドラがあります...
    ハンドラ:
      "D002" 確立:0 拒否:0 現行:2 最大:1022 状態:ready
         DISPATCHER <machine: rhel01, pid: 5358>
         (ADDRESS=(PROTOCOL=tcp)(HOST=rhel01)(PORT=34725))
コマンドは正常に終了しました。

原因

XMLDBインストール時に初期化パラメータdispatchersに以下の値を設定したが、この"SERVICE"パラメータの値に不足があったことが原因。
今回は今まで使用していたサービス名が不足していたのが原因。

dispatchers="(PROTOCOL=TCP) (SERVICE=<sid>XDB)"

以下のように修正する。

dispatchers="(PROTOCOL=TCP) (SERVICE=<今まで使用していたサービス名>,<sid>XDB)"

対応

####1. 登録対象サービスの確認
V$SERVICESで、登録をする必要があるサービスを確認。

SQL> select name from v$services;

NAME
------------------------------
TESTDB01XDB
TESTDB01
SYS$BACKGROUND
SYS$USERS

-- SYS$USERS
-- → ユーザーセッションを明示的に識別するサービス名なしに
--    確立したとき使用するデフォルトのサービス名。
-- SYS$BACKGROUND
-- → すべてのOracle Databaseのバックグラウンドプロセスで構成。

####2. 初期化パラメータの変更

SQL> alter system set dispatchers='(PROTOCOL=TCP)(SERVICE=TESTDB01,TESTDB01XDB)' scope=both;

システムが変更されました。

SQL> select name,value from v$parameter where name = 'dispatchers';

NAME                           VALUE
------------------------------ --------------------------------------------------
dispatchers                    (PROTOCOL=TCP)(SERVICE=TESTDB01,TESTDB01XDB)

####3. リスナーの再読み込み

SQL> !lsnrctl reload
…(省略)…

SQL> !lsnrctl service
…(省略)…

サービスのサマリー...
サービス"TESTDB01"には、1件のインスタンスがあります。
  インスタンス"TESTDB01"、状態READYには、このサービスに対する2件のハンドラがあります...
    ハンドラ:
      "D002" 確立:0 拒否:0 現行:1 最大:1022 状態:ready
         DISPATCHER <machine: rhel01, pid: 5358>
         (ADDRESS=(PROTOCOL=tcp)(HOST=rhel01)(PORT=34725))
      "DEDICATED" 確立:0 拒否:0 状態:ready
         LOCAL SERVER
サービス"TESTDB01XDB"には、1件のインスタンスがあります。
  インスタンス"TESTDB01"、状態READYには、このサービスに対する1件のハンドラがあります...
    ハンドラ:
      "D002" 確立:0 拒否:0 現行:1 最大:1022 状態:ready
         DISPATCHER <machine: rhel01, pid: 5358>
         (ADDRESS=(PROTOCOL=tcp)(HOST=rhel01)(PORT=34725))
コマンドは正常に終了しました。

####4. 接続確認
sqlplusを8つ立ち上げ、4つを"TESTDB01"サービスに、残りを"TESTDB01XDB"サービスに共有サーバで接続。
以下のSQLで接続状況を確認。

SQL> COL SERVICE_NAME FOR A20
SQL> SELECT SERVICE_NAME,SERVER,COUNT(*) 
     FROM V$SESSION GROUP BY SERVICE_NAME,SERVER
     ORDER BY 1,2;

SERVICE_NAME         SERVER                        COUNT(*)
-------------------- --------------------------- ----------
SYS$BACKGROUND       DEDICATED                           26
TESTDB01             NONE                                 3
TESTDB01             SHARED                               1
TESTDB01XDB          NONE                                 4
5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?