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。解決的辦法為:
可以在sqlnet.ora檔案中設定NAMES.DEFAULT_DOMAIN= testserver.com,這時你可以用test或test.testserver.com串連資料庫
在sqlnet.ora檔案中不設定NAMES.DEFAULT_DOMAIN參數,在tnsnames.ora檔案中將 test.testserver.com中的.testserver.com去掉,這時你可以用test串連資料庫