oracle實驗記錄 (listener.ora與 tnsnames.ora)

fufuh2o發表於2009-09-09

講解下listener.ora與 tnsnames.ora

寫過一篇NET的 不過實驗完後 複製記錄 時 順序有問題,所以重新整理實驗記錄一次

伺服器listener
C:\>sqlplus xh/a831115

SQL*Plus: Release 10.1.0.2.0 - Production on 星期三 8月 12 13:17:32 2009

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


Connected to:
Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production
With the Partitioning, OLAP and Data Mining options
這種是IPC 連線(程式間連線) client與SERVER 在一臺機器上

SQL> conn xh/a831115@orcl;
已連線。

這種TCP IP連線   CLIENT 用TNSNAMES.ora ,server用 listener.ora

基本理論:
基本的TCP IP 過程是  CLIENT 發請求 SERVER 的LISTENER 程式 監聽請求 然後LISTENER 通過PMON 註冊到LISTENER的資訊檢查下,然後LISTENER 衍生出一個SERVER HANDLER 新

程式(理論上為LISTENER程式的子程式)並且將連線描述符也交給這個子程式,這樣子程式 與CLIENT 通訊 沿用LISTENER的IP&PORT ,CLIENT 屬於一次TCP/IP連線,若OS 不允許

直接傳送(WIN NT上就如此)CLIENT 請求 LISTENER ,LISTENER 衍生出SERVER HANDLER ,LISTENER  與衍生出的新程式IPC連線
新程式將PORT 告訴LISTENER ,LISTENER將PORT 告訴 CLIENT,CLIENT 用新PORT 與 新程式連線(IP 還是用LISTENER的 因為只發了PORT) 這樣CLIENT 就是2次TCP連線,另外若

是SHARED MODE那麼 LISTENER不會衍生SERVER HANDLER 而是提前配置好DISPATCHER程式 並且註冊到LISTENER中

 


伺服器端的 LISTENER.ORA
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)~~~~~~~~為外部儲存過程配置的本地監聽
      (ORACLE_HOME = E:\oracle\product\10.2.0\db_1)
      (PROGRAM = extproc)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 6688-621)(PORT = 1521))
    )
  )

C:\>lsnrctl

LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 07-9月 -2009 15
0

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

歡迎來到LSNRCTL, 請鍵入"help"以獲得資訊。

LSNRCTL> status

服務 "PLSExtProc" 包含 1 個例程。
  例程 "PLSExtProc", 狀態 UNKNOWN, 包含此服務的 1 個處理程式...
服務 "orcl" 包含 1 個例程。
  例程 "orcl", 狀態 READY, 包含此服務的 1 個處理程式...
服務 "orcl_XPT" 包含 1 個例程。
  例程 "orcl", 狀態 READY, 包含此服務的 1 個處理程式...~~~~~~~~~~~~可以看到為 動態註冊
命令執行成功                                                     動態ready,靜態unknown


情況一先啟動 DATABASE 後啟動 LISTENER

LSNRCTL> stop (關閉lsnrctl)


SQL> conn xh/a831115@orcl
ERROR:
ORA-12541: TNS: 無監聽程式


警告: 您不再連線到 ORACLE。
LSNRCTL> start
啟動tnslsnr: 請稍候...
服務 "PLSExtProc" 包含 1 個例程。
  例程 "PLSExtProc", 狀態 UNKNOWN, 包含此服務的 1 個處理程式...
命令執行成功

LSNRCTL> STATUS
服務 "PLSExtProc" 包含 1 個例程。
  例程 "PLSExtProc", 狀態 UNKNOWN, 包含此服務的 1 個處理程式...
命令執行成功
SQL> conn xh/a831115@orcl
ERROR:
ORA-12514: TNS: 監聽程式當前無法識別連線描述符中請求的服務


此時我們可以等待 PMON程式60秒向LISTENER 註冊資訊 也可以 手動註冊
SQL> alter system register;

