tns

 

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/[email protected] ,然後再到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 <db_name.db_domain>命令進行修改,然後修改相應參數。

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連接數據庫 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章