深入理解監聽

zzt0605發表於2011-08-31

今天上班第二天,發現一個很奇怪的問題。主管發給了我一個tnsname.ora檔案,

我用pl/sq developer可以登入 。但使用IP不能連線遠端資料庫,只能使用連線串。

 

sqlplus user/4567@10.10.143.148:1521/crmbcv4

 

SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 8 31 16:36:06 2011

 

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

 

ERROR:

ORA-12154: TNS: 無法解析指定的連線識別符號

 

 

在群裡問了一下,小路講使用這種格式可用

sqlplus username/password@連線串

 

試了一下,解決了。

小頑童猜測他們的tnsname.ora設定裡面沒有我機器的IP地址。所以你用IP地址的方式連不上去。

 

最後查了一些資料,把筆記裡的資料重新整理了一下。如下:

 

sqlnet.ora,tnsnames.ora,另外還有listener.ora,都是放在$ORALCE_HOME\network\admin目錄下。

sqlnet.ora 用在oracle client端,用於配置連線服務端oracle的相關引數.

tnsnames.ora 用在oracle client端,使用者配置連線資料庫的別名引數

listener.ora 用在oracle server端,配置oracle服務端程式的監聽引數

 

sqlnet.ora 類似於作業系統的/etc/netsvc.conf檔案,裡面對解析的優先順序進行編排

tnsname.ora類似於作業系統的/etc/hosts檔案,本地將TNS名解析為目標IP地址及Service-Name

listener.ora類似於作業系統的/etc/services檔案,裡面定義了監聽的埠、服務名等

 

 

1.1.1.      sqlnet.ora(客戶端)

通過這個檔案來決定怎樣找一個連線中出現的連線字串。例如我們客戶端鍵入

sqlplus test/test@orcl,如果sqlnet.ora是下面這樣:

 

NAMES.DEFAULT_DOMAIN = localdomain

NAMES.DIRECTORY_PATH= (TNSNAMES, ONAMES, HOSTNAME)

 

& 說明

NAMES.DEFAULT_DOMAIN 指定網路域名。

NAMES.DIRECTORY_PATH指定當解析客戶端連線識別符號時命名方法(naming metthods)採用的優先順序從左至右遞減在 CAMS 應用中。

這兩個引數採用上述所示的系統預設值。

 

示例檔案:

# sqlnet.ora Network Configuration File: D:\oracle\product\10.2.0\db_1\network\admin\sqlnet.ora

# Generated by Oracle configuration tools.

 

# This file is actually generated by netca. But if customers choose to

# install "Software Only", this file wont exist and without the native

# authentication, they will not be able to connect to the database on NT.

 

SQLNET.AUTHENTICATION_SERVICES= (NTS)

 

NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME, ONAMES)

 

SQLNET.AUTHENTICATION_SERVICES= (NTS)

這個表示採用OS認證,在資料庫伺服器上,可以利用sqlplus / as sysdba

一般這個配置在windows上是ok的,在unix環境下可能會有問題,一般在unix下可以去掉這個配置。

NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME, ONAMES)

表示將首先利用tnsnames進行解析;如果tnsnames解析不到,將使用hostname通過網路的途徑解析IP;如果hostname解析不到,將採用onames進行解析;例如我們客戶端輸入:sqlplus test1/test1@test ,那麼,客戶端就會首先在tnsnames.ora檔案中找orcl的記錄.

如果沒有相應的記錄則嘗試把orcl當作一個主機名,通過網路的途徑去解析它的IP地址然後去連線這個IPglobal_name=test這個例項,當然我這裡orcl並不是一個主機名。

 

10gNAMES.DIRECTORY_PATH增加了EZCONNECT。使用EZCONNECT必須滿足以下要求:

1.oracle net servieces 10g必須安裝在客戶端

2.客戶端以及伺服器必須支援TCP/IP,並啟用

3.不允許高階連線描述特性,如:連線池

方法示例:connect scott/tiger@hostname:port/servicename

 

ORA-12514一個很常見的原因是NAMES.DIRECTORY_PATH漏了TNSNAMES,可能是Oracle Net Configuration 時少選了Oracle Names選項。

 

1.1.2.      Tnsnames.ora 客戶端

這個檔案放在客戶端機器上,記錄客戶端訪問資料庫的本地配置,其實就是定義網路服務,只有當sqlnet.ora中有"NAMES.DIRECTORY_PATH= (TNSNAMES)"這樣的字樣時,也就是客戶端解析連線字串的順序中有TNSNAMES時,才會嘗試使用這個檔案。

 

示例檔案:

# TNSNAMES.ORA Network Configuration File: D:\oracle\fullOracle\network\admin\tnsnames.ora

# Generated by Oracle configuration tools.

 

test_link =                     //網路服務名

(DESCRIPTION =

     (ADDRESS_LIST =

       (ADDRESS = (PROTOCOL = TCP)(HOST = 108.108.108.108)(PORT = 1521))

       //訪問資料庫使用的協議,資料庫計算機的主機名或IP地址,資料庫的埠號

     )

      (CONNECT_DATA =

        (SID = test)                      //資料庫例項名

        (SERVER = DEDICATED)

        (SERVICE_NAME = test)

      )

)

 

protocol一般為TCP,HOST可以為IP,可以是可Ping的通的主機名,Service_Name = orcl 是伺服器的SIDServer = ? 可分為共享伺服器和專用伺服器兩種體系結構。共享伺服器依靠排程程式服務處理來自客戶端的連線請求,單個排程程式可以同時為多個客戶機連線提供服務。而專用伺服器程式不要求客戶端共享任何資源,一個session啟動一個process

 

 

1.1.3.      listener.ora(伺服器端)

它是listener監聽器程式的配置檔案。關於listener程式就不多說了,接受遠端對資料庫的接入申請並轉交給oracle的伺服器程式。所以如果不是使用的遠端的連線,listener程式就不是必需的,同樣的如果關閉listener程式並不會影響已經存在的資料庫連線。

  

Listener.ora檔案的例子

#listener.ora Network Configuration File: #E:\oracle\product\10.1.0\Db_2\NETWORK\ADMIN\listener.ora

# Generated by Oracle configuration tools.

#下面定義LISTENER程式為哪個例項提供服務

#這裡是ORCL,並且它對應的ORACLE_HOMEGLOBAL_DBNAME

#其中GLOBAL_DBNAME不是必需的除非使用HOSTNAME做資料庫連線

 

SID_LIST_LISTENER =

(SID_LIST =                    //這裡定義LISTENER程式為哪個例項提供服務

(SID_DESC =

(GLOBAL_DBNAME = boway)

(ORACLE_HOME = E:\oracle\product\10.1.0\Db_2)

(SID_NAME = ORCL)

)

)

 

#監聽器的名字,一臺資料庫可以有不止一個監聽器

#再向下面是監聽器監聽的協議,ip,埠等,這裡使用的tcp1521埠,並且使#用的是主機名

LISTENER =

 (DESCRIPTION =

ADDRESS = (PROTOCOL = TCP)(HOST = boway)(PORT = 1521))           //監聽器監聽的協議,IP,埠等

)

  

上面的例子是一個最簡單的例子,但也是最普遍的。一個listener程式為一個instance(SID)提供服務。

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

相關文章