系統已更改
LSNRCTL> STATUS 
服務摘要..
服務 "PLSExtProc" 包含 1 個例程。
  例程 "PLSExtProc", 狀態 UNKNOWN, 包含此服務的 1 個處理程式.
服務 "orcl" 包含 1 個例程。
  例程 "orcl", 狀態 READY, 包含此服務的 1 個處理程式...~~~~~~~~~~~~~~~~~~~手動註冊資訊後
服務 "orcl_XPT" 包含 1 個例程。~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~READY動態註冊
  例程 "orcl", 狀態 READY, 包含此服務的 1 個處理程式...
命令執行成功

SQL> conn xh/a831115@orcl
已連線。


這樣的情況是由於 是動態註冊導致,listener.ora中沒有服務的資訊(要等 60秒PMON 才會向LISTENER註冊)
下面針對這種情況 配置靜態註冊(靜態配置 就是將資訊明確的寫到 LISTENER。ORA中)


SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = E:\oracle\product\10.2.0\Db_1)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = orcl)
      (ORACLE_HOME = E:\oracle\product\10.2.0\Db_1)
      (SID_NAME = orcl)
    )
  )

 

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
    )
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 6688-621)(PORT = 1521))~~~~~~~~~~~~~~~~~~~~~把資訊加到LISTENER.ORA中
    )
  )                   協議,主機名字(IP也行) ,埠號

LSNRCTL>STop
LSNRCTL>START(造成DATABASE 先啟動LSNRCTL 後啟動)
LSNRCTL>STATUS
服務摘要..
服務 "PLSExtProc" 包含 1 個例程。
  例程 "PLSExtProc", 狀態 UNKNOWN, 包含此服務的 1 個處理程式...
服務 "orcl" 包含 1 個例程。
  例程 "orcl", 狀態 UNKNOWN, 包含此服務的 1 個處理程式...~~~~~~~~~~~~~~~~~~~~~~~~靜態註冊(UNKNOW) 此時可以看到沒有動態註冊(READY)
命令執行成功
SQL> conn xh/a831115@orcl(通過靜態註冊連線)
已連線。
LSNRCTL>STATUS
服務 "PLSExtProc" 包含 1 個例程。
  例程 "PLSExtProc", 狀態 UNKNOWN, 包含此服務的 1 個處理程式...
服務 "orcl" 包含 2 個例程。
  例程 "orcl", 狀態 UNKNOWN, 包含此服務的 1 個處理程式...
  例程 "orcl", 狀態 READY, 包含此服務的 1 個處理程式...
服務 "orcl_XPT" 包含 1 個例程。
  例程 "orcl", 狀態 READY, 包含此服務的 1 個處理程式...~~~~~~~~~~~~~~~過了會看 PMON想LSNRCTL 動態註冊了

 

動態註冊的一個特點就是不需要LISTENER.ORA檔案
預設情況PMON 向LSNRCTL 註冊TCP/IP協議,PORT 為1521*********當然可以改埠號 需要下面這個引數 ,對此將有單獨的實驗

SQL> show parameter local

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

SQL> host move E:\oracle\product\10.2.0\Db_1\NETWORK\ADMIN\listener.ora  d:\listene    ~~~~~~~~~~~~~~~移走
r.ora


LSNRCTL> stop
正在連線到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)))
命令執行成功
LSNRCTL> start

命令執行成功
LSNRCTL> status
正在連線到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)))
TNS-12541: TNS: 無監聽程式
 TNS-12560: TNS: 協議介面卡錯誤
  TNS-00511: 無監聽程式
   32-bit Windows Error: 2: No such file or directory
正在連線到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=6688-621)(PORT=1521)))
LISTENER 的 STATUS
------------------------
別名                      LISTENER
版本                      TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Producti
on
啟動日期                  07-9月 -2009 16:31:59
正常執行時間              0 天 0 小時 0 分 6 秒
跟蹤級別                  off
安全性                    ON: Local OS Authentication
SNMP                      OFF
監聽程式日誌檔案          E:\oracle\product\10.2.0\db_1\network\log\listener.log
監聽端點概要...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=6688-621)(PORT=1521)))
監聽程式不支援服務
命令執行成功

