[zt] 理解sqlnet.ora , tnsnames.ora , Listener.ora 檔案

tolywang發表於2009-03-11

oracle網路配置
三個配置檔案 listener.ora、sqlnet.ora、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是,才會嘗試使用這個檔案。
PROTOCOL:客戶端與伺服器端通訊的協議,一般為TCP,該內容一般不用改。
HOST:資料庫偵聽所在的機器的機器名或IP地址,資料庫偵聽一般與資料庫在同一個機器上,所以當我說資料庫偵聽所在的機器一般也是指資料庫所在的機 器。在UNIX或WINDOWS下,可以透過在資料庫偵聽所在的機器的命令提示符下使用hostname命令得到機器名,或透過ipconfig(for WINDOWS) or ifconfig(for UNIX)命令得到IP地址。需要注意的是,不管用機器名或IP地址,在客戶端一定要用ping命令ping通資料庫偵聽所在的機器的機器名,否則需要在 hosts檔案中加入資料庫偵聽所在的機器的機器名的解析。
PORT:資料庫偵聽正在偵聽的埠,可以察看伺服器端的listener.ora檔案或在資料庫偵聽所在的機器的命令提示符下透過lnsrctl status [listener name]命令察看。此處Port的值一定要與資料庫偵聽正在偵聽的埠一樣。
SERVICE_NAME:在伺服器端,用system使用者登陸後,sqlplus> show parameter service_name命令察看。
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)
)
)
注意:如果資料庫伺服器用MTS,客戶端程式需要用database link時最好明確指明客戶端用dedicated直連方式,不然會遇到很多跟分散式環境有關的ORACLE BUG。一般情況下資料庫伺服器用直接的連線會好一些,除非你的實時資料庫連線數接近1000。

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)提供服務。
監聽器的操作命令
$ORACLE_HOME/bin/lsnrctl start,其他諸如stop,status等。具體敲完一個lsnrctl後看幫助。

上面說到的三個檔案都可以透過圖形的配置工具來完成配置
$ORACLE_HOME/netca 嚮導形式的
$ORACLE_HOME/netmgr
本人比較習慣netmgr,
profile 配置的是sqlnet.ora也就是名稱解析的方式
service name 配置的是tnsnames.ora檔案
listeners配置的是listener.ora檔案,即監聽器程式
具體的配置可以嘗試一下然後來看一下配置檔案。

這樣一來總體結構就有了,是
當你輸入sqlplus sys/oracle@orcl的時候
1. 查詢sqlnet.ora看看名稱的解析方式,發現是TNSNAME
2. 則查詢tnsnames.ora檔案,從裡邊找orcl的記錄,並且找到主機名,埠和service_name
3. 如果listener程式沒有問題的話,建立與listener程式的連線。
4. 根據不同的伺服器模式如專用伺服器模式或者共享伺服器模式,listener採取接下去的動作。預設是專用伺服器模式,沒有問題的話客戶端就連線上了資料庫的server process。
5. 這時候網路連線已經建立,listener程式的歷史使命也就完成了。

#---------------
幾種連線用到的命令形式
1.sqlplus / as sysdba 這是典型的作業系統認證,不需要listener程式
2.sqlplus sys/oracle 這種連線方式只能連線本機資料庫,同樣不需要listener程式
3.sqlplus sys/oracle@orcl 這種方式需要listener程式處於可用狀態。最普遍的透過網路連線。
以上連線方式使用sys使用者或者其他透過密碼檔案驗證的使用者都不需要資料庫處於可用狀態,作業系統認證也不需要資料庫可用,普通使用者因為是資料庫認證,所以資料庫必需處於open狀態。
init.ora中的Remote_Login_Passwordfile對身份驗證的影響
三個可選值:
NONE:預設值,指示Oracle系統不使用密碼檔案,透過作業系統進行身份驗證的特權使用者擁有SYSORA和SYSOPER許可權
EXCLUSIVE:
1.表示只有一個資料庫例項可以使用密碼檔案
2.允許將SYSORA和SYSOPER許可權賦值給SYS以外的其它使用者
SHARED:
1.表示可以有多個資料庫例項可以使用密碼檔案
2.不允許將SYSORA和SYSOPER許可權賦值給SYS以外的其它使用者
所以,如果要以作業系統身份登入,Remote_Login_Passwordfile應該設定為NONE
當登入使用者不是ORA_DBA組和ORA_OPER組成員時,登入資料庫需要在Oracle中建立當前作業系統使用者相同的使用者名稱,如果當前使用者是域用 戶,則名稱為:domainname\yourname,如果是本地計算機使用者,則名稱為:computername\yourname
建立方法:
create "domainname\yourname" identified externally;
作業系統,修改HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0下面新增AUTH_PREFIX_DOMAIN,值設為FALSE,在建立Oracle使用者時可以忽略 掉域名
這種方式下,init.ora中有一個引數將影響資料庫如何匹配一個windows使用者和Oracle使用者os_authent_prefix = ""
預設為空,Oracle8i以前,無該引數,而使用OPS$作為使用者名稱字首.(Oracle使用者名稱最大長度限制為30個字元)

