web-dev-qa-db-ja.com

TNSLSNRが間違ったリスナーをロードするのはなぜですか?

Oracle 12cを使用しています。私は1つのCDBと1つのPDBを持っています(私の知る限り)。練習のために、2つのリスナーを作成しました。 tnsnames.oraファイルで適切な設定を行いました。

観察:

  • lsnrctl startを実行するだけ、つまりリスナー名を指定しない場合、** TNSLSNRは実際に/ora01/app/Oracle/product/12.1.0/db_1/bin/tnslsnrにあるリスナーをロードします(これはpsで示されるパスです)lsnrctl startを実行する前に、 $Oracle_HOME/network/adminのlistener.oraはありません。シンプルなxxxxxlistener.oraによってロードされた「ゾンビ」リスナーをテストするために、名前をlsnrctl startに変更しました。最悪の部分は、応答メッセージが$Oracle_HOME/network/admin/listener.oraからリスナーをロードしたと言っていることです。そのファイルの名前をxxxxxlistener.oraに変更したので、これはAWFULです。

コンピュータにゴーストファイルがあります。カスタムリスナーを練習することさえできないので、助けてください。

カスタムリスナーをポート1521に配置しないように練習することはできません。DBに接続するためにそれらを使用することはできません。その「幽霊」のリスナーは物事を台無しにしているようです

2
Jason Krs

lsnrctl START [listener_name]

上記のコマンドで、listener_nameはlistener.oraファイルで定義されたリスナーの名前です。デフォルトのリスナー名LISTENERを使用している場合は、リスナーを識別する必要はありません。

リスナー名なしでlsnrctl startを押すと、Oracleは2つのアドレスで待機するデフォルトのリスナーを開始しようとします。

(ADDRESS=(PROTOCOL=ipc)(KEY=PNPKEY))
(ADDRESS=(PROTOCOL=tcp)(PORT=1521))

特定のリスナーを開始する場合は、まず、以下のようにlistener.oraファイルでリスナーを定義し、リスナー名をlsnrctl start listener_nameとして指定して開始します。

[Oracle@ora12c admin]$ lsnrctl start listener3

LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 07-JAN-2017 19:53:16

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

Starting /u01/app/Oracle/product/12.1.0/db_1/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 12.1.0.2.0 - Production
System parameter file is /u01/app/Oracle/product/12.1.0/db_1/network/admin/listener.ora
Log messages written to /u01/app/Oracle/diag/tnslsnr/ora12c/listener3/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(Host=192.168.30.133)(PORT=1523)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=192.168.30.133)(PORT=1523)))
STATUS of the LISTENER
------------------------
Alias                     listener3
Version                   TNSLSNR for Linux: Version 12.1.0.2.0 - Production
Start Date                07-JAN-2017 19:53:17
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/Oracle/product/12.1.0/db_1/network/admin/listener.ora
Listener Log File         /u01/app/Oracle/diag/tnslsnr/ora12c/listener3/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(Host=192.168.30.133)(PORT=1523)))
The listener supports no services
The command completed successfully
[Oracle@ora12c admin]$ cat listener.ora 
# listener.ora Network Configuration File: /u01/app/grid/product/12.1.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.

ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER2 = ON

VALID_NODE_CHECKING_REGISTRATION_LISTENER = SUBNET

VALID_NODE_CHECKING_REGISTRATION_LISTENER2 = SUBNET

LISTENER1 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(Host = 192.168.30.133)(PORT = 1522))
    )
  )

LISTENER3 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(Host = 192.168.30.133)(PORT = 1523))
    )
  )

ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER = ON

Local_listener初期化パラメーターを設定します。その数はリスナーの数を使用します。私の場合、私は両方を使用しました。

SQL>alter system set local_listener='(ADDRESS=(PROTOCOL=TCP)(Host=192.168.30.133)(PORT=1522))','(ADDRESS=(PROTOCOL=TCP)(Host=192.168.30.133)(PORT=1523))';

更新

ORA-00119:システムパラメータLOCAL_LISTENERの指定が無効です

ORA-00132:構文エラーまたは未解決のネットワーク名 'LISTENER1'

オラクルは言う-

00132、00000、「構文エラーまたは未解決のネットワーク名 '%s'」

原因:リスナーのアドレスに構文エラーがあるか、解決できません。

アクション:ネットワーク名が指定されている場合、それがTNSNAMES.ORAまたはシステムに設定されているその他のアドレスリポジトリのエントリに対応していることを確認します。エントリが構文的に正しいことを確認してください。

データベースを作成してリスナー名を指定すると、Oracleがtnsnames.oraファイルにTNSエイリアスを作成し、そのエイリアスがlocal_listener値として使用されます。

