oracle listener.ora sqlnet.ora tnsnames.ora 三個檔案的關聯性

gdutllf2006發表於2009-09-26

Environment:  linux + oracle9i
原文地址: http://blog.chinaunix.net/u1/54041/showart_427389.html

一 oracle listener.ora sqlnet.ora tnsnames.ora 三個檔案的關聯性

首先來說Oracle的網路結構,三個配置檔案listener.ora、sqlnet.ora、tnsnames.ora ,都是放在$ORACLE_HOME\network\admin目錄下。  
重點:三個檔案的作用和使用
1 sqlnet.ora
作用類似於linux或者其他unix的nsswitch.conf檔案,透過這個檔案來決定怎麼樣找一個連線中出現的連線字串(service_name),
例如我們客戶端輸入  
sqlplus   
假如我的sqlnet.ora是下面這個樣子  

SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME)  

那麼,客戶端就會首先在tnsnames.ora檔案中找demo的記錄.如果沒有相應的記錄則嘗試把demo當作一個主機名,透過網路的途徑(hosts文

件)去解析它的ip地址然後去連線這個ip地址上GLOBAL_DBNAME=demo這個例項,當然我這裡demo並不是一個主機名
  
另一種情況:如果是這樣

NAMES.DIRECTORY_PATH= (TNSNAMES)

那麼客戶端就只會從tnsnames.ora查詢demo的記錄,括號中還有其他選項,如LDAP等並不常用。  

2 Tnsnames.ora
這個檔案類似於unix 的hosts檔案,提供的tnsname到主機名或者ip的對應,只有當sqlnet.ora中類似
NAMES.DIRECTORY_PATH= (TNSNAMES)
這樣,也就是客戶端解析連線字串的順序中有TNSNAMES是,才會嘗試使用這個檔案。  
下面例子中有兩個,demo 對應的本機,SALES對應的另外一個IP地址,裡邊還定義了使用主用伺服器還是共享伺服器模式進行連線.  
#你所要連線的時候輸入得TNSNAME
demo =

(DESCRIPTION =

(ADDRESS_LIST =

#下面是這個TNSNAME對應的主機,埠,協議

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.176 )(PORT = 1521))

)
  
(CONNECT_DATA =

#使用專用伺服器模式去連線需要跟伺服器的模式匹配,如果沒有就根據伺服器的模式

#自動調節

(SERVER = DEDICATED)

#對應service_name,SQLPLUS>show parameter service_name;

#進行檢視

(SERVICE_NAME = demo)

)
  
)

#下面這個類似

SALES =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.176)(PORT = 1521))

)

(CONNECT_DATA =

(SERVER = DEDICATED)
  
(SERVICE_NAME = sales)

)

)

客戶端完了我們來看伺服器端, sqlnet.ora, tnsnames.ora 都是客戶端檔案.

3 listener.ora

listener監聽器程式的配置檔案  
  關於listener程式就不多說了,接受遠端對資料庫的接入申請並轉交給oracle的伺服器程式。所以如果不是使用的遠端的連線,listener

程式就不是必需的,同樣的如果關閉listener程式並不會影響已經存在的資料庫連線。
  
Listener.ora檔案的例子
#listener.ora
#/u01/app/oracle/product/9.2.0/network/admin/listener.ora
  
# Generated by Oracle configuration tools.

#下面定義LISTENER程式為哪個例項提供服務

#這裡是demo,並且它對應的ORACLE_HOME和GLOBAL_DBNAME

#其中GLOBAL_DBNAME不是必需的除非使用HOSTNAME做資料庫連線
  
 SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /u01/app/oracle/product/9.2.0)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = mydb)
      (ORACLE_HOME = /u01/app/oracle/product/9.2.0)
      (SID_NAME = mydb)
    )
  )
#監聽器的名字,一臺資料庫可以有不止一個監聽器  
#再向下面是監聽器監聽的協議,ip,埠等,這裡使用的tcp1521埠,並且使用的是主機名
  
 LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST =  redhat )(PORT = 1521))
      )
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
      )
    )
  )
  