*****
服務 "orcl" 包含 1 個例程。
  例程 "orcl", 狀態 READY, 包含此服務的 1 個處理程式...~~~~~過一會PMON 註冊動態LISTENER了
服務 "orcl_XPT" 包含 1 個例程。
  例程 "orcl", 狀態 READY, 包含此服務的 1 個處理程式...


SQL> conn xh/a831115@orcl;
已連線。

 

靜態時候 LISTENER 將 LISTENER.ORA中 GLOBAL_NAME 與CLIENT TNSNAMES.ORA中 SERVIEC_NAME 匹配 若CILENT TNSNAME.ORA中用的 SID 那麼 listener  use  LISTENER.ORA中

SID_name 匹配就行了

實驗看下

listener.ora
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = E:\oracle\product\10.2.0\Db_1)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = orcl)
      (ORACLE_HOME = E:\oracle\product\10.2.0\Db_1)
      (SID_NAME = orcl)
    )
  )

 

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
    )
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 6688-621)(PORT = 1521))
    )
  )

tnsnames.ora
ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 6688-621)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)                                                      ~~~~~~~~~~~~~~~~~~~將SERVICE_NAME 修改成別的
    )
  )

EXTPROC_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
    )
    (CONNECT_DATA =
      (SID = PLSExtProc)
      (PRESENTATION = RO)
    )
  )

 

 

SQL> show parameter db_name

NAME                                 TYPE        VALUE
------------------------------------ ----------- ---------------
db_name                              string      xhtest
SQL> show parameter db_domain

NAME                                 TYPE        VALUE
------------------------------------ ----------- ---------------
db_domain                            string
SQL> show parameter service_name

NAME                                 TYPE        VALUE
------------------------------------ ----------- ---------------
service_names                        string      ORCL, XH
SQL> show parameter global_name

NAME                                 TYPE        VALUE
------------------------------------ ----------- ---------------
global_names                         boolean     FALSE
SQL>

 default service_name=global_name=db_name.db_domain


用server_name匹配


    (SID_DESC =
      (GLOBAL_DBNAME = tttttt)~~~~~~~~~~~~~~~~~~~修改 (LISTENER.ORA)
      (ORACLE_HOME = E:\oracle\product\10.2.0\Db_1)
      (SID_NAME = orcl)
    )
  )


ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 6688-621)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)~~~~~~~~
      (SERVICE_NAME= orcl)~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(tnsnames.ORA)
    )
  )

 

LSNRCTL STOP
        START
        STATUS

服務 "tttttt" 包含 1 個例程。
  例程 "orcl", 狀態 UNKNOWN, 包含此服務的 1 個處理程式...~~~此時只有一個靜態
命令執行成功
LSNRCTL>


SQL> conn xh/a831115@orcl
ERROR:
ORA-12514: TNS: 監聽程式當前無法識別連線描述符中請求的服務~~~出現問題 LISTENER.ORA中GLOBAL_NAME與 TNSNAMES.ORA中SERVICE_NAME 不匹配


警告: 您不再連線到 ORACLE。


用orcle_sid匹配
LISTENER.ORA

    (SID_DESC =
      (GLOBAL_DBNAME = tttttt)~~~~~~~~~~~~~~不在使用這個匹配
      (ORACLE_HOME = E:\oracle\product\10.2.0\Db_1)
      (SID_NAME = orcl)~~~~使用這個
    )
  )

 

 

tnsnames.ora
ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 6688-621)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (oracle_sid = orcl)**********************************讓TNSNAMES使用ORACLESID 這樣 LISTENER.ORA 將用 SID_NAME與起其匹配
    )
  )


LSNRCTL STOP
        START


服務 "PLSExtProc" 包含 1 個例程。
 例程 "PLSExtProc", 狀態 UNKNOWN, 包含此服務的 1 個處理程式...
