listener.ora、sqlnet.ora、tnsnames.ora的關係以及手工配置舉例

ysping發表於2009-08-05

listener.ora--sqlnet.ora--tnsnames.ora的關係以及手工配置舉例

最近看到好多人說到tns或者資料庫不能登入等問題,就索性總結了下面的文件。
  
  首先來說Oracle的網路結構,往復雜處說能加上加密、LDAP等等。。這裡不做討論,重點放在基本的網路結構也就是我們最常用的這種情況
  
  三個配置檔案
  
  listener.ora、sqlnet.ora、tnsnames.ora ,都是放在$ORACLE_HOMEnetworkadmin目錄下。

[@more@]

  
  重點:三個檔案的作用和使用
  
  #-----------------------
  
  sqlnet.ora-----作用類似於linux或者其他unix的nsswitch.conf檔案,透過這個檔案來決定怎麼樣找一個連線中出現的連線字串,例如我們客戶端輸入
  
  sqlplus

  假如我的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等並不常用。

意即客戶端的sqlnet.ora 中的
name.directory_path說明連線的字串是基於主機命名還是本地命名方法。如果是主機命名
scott/tiger@aaa 這個aaa 就是目標主機的名字,
如果是本地命名,這個aaa 就要到tnsname.ora 檔案中獲取具體的連線資訊。

如果oracle伺服器端,$ORACLE_HOME/network/admin/下,沒有sqlnet.ora檔案,也能正常通訊,此時使用預設值,即$ORACLE_HOME/network/admin/sample/sqlnet.ora。

The sqlnet.ora is an optional file expressing more parameters about the connection (eg: the trace level for debugging, the types of authentication you would like to support and so on). It may be found on the client or the server.

if not exists, use the default value, you can get the default value from $ORACLE_HOME/network/admin/sample/sqlnet.ora
  
  #------------------------
  
  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)
  
  )
  
  )
  
  #----------------------
  
  客戶端完了我們來看伺服器端
  
  listener.ora------listener監聽器程式的配置檔案
  
  關於listener程式就不多說了,接受遠端對資料庫的接入申請並轉交給oracle的伺服器程式。所以如果不是使用的遠端的連線,listener程式就不是必需的,同樣的如果關閉listener程式並不會影響已經存在的資料庫連線。
  
  Listener.ora檔案的例子
  
  #listener.ora Network Configuration File: #E:oracleproduct10.1.0Db_2NETWORKADMINlistener.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:oracleproduct10.1.0Db_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 的時候
  
  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 這種方式需要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
  
  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:oracleproduct10.1.0Db_2networkadminsqlnet.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:oracleproduct10.1.0db_1NETWORKADMINlistener.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:oracleproduct10.1.0db_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:oracleproduct10.1.0db_1NETWORKADMINsqlnet.ora
  
  # Generated by Oracle configuration tools.
  
  SQLNET.AUTHENTICATION_SERVICES= (NTS)
  
  NAMES.DIRECTORY_PATH= (HOSTNAME)
  
  tnsnames.ora檔案不需要配置,刪除也無所謂。
  
  下面就是網路和作業系統的配置問題了,怎麼樣能夠解析我的主機名的問題了
  
  可以透過下面的方式連線
  
  sqlplus
  
  這樣的話,會連線boway這臺伺服器,並且listener來確定你所要連線的service_name。

在安裝目錄下,如:E:OracleOra81networkADMIN下用寫字板或記事本開啟TNSNAME.ORA檔案,檔案內容大概如下:
  TEST.SOFTONE.COM =
  (DESCRIPTION =
  (ADDRESS_LIST =
  (ADDRESS = (PROTOCOL = TCP)(HOST = zcb_8115)(PORT = 1521))
  )
  (CONNECT_DATA =
  (SERVICE_NAME = test)
  )
  )
  藍色部分為安裝時錄入的資訊。
  如果該檔案沒有配置成功,該檔案可透過以下步驟進行配置:
  1)、在程式選單中開啟NET8 CONFIGURATION ASSISTANT
  2)、選擇Net8 Configuration Assistant,開啟,進入"Net8 Configuration Assistant:歡迎"視窗
  2)、選擇"本地網路服務名設定",點選"下一步", 彈出以下窗體;
  3)、在"Net8 Configuration Assistant:網路服務名配置"視窗中選擇"新增",點選"下一步", 彈出以下窗體;
  4)在"Net8 Configuration Assistant:網路服務名配置,資料庫版本"視窗中選擇"ORACLE 8I資料庫或服務",點選"下一步",彈出以下窗體;
  5)在"Net8 Configuration Assistant:網路服務名配置,服務名"視窗輸入服務名,此服務名跟安裝時錄入的服務名(SID)相同,錄入後,點選"下一步",彈出以下窗體;
  6)、在"Net8 Configuration Assistant:網路服務名配置,請選擇協議"視窗選擇"TCP"此時只能選擇"TCP",點選"下一步", 彈出以下窗體;
  7)在"Net8 Configuration Assistant:網路服務名配置,TCP/IP協議"視窗輸入主機名(如果連線本地資料庫,則錄入本地計算機名,如果連線遠端資料庫,則錄入遠端計算機名),選擇預設的"請使用標準埠號1521"(建議最好不要修改),點選"下一步",彈出以下窗體;
  8)、在"Net8 Configuration Assistant:網路服務名配置,測試"視窗選擇"是,進行測試",點選"下一步",彈出以下窗體;
  9)、當"Net8 Configuration Assistant:網路服務名配置,正在連線"視窗對話方塊中出現提示"正在連線….測試成功"資訊,表示測試透過。此時點選"下一步",進入"Net8 Configuration Assistant: 網路服務名配置,網路服務名"視窗;
  10)、在"Net8 Configuration Assistant:網路服務名配置,網路服務名"視窗輸入網路服務名,服務名為ORACLE連線串,可任意錄入,如:test,點選"下一步",彈出以下窗體;
  11)、在"Net8 Configuration Assistant:網路服務名配置,是否需要另一個網路服務名"視窗中選擇"否",點選"下一步",進入"網路服務名配置完成" 視窗;
  12)、在"網路服務名配置完成"視窗中點選"下一步",彈出以下窗體;
  13)、在"歡迎"視窗點選"完成",退出配置過程
  TNSNAMES.ORA配置完成後,再配置BDE(BDE如何配置略),可透過BDE、PLSQL、SQL EXPLORER和TNSPING命令來測試ORACLE是否連線正確。下面用TNSPING來測試是否連線。
  在命令提示符下錄入: TNSPING TEST.SOFTONE.COM

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

相關文章