最近看到好多人說到tns或者資料庫不能登入等問題,就索性總結了下面的東東。
首先來說oracle的網路結構,往複雜處說能加上加密、LDAP等等。。這裡不做討論,重點放在基本的網路結構也就是我們最常用的這種情況
三個設定檔
listener.ora、sqlnet.ora、tnsnames.ora ,都是放在$ORACLE_HOME\network\admin目錄下。
重點:三個檔案的作用和使用
#-----------------------
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等並不常用。
#------------------------
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)
)
)