上面的例子是一個最簡單的例子,但也是最普遍的。一個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 的時候

1. 查詢sqlnet.ora看看名稱的解析方式,發現是TNSNAME
  
2. 則查詢tnsnames.ora檔案,從裡邊找demo的記錄,並且找到主機名,埠和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程式的狀態。

[oracle@redhat admin]$ tnsping demo

TNS Ping Utility for Linux: Version 9.2.0.4.0 - Production on 07-MAY-2004 23:12:53

Copyright (c) 1997 Oracle Corporation.  All rights reserved.

Used parameter files:
/u01/app/oracle/product/9.2.0/network/admin/sqlnet.ora


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.176)(PORT = 1521)))

(CONNECT_DATA = (SERVICE_NAME = demo)))
OK (20 msec)
  
SQL>show sga 檢視instance是否已經啟動
  
SQL> select open_mode from v$database; 檢視資料庫是開啟還是mount狀態。
  
OPEN_MODE
  
----------
  
READ WRITE
  

 

三 使用hostname訪問資料庫而不是tnsname的例子(沒做成功??)


  
使用tnsname訪問資料庫是預設的方式,但是也帶來點問題,那就是客戶端都是需要配置tnsnames.ora檔案的。如果你的資料庫伺服器地址發生

改變,就需要重新編輯客戶端這個檔案。透過hostname訪問資料庫就沒有了這個麻煩。
  
需要修改
  
1 編輯伺服器端listener.ora

#LISTENER.ORA Network Configuration File: /u01/app/oracle/product/9.2.0/network/admin/listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /u01/app/oracle/product/9.2.0)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = mydb)
      (ORACLE_HOME = /u01/app/oracle/product/9.2.0)
      (SID_NAME = mydb)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = redhat )(PORT = 1521))
      )
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
      )
    )
  )  

2 編輯hosts檔案
[root@redhat root]# vi /etc/hosts

# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1       localhost
192.168.1.176   redhat

 

3 編輯客戶端sqlnet.ora 如果確認不會使用TNSNAME訪問的話,可以去掉TNSNAMES
  
# sqlnet.ora Network Configuration File:
  
# Generated by Oracle configuration tools.
  
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (HOSTNAME)

4 不配置Tnsnames.ora檔案,刪除也無所謂。

下面就是網路和作業系統的配置問題了,怎麼樣能夠解析我的主機名的問題了

可以透過下面的方式連線

sqlplus   
這個redhat是主機名
這樣的話,會連線redhat這臺伺服器,並且由listener來確定你所要連線的service_name。

[oracle@redhat oracle]$ sqlplus

SQL*Plus: Release 9.2.0.4.0 - Production on Fri May 7 23:54:49 2004

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

ERROR:
ORA-12514: TNS:listener could not resolve SERVICE_NAME given in connect
descriptor
不成功
???????????????????????????????????????

 

常見故障解決辦法:

TNS-12154 (ORA-12154):TNS:could not resolve service name

該錯誤表示用於連線的網路服務名在tnsnames.ora檔案中不存在.

sql*plus執行基本機理:

在使用者輸入sqlplus 後,sqlplus程式會自動到sqlnet.ora檔案中找NAMES.DEFAULT_DOMAIN引數,假如該引數存在,則將該引數中的值取出,加到網路服務名的後面,即此例中你的輸入由sqlplus  自動變為sqlplus ,然後再到tnsnames.ora檔案中找demo.server.com網路服務名,這當然找不到了,因為該檔案中只有demo網路服務名,所以報錯。解決的辦法就是將sqlnet.ora檔案中的NAMES.DEFAULT_DOMAIN引數註釋掉即可,

如 #NAMES.DEFAULT_DOMAIN = server.com。假如NAMES.DEFAULT_DOMAIN引數不存在,則sqlplus程式會直接到tnsnames.ora檔案中找 demo網路服務名,然後取出其中的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

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

相關文章