web-dev-qa-db-ja.com

Oracleインスタンスにlistener.oraおよびtnsnames.oraを設定する方法

Listener.oraとtnsnames.oraを設定しましたが、うまく設定されているかどうかわかりません。 lsnrctl statusコマンドを呼び出すと、インスタンスrcadbおよびproddbが不明になります。

私はOracleの初心者ですが、ビルド済みのOracle 12cをインストールしました。

2つのデータベースを作成したので、この問題が発生し、間違いを見つけることができません。

インストールで取得したデータベースorcl12cには、変更したHost = 0.0.0.0がありました。

Listener.ora:

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = orcl12c)
      (SID_NAME = orcl12c)
      (Oracle_HOME = /u01/app/Oracle/product/12.2/db_1)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = prodDB)
      (SID_NAME = prodDB)
      (Oracle_HOME = /u01/app/Oracle/product/12.2/db_1)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = rcatDB)
      (SID_NAME = rcatDB)
      (Oracle_HOME = /u01/app/Oracle/product/12.2/db_1)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
      (ADDRESS = (PROTOCOL = TCP)(Host = 127.0.0.1)(PORT = 1521))
    )
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(Host = 127.0.0.2)(PORT = 1524))
    )
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(Host = 127.0.0.3)(PORT = 1525))
    )
  )

そして、私はこのようにtnsnames.oraを設定しました:

ORCL12C =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(Host = 127.0.0.1)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl12c)
    )
  )

prodDB =
 (DESCRIPTION =
    (ADDRESS = (PROTOCOL=TCP)(Host = 127.0.0.2)(PORT = 1524))
    (CONNECT_DATA =
       (SERVICE_NAME = prodDB)
    )
 )

rcatDB =
 (DESCRIPTION =
    (ADDRESS = (PROTOCOL=TCP)(Host = 127.0.0.3)(PORT = 1525))
    (CONNECT_DATA =
       (SERVICE_NAME = rcatDB)
    )
 )


LISTENER_ORCL12C =
  (ADDRESS = (PROTOCOL = TCP)(Host = 0.0.0.0)(PORT = 1521))


ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(Host = 0.0.0.0)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

lsnrctlステータス

Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(Host=127.0.0.1)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(Host=127.0.0.2)(PORT=1524)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(Host=127.0.0.3)(PORT=1525)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(Host=localhost)(PORT=8081))(Presentation=HTTP)(Session=RAW))
Services Summary...
Service "51c99766d7e2568de0530100007f4fae" has 1 instance(s).
  Instance "orcl12c", status READY, has 1 handler(s) for this service...
Service "orcl" has 1 instance(s).
  Instance "orcl12c", status READY, has 1 handler(s) for this service...
Service "orcl12c" has 2 instance(s).
  Instance "orcl12c", status UNKNOWN, has 1 handler(s) for this service...
  Instance "orcl12c", status READY, has 1 handler(s) for this service...
Service "orcl12cXDB" has 1 instance(s).
  Instance "orcl12c", status READY, has 1 handler(s) for this service...
Service "prodDB" has 1 instance(s).
  Instance "prodDB", status UNKNOWN, has 1 handler(s) for this service...
Service "rcatDB" has 1 instance(s).
  Instance "rcatDB", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully

編集:

[Oracle@localhost ~]$ unset TWO_TASK
[Oracle@localhost ~]$ . ./.profile_productionDB
[Oracle@localhost ~]$ sqlplus sys/Oracle as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Tue Jan 15 05:33:45 2019

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


Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> select name from v$database;

NAME
---------
PRODDB

SQL> 
1
petar

それには何の問題もありません。

リスナー制御ユーティリティSERVICESコマンド

  • UNKNOWNは、インスタンスがサービス登録で動的にではなく、listener.oraファイルに静的に登録されることを意味します。したがって、ステータスは不明です。

enter image description here

1
Balazs Papp

他の人がすでに指摘したように、「不明」は単にレポートがlistener.oraのSID_LISTセクションにリストされていたことを示しています。 「私はこれらへのリクエストを処理しようとしますが、現時点ではそれらのステータスを知る方法がありません」と言っているのはリスナーです。 「準備完了」リストは、リスナーに登録するデータベース自体からのものです-動的登録。

余談ですが、リスナーをさまざまなポートに配置し、さまざまなポートをtnsnamesにリストしても何も達成されません。実際にポートを特定のデータベースにバインドするものはありません。リスナー自体へのエントリとしてのみ使用されます。接続が確立されると、リスナーはクライアントとサーバーに通信するための異なる(準ランダム)ポートを提供します。そうすると、リスナーは完全に見えなくなります。リスナーがサービスしているデータベースの数に関係なく、1つのポートで十分です。

別の方法として、IPアドレス127.0.0.1はループバックアドレスです。プロセス(Oracleクライアントだけでなく任意のプロセス)がパケットを127.0.0.1(または「localhost」)に送信するように要求した場合、その要求は要求側システムにループバックされます。したがって、デスクトップAがサーバーB上のデータベースへの接続を要求したが、アドレスが127.0.01であると指定した場合、要求はサーバーBに到達しません。

TWO_TASKは、接続文字列で '@dbname'を使用する代わりに変数を提供するだけです。 TWO_TASK = mydbを設定すると、

sqlplus fred/fred

と同じです

sqlplus fred/fred@mydb
2
EdStevens

UNKNOWNステータスは必ずしも問題ではありません。データベースの前にリスナーを開始すると、リスナーがデータベースのステータスを認識しない場合に発生する可能性があります。

あなたがするとき:

[Oracle@localhost ~]$ sqlplus sys/Oracle as sysdba

リスナーを使用せずに、データベースにローカルに接続しています。リスナーを停止して、接続を試みることができます。うまくいくはずです。

Tnsnames/listenerをテストする場合は、最初にテストユーザーを作成します。

[Oracle@localhost ~]$ sqlplus / as sysdba
create user test_tns identified by "test_tns";
grant create session to test_tns;
exit;

それからテストしてください:

[Oracle@localhost ~]$ sqlplus test_tns/test_tns@rcadb
1
Sy10100