服務 "tttttt" 包含 1 個例程。
 例程 "orcl", 狀態 UNKNOWN, 包含此服務的 1 個處理程式...~~~~~~~~~~~~~~~~~~靜態註冊
命令執行成功~~~~~~~~~~~~~LSTENER STATUS


SQL> conn xh/a831115@orcl
已連線。

 


******************
關於tnsnames.ora
這個是CLIENT 要配的~~~CLIENT 總要知道些資訊才能 才能連線吧 包括 使用者 名 密碼,IP,PORT,SERVICE_name
xh =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 6688-621)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (oracle_sid  = orcl)
    )
  )
AA =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 6688-621)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (oracle_sid = orcl)
    )
  )
EXTPROC_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
    )
    (CONNECT_DATA =
      (SID = PLSExtProc)
      (PRESENTATION = RO)
    )
  )

也可以 不用TNSNAME。ORA直接連

  IP Address. . . . . . . . . . . . : 192.168.1.126

SQL> conn xh/a831115@192.168.1.126:1521/xh  (IP ,PORT,連線符)       屬於EASY NAMING
Connected.

SQL> conn xh/a831115@(description=(address=(protocol=tcp)(host=6688-621)(port=1521)
)(connect_data=(sid=orcl)))
已連線。

LOCAL NAMING 就是 都放入 TNSNAME。ORA

SQLNET。ORA

SQLNET.AUTHENTICATION_SERVICES= (NTS)~~可以控制/ AS SYSDBA(會有單獨實驗詳細介紹 AS SYSDBA)

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT) 這個是允許CLIENT連線的方式

若 TNSNAMES去掉
C:\>sqlplus xh/a831115@xh

SQL*Plus: Release 10.1.0.2.0 - Production on 星期三 8月 12 15:56:32 2009

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

ERROR:
ORA-12154: TNS:could not resolve the connect identifier specified

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~幾個檢查
C:\>PING 192.168.1.126~~~~~~~~~~~~網路

Pinging 192.168.1.126 with 32 bytes of data:

Reply from 192.168.1.126: bytes=32 time<1ms TTL=128
Reply from 192.168.1.126: bytes=32 time<1ms TTL=128
Reply from 192.168.1.126: bytes=32 time<1ms TTL=128
Reply from 192.168.1.126: bytes=32 time<1ms TTL=128

Ping statistics for 192.168.1.126:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms


C:\>tnsping xh~~~~~~~~~oracle層的檢查

TNS Ping Utility for 32-bit Windows: Version 10.1.0.2.0 - Production on 12-8月 -
2009 15:58:55

Copyright (c) 1997, 2003, Oracle.  All rights reserved.

Used parameter files:
E:\oracle\product\10.1.0\Db_1\network\admin\sqlnet.ora


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 6688-621
)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (oracle_sid = orcl)))
OK (50 msec)

若PING通 但TNSPING不通 那麼檢查TNSNAMES.ora or sqlnet.ora中是否禁用TNSNAMES

 

C:\>lsnrctl~~~~控制LISTENER

LSNRCTL for 32-bit Windows: Version 10.1.0.2.0 - Production on 12-8月 -2009 16:0
1:17

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

Welcome to LSNRCTL, type "help" for information.

LSNRCTL> help
The following operations are available
An asterisk (*) denotes a modifier or extended command:

start               stop                status
services            version             reload
save_config         trace               change_password
quit                exit                set*~~~~~~~~~~~~~~還有許多可設定的引數
show*

LSNRCTL> show
The following operations are available after show
An asterisk (*) denotes a modifier or extended command:

rawmode                     displaymode
rules                       trc_file
trc_directory               trc_level
log_file                    log_directory
log_status                  current_listener
inbound_connect_timeout     startup_waittime
snmp_visible                save_config_on_stop 使用查聯機文件就行了

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12020513/viewspace-614293/,如需轉載,請註明出處,否則將追究法律責任。

相關文章