關於域名(主機名)解析
/etc/hosts (UNIX)
或者windows\hosts(WIN98) winnt\system32\drivers\etc\hosts (WIN2000)
客戶端需要寫入資料庫伺服器IP地址和主機名的對應關係。

127.0.0.1 localhost
192.168.0.35 oracledb oracledb
192.168.0.45 tomcat tomcat
202.84.10.193 bj_db bj_db

有些時候我們配置好第一步後,tnsping 資料庫伺服器別名顯示是成功的,
但是sqlplus username/password@servicename不通,jdbc thin link 也不通的時候,
一定不要忘了在客戶端做這一步,原因可能是DNS伺服器裡沒有設定這個伺服器IP地址和主機名的對應關係。
如果同時有私有IP和Internet上公有IP,私有IP寫在前面,公有IP寫在後面。
編輯前最好留一個備份,增加一行時也最好用複製貼上,避免編輯hosts時空格或者tab字元錯誤。

UNIX下ORACLE多資料庫的環境,OS客戶端需要配置下面兩個環境變數
ORACLE_SID=appdb;export ORACLE_SID
TWO_TASK=appdb;export TWO_TASK
來指定預設的目標資料庫

#-------------
平時排錯可能會用到的
1.lsnrctl status檢視伺服器端listener程式的狀態
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>; status
:em11:
2.tnsping 檢視客戶端sqlnet.ora和tnsname.ora檔案的配置正確與否,及對應的伺服器的listener程式的狀態。
C:\>tnsping orcl
TNS Ping Utility for 32-bit Windows: Version 10.1.0.2.0 - Production on 16-8月 -
2005 09:36:08
Copyright (c) 1997, 2003, Oracle. All rights reserved.
Used parameter files:
E:\oracle\product\10.1.0\Db_2\network\admin\sqlnet.ora

Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = 127.0.0.1)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_
NAME = orcl)))
OK (20 msec)
3.
SQL>;show sga 檢視instance是否已經啟動
SQL>; select open_mode from v$database; 檢視資料庫是開啟還是mount狀態。
OPEN_MODE
----------
READ WRITE


