Oracle: listener.ora 、sqlnet.ora 、tnsnames.ora的配置及例子
1.解決問題:TNS或者資料庫不能登入。
最簡單有效方法:使用Oracle系統提供的工具 netca 配置(把原來的刪除掉重新設定)
$netca 2.然而,仍有疑問:如何指定'listener.ora'存放的目錄?不要預設目錄($ORACLE_HOME/network/admin)
在 '.profile' 中加入
- TNS_ADMIN=/f01/oracle11/app/oracle/product/8.0.6/network/admin
- export TNS_ADMIN
3.介紹三個設定檔
1)listener.ora
2)sqlnet.ora
3)tnsnames.ora
此三檔案都是放在$ORACLE_HOME/network/admin目錄下。
1)sqlnet.ora(客戶及伺服器端)
作用類似於linux或者其他unix的nsswitch.conf檔案,通過這個檔案來決定怎麼樣找一個串連中出現的連接字串,
例如我們用戶端輸入
sqlplus sys/oracle@orcl
假如我的sqlnet.ora是下面這個樣子
- SQLNET.AUTHENTICATION_SERVICES= (NTS)
-
- NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME)
那麼,用戶端就會首先在tnsnames.ora檔案中找orcl的記錄,如果沒有相應的記錄則嘗試把orcl當作一個主機名稱,通過網路的途徑去解析它的ip地址然後去串連這個ip上GLOBAL_DBNAME=orcl這個執行個體。當然我這裡orcl並不是一個主機名稱
如果我是這個樣子
- NAMES.DIRECTORY_PATH= (TNSNAMES)
那麼用戶端就只會從tnsnames.ora尋找orcl的記錄
括弧中還有其他選項,如LDAP等並不常用。
2)Tnsnames.ora(客戶及伺服器端)
這個檔案類似於unix 的hosts檔案,提供的tnsname到主機名稱或者ip的對應,只有當sqlnet.ora中類似
NAMES.DIRECTORY_PATH= (TNSNAMES) 這樣,也就是用戶端解析連接字串的順序中有TNSNAMES時,才會嘗試使用這個檔案。
例子中有兩個,ORCL 對應的本機,SALES對應的另外一個IP地址,裡邊還定義了使用主用伺服器還是共用伺服器模式進行串連,一句一句寫如下:
- #你所要串連的時候輸入得TNSNAME
-
- ORCL =
-
- (DESCRIPTION =
-
- (ADDRESS_LIST =
-
- #下面是這個TNSNAME對應的主機,連接埠,協議
-
- (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
-
- )
-
- (CONNECT_DATA =
-
- #使用專用伺服器模式去串連需要跟伺服器的模式比對,如果沒有就根據伺服器的模式
-
- #自動調節
-
- (SERVER = DEDICATED)
-
- #對應service_name,SQLPLUS>show parameter service_name;
-
- #進行查看
-
- (SERVICE_NAME = orcl)
-
- )
-
- )
-
- #下面這個類似
-
- SALES =
-
- (DESCRIPTION =
-
- (ADDRESS_LIST =
-
- (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.188.219)(PORT = 1521))
-
- )
-
- (CONNECT_DATA =
-
- (SERVER = DEDICATED)
-
- (SERVICE_NAME = sales)
-
- )
-
- )
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_HOME和GLOBAL_DBNAME
-
- #其中GLOBAL_DBNAME不是必需的除非使用HOSTNAME做資料庫連接
-
- SID_LIST_LISTENER =
-
- (SID_LIST =
-
- (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))
-
- )
上面的例子是一個最簡單的例子,但也是最普遍的。一個listener進程為一個instance(SID)提供服務。