$ cat $Oracle_HOME/network/admin/tnsnames.ora
#LISTENER1 =
#  (ADDRESS = (PROTOCOL = TCP)(Host = ora12c.dba.com)(PORT = 1522))

あなたの場合、エイリアス名はLISTENER_ORA12CではなくLISTENER1にする必要があります。シナリオをシミュレートするために、そのエイリアスにコメントしました。

tnsnames.oraに移動して、エイリアスが存在することを確認してください。次に、Oracleインスタンスの起動を再試行してください。

[Oracle@ora12c admin]$ vi tnsnames.ora 
# tnsnames.ora Network Configuration File: /u01/app/Oracle/product/12.1.0/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

LISTENER1 =
  (ADDRESS = (PROTOCOL = TCP)(Host = ora12c.dba.com)(PORT = 1522))



[Oracle@ora12c admin]$ sqlplus / as sysdba

SQL*Plus: Release 12.1.0.2.0 Production on Sun Jan 8 09:10:35 2017

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

Connected to an idle instance.

SQL> startup
Oracle instance started.

Total System Global Area  838860800 bytes
Fixed Size          2929936 bytes
Variable Size         624954096 bytes
Database Buffers      100663296 bytes
Redo Buffers            5455872 bytes
In-Memory Area        104857600 bytes
Database mounted.
Database opened.
SQL> show parameter local_listener

NAME                     TYPE    VALUE
------------------------------------ ----------- ------------------------------
local_listener               string  LISTENER1

参照: Oracle Net Listenerの構成と管理

2
JSapkota

Balazs PappとJSapkotaの回答に基づいて、問題がどのように解決されたかを段階的に説明します。詳細については、Balazs PappおよびJSapkotaの回答を読む必要があります。

ステップ1

  • LOCAL_LISTENERパラメータの初期化パラメータファイルを編集して、1521以外のポートにリスナーを追加します

    local_listener='(ADDRESS = (PROTOCOL = TCP)(Host = localhost)(PORT = 1521))' ,' (ADDRESS = (PROTOCOL = TCP)(Host = localhost)(PORT = 1522))' , '(ADDRESS = (PROTOCOL = TCP)(Host = localhost)(PORT = 1523))'

  • Spfileしかない場合は、うまくいけば次のことができます。

    connect / as sysdba

    startup

    alter system set local_listener = '(ADDRESS = (PROTOCOL = TCP)(Host = localhost)(PORT = 1521))' ,' (ADDRESS = (PROTOCOL = TCP)(Host = localhost)(PORT = 1522))' , '(ADDRESS = (PROTOCOL = TCP)(Host = localhost)(PORT = 1523))'

ステップ2

OS認証を使用して接続し、データベースを起動します

  • connect / as sysdbaおよびSTARTUP PFILE = <path>/you_init_file.ora

  • Initファイルがなく、spfileを変更する必要がある場合は、shutdown immediatestartupを再び

ステップ3

これで準備は完了です。プラガブルデータベースを開いて、クライアントから切断できます。切断後、listener.oraとtnsnames.oraがLOCAL_LISTENERパラメータファイルで適切に構成されていて、接続する必要のあるリスナーがサーバーで開始されている場合、connect username/password@descriptorを使用してそのリスナーからクライアントに再接続できます。ここで、「記述子」は、実行中のカスタムリスナーに関連付けられたネットワークサービス名に対応します。

構文の詳細については、以下をお読みください。

https://docs.Oracle.com/database/121/NETRF/tnsnames.htm#NETRF26

https://docs.Oracle.com/cd/B28359_01/network.111/b28317/listener.htm#NETRF008

Balazs PappとJSapkotaに感謝

2
Jason Krs

lsnrctl startは、ポート1521LISTENERという名前のデフォルトのリスナーを起動します。これは設定を必要としません。このリスナーはlistener.oraなしで開始できます。

カスタムリスナーをポート1521に配置しないように練習することはできません。DBに接続するためにそれらを使用することはできません。

データベースは、設定なしでデフォルトの1521ポートで実行されているリスナーに登録されます。他のポートでリスニングする他のリスナーにもデータベースを動的に登録する場合は、local_listenerパラメータを設定する必要があります。たとえば、ポート15211522に2つのリスナーがある場合、Hostの後に実際のホスト名またはIPを使用して、データベースインスタンスで以下を設定する必要があります。

alter system set local_listener='(ADDRESS=(PROTOCOL=TCP)(Host=...)(PORT=1521)), (ADDRESS=(PROTOCOL=TCP)(Host=...)(PORT=1522))';
1
Balazs Papp