使用hostname訪問資料庫而不是tnsname的例子
使用tnsname訪問資料庫是預設的方式,但是也帶來點問題,那就是客戶端都是需要配置tnsnames.ora檔案的。如果你的資料庫伺服器地址發生改變,就需要重新編輯客戶端這個檔案。透過hostname訪問資料庫就沒有了這個麻煩。
需要修改
伺服器端listener.ora
#監聽器的配置檔案listener.ora
#使用host naming則不再需要tnsname.ora檔案做本地解析
# listener.ora Network Configuration File: d:\oracle\product\10.1.0\db_1\NETWORK\ADMIN\listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
# (SID_NAME = PLSExtProc)
(SID_NAME = orcl)
(GLOBAL_DBNAME = boway)
(ORACLE_HOME = d:\oracle\product\10.1.0\db_1)
# (PROGRAM = extproc)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = boway)(PORT = 1521))
)
)
客戶端sqlnet.ora 如果確認不會使用TNSNAME訪問的話,可以去掉TNSNAMES
# sqlnet.ora Network Configuration File: d:\oracle\product\10.1.0\db_1\NETWORK\ADMIN\sqlnet.ora
# Generated by Oracle configuration tools.
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (HOSTNAME)
Tnsnames.ora檔案不需要配置,刪除也無所謂。
下面就是網路和作業系統的配置問題了,怎麼樣能夠解析我的主機名的問題了
可以透過下面的方式連線
sqlplus sys/oracle@boway
這樣的話,會連線boway這臺伺服器,並且listener來確定你所要連線的service_name
常見故障解決辦法:
TNS-12154 (ORA-12154):TNS:could not resolve service name
該錯誤表示用於連線的網路服務名在tnsnames.ora檔案中不存在,如上面的tnsnames.ora中的網路服務名只有test,假如使用者在連線時用sqlplus system/manager@test1則就會給出TNS-12154錯誤。
要注意的是,有時即使在tnsnames.ora檔案中有相應的網路服務名,可是用該網路服務名連線時還會出錯,出現這種情況的典型配置如下(在客戶端的機器上):
sqlnet.ora檔案:
NAMES.DIRECTORY_PATH = (TNSNAMES, ….)
NAMES.DEFAULT_DOMAIN = server.com
tnsnames.ora檔案:
test =
(DESCRIPTION=
(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=testserver)(PORT=1521))
)
(CONNECT_DATA=(SERVICE_NAME=orcl.testserver.com)
)
)
sql*plus執行基本機理:
在使用者輸入sqlplus system/manager@test後,sqlplus程式會自動到sqlnet.ora檔案中找NAMES.DEFAULT_DOMAIN引數,假 如該引數存在,則將該引數中的值取出,加到網路服務名的後面,即此例中你的輸入由sqlplus system/manager@test自動變為sqlplus system/manager@test.server.com ,然後再到tnsnames.ora檔案中找test.server.com網路服務名,這當然找不到了,因為該檔案中只有test網路服務名,所以報 錯。解決的辦法就是將sqlnet.ora檔案中的NAMES.DEFAULT_DOMAIN引數註釋掉即可,如 #NAMES.DEFAULT_DOMAIN = server.com。假如NAMES.DEFAULT_DOMAIN引數不存在,則sqlplus程式會直接到tnsnames.ora檔案中找 test網路服務名,然後取出其中的host,port,tcp,service_name,利用這些資訊將連線請求傳送到正確的資料庫伺服器上。
另外原則上tnsnames.ora中的配置不區分大小寫,但是我的確遇到區分大小寫的情況,所以最好將使用的網路服務與tnsnames.ora中配置的完全一樣。
ORA-12514: TNS:listener could not resolve SERVICE_NAME given in connect Descriptor.
該錯誤表示能在tnsnames.ora中找到網路服務名,但是在tnsnames.ora中指定的SERVICE_NAME與伺服器端的 SERVICE_NAME不一致。解決的辦法是修改tnsnames.ora中的SERVICE_NAME。
易混淆術語介紹:
Db_name:對一個資料庫(Oracle database)的唯一標識,該資料庫為Oracle database。這種表示對於單個資料庫是足夠的,但是隨著由多個資料庫構成的分散式資料庫的普及,這種命令資料庫的方法給資料庫的管理造成一定的負 擔,因為各個資料庫的名字可能一樣,造成管理上的混亂。為了解決這種情況,引入了Db_domain引數,這樣在資料庫的標識是由Db_name和 Db_domain兩個引數共同決定的,避免了因為資料庫重名而造成管理上的混亂。這類似於互連網上的機器名的管理。我們將Db_name和 Db_domain兩個引數用’.’連線起來,表示一個資料庫,並將該資料庫的名稱稱為Global_name,即它擴充套件了Db_name。 Db_name引數只能由字母、數字、’_’、’#’、’$’組成,而且最多8個字元。
Db_domain:定義一個資料庫所在的域,該域的命名同網際網路的’域’沒有任何關係,只是資料庫管理員為了更好的管理分散式資料庫而根據實際情況決定的。當然為了管理方便,可以將其等於網際網路的域。
Global_name:對一個資料庫(Oracle database)的唯一標識,oracle建議用此種方法命令資料庫。該值是在建立資料庫是決定的,預設值為Db_name. Db_domain。在以後對引數檔案中Db_name與Db_domain引數的任何修改不影響Global_name的值,如果要修改 Global_name,只能用ALTER DATABASE RENAME GLOBAL_NAME TO 命令進行修改,然後修改相應引數。
Service_name:該引數是oracle8i新引進的。在8i以前,我們用SID來表示標識資料庫的一個例項,但是在Oracle的並行環境中, 一個資料庫對應多個例項,這樣就需要多個網路服務名,設定繁瑣。為了方便並行環境中的設定,引進了Service_name引數,該引數對應一個資料庫, 而不是一個例項,而且該引數有許多其它的好處。該引數的預設值為Db_name. Db_domain,即等於Global_name。一個資料庫可以對應多個Service_name,以便實現更靈活的配置。該引數與SID沒有直接關 系,即不必Service name 必須與SID一樣。
Net service name:網路服務名,又可以稱為資料庫別名(database alias)。是客戶端程式訪問資料庫時所需要,遮蔽了客戶端如何連線到伺服器端的細節,實現了資料庫的位置透明的特性。
如何利用配置的網路服務名連線到資料庫:
用sqlplus程式透過test網路服務名進行測試,如sqlplus system/manager@test。如果不能連線到資料庫,則在tnsname.ora檔案中的test網路服務名(net service)後面加上Oracle資料庫的DB_Domain引數值,透過用sqlplus> show parameter db_domain命令察看。此處db_domain引數值為testserver.com,將其加到網路服務名後面,修改後的tnsname.ora中 關於該網路服務名的內容為:


應該改為:
如何利用配置的網路服務名連線到資料庫:
用sqlplus程式透過test網路服務名進行測試,如sqlplus system/manager@test。如果不能連線到資料庫,則在tnsname.ora檔案中的test網路服務名(net service)後面加上sqlnet.ora檔案中NAMES.DEFAULT_DOMAIN引數的值,此處我的引數值為 testserver.com,將其加到網路服務名後面,修改後的tnsname.ora中關於該網路服務名的內容為:

什麼情況下會引起oracle自動設定NAMES.DEFAULT_DOMAIN引數?
出現這種情況的典型環境為windows的客戶端的‘我得電腦à屬性à計算機名à更改à其它…à此計算機的主DNS字尾’中設定了‘primary dns suffix’,因為在這種情況下安裝客戶端時,會在sqlnet.ora檔案中自動設定NAMES.DEFAULT_DOMAIN引數,或許當把計算機 加入域中安裝oracle客戶端時也會出現這種情況,有條件的話大家可以試一下。

我在設定oracle的客戶端時一般手工修改tnsnames.ora檔案,但是還有許多人喜歡用圖形工具配置,該圖形工具最終還是修改tnsnames.ora檔案,但是它有時會引起其它的問題:
在用oracle的圖形配置軟體''net assistant''或‘Net Configuration Assistant’配置網路服務名時,假如已經設定了‘primary dns suffix’,但是在圖形配置軟體中寫的網路服務名的名字中沒有‘primary dns suffix’,如只是寫了test,則圖形配置軟體會自動在後面加上‘primary dns suffix’,使之變為test.testserver.com,並存在tnsnames.ora中,而不管你的sqlnet.ora檔案中是否有 NAMES.DEFAULT_DOMAIN引數。此時,用圖形工具進行測試連線是透過的,但是假如此時sqlnet.ora檔案中沒有 NAMES.DEFAULT_DOMAIN引數,則你在使用網路服務名時應該使用在tnsnames.ora中的 test.testserver.com,而不是你在圖形配置軟體中鍵入的test。解決的辦法為:
<1>可以在sqlnet.ora檔案中設定NAMES.DEFAULT_DOMAIN= testserver.com,這時你可以用test或test.testserver.com連線資料庫
<2>在sqlnet.ora檔案中不設定NAMES.DEFAULT_DOMAIN引數,在tnsnames.ora檔案中將 test.testserver.com中的.testserver.com去掉,這時你可以用test連線資料庫

 

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

相關文章