Oracle配置文件詳解 listener.ora,sqlnet.ora,tnames.ora

三個配置文件 
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並不是一個主機名 
假如sqlnet.ora是這個樣子
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)提供服務。 
監聽器的操作命令 
$oracle_home/bin/lsnrctl start,其他諸如stop,status等。具體敲完一個lsnrctl後看幫助。
上面說到的三個文件都可以通過圖形的配置工具來完成配置 
$oracle_home/netca   嚮導形式的 
$oracle_home/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狀態。
然後就是平時排錯可能會用到的 
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。 
當然還有另外一個解決辦法,那就是不要用域用戶登陸安裝oracle,使用本機用戶,呵呵!
安裝oracle遇到"未初始化服務句柄錯誤" 
試用以下解決方法: 
修改sqlnet.ora中的sqlnet.authentication_